Files
jongryangje/app/Controllers/Admin/Access.php
taekyoungc 4e557d4be1 Initial project import for team collaboration.
Exclude local docs, MCP, and secrets via gitignore.

Made-with: Cursor
2026-03-25 12:05:33 +09:00

141 lines
5.5 KiB
PHP

<?php
namespace App\Controllers\Admin;
use App\Controllers\BaseController;
use App\Models\LocalGovernmentModel;
use App\Models\MemberApprovalRequestModel;
use App\Models\MemberModel;
use Config\Roles;
use App\Models\MemberLogModel;
class Access extends BaseController
{
private MemberLogModel $memberLogModel;
private MemberApprovalRequestModel $approvalModel;
private MemberModel $memberModel;
private Roles $roles;
public function __construct()
{
$this->memberLogModel = model(MemberLogModel::class);
$this->approvalModel = model(MemberApprovalRequestModel::class);
$this->memberModel = model(MemberModel::class);
$this->roles = config('Roles');
}
/**
* 로그인 이력 (기간 조회)
*/
public function loginHistory(): string
{
$start = $this->request->getGet('start');
$end = $this->request->getGet('end');
$builder = $this->memberLogModel->builder();
$builder->select('member_log.*');
$builder->orderBy('mll_regdate', 'DESC');
if ($start !== null && $start !== '') {
$builder->where('mll_regdate >=', $start . ' 00:00:00');
}
if ($end !== null && $end !== '') {
$builder->where('mll_regdate <=', $end . ' 23:59:59');
}
$list = $builder->get()->getResult();
return view('admin/layout', [
'title' => '로그인 이력',
'content' => view('admin/access/login_history', ['list' => $list, 'start' => $start, 'end' => $end]),
]);
}
public function approvals(): string
{
$status = (string) ($this->request->getGet('status') ?? MemberApprovalRequestModel::STATUS_PENDING);
$allowedStatus = [
MemberApprovalRequestModel::STATUS_PENDING,
MemberApprovalRequestModel::STATUS_APPROVED,
MemberApprovalRequestModel::STATUS_REJECTED,
];
if (! in_array($status, $allowedStatus, true)) {
$status = MemberApprovalRequestModel::STATUS_PENDING;
}
$builder = $this->approvalModel->builder();
$builder->select(
'member_approval_request.*, member.mb_id, member.mb_name, member.mb_lg_idx, local_government.lg_name'
);
$builder->join('member', 'member.mb_idx = member_approval_request.mb_idx', 'left');
$builder->join('local_government', 'local_government.lg_idx = member.mb_lg_idx', 'left');
$builder->where('member_approval_request.mar_status', $status);
$builder->orderBy('member_approval_request.mar_requested_at', 'DESC');
$list = $builder->get()->getResult();
return view('admin/layout', [
'title' => '승인 대기',
'content' => view('admin/access/approvals', [
'list' => $list,
'status' => $status,
'roles' => $this->roles,
]),
]);
}
public function approve(int $id)
{
$requestRow = $this->approvalModel->find($id);
if (! $requestRow) {
return redirect()->to(site_url('admin/access/approvals'))->with('error', '승인 요청을 찾을 수 없습니다.');
}
if ($requestRow->mar_status !== MemberApprovalRequestModel::STATUS_PENDING) {
return redirect()->to(site_url('admin/access/approvals'))->with('error', '이미 처리된 요청입니다.');
}
$requestedLevel = (int) $requestRow->mar_requested_level;
if ($requestedLevel === Roles::LEVEL_SUPER_ADMIN) {
return redirect()->to(site_url('admin/access/approvals'))->with('error', 'super admin 역할 요청은 승인할 수 없습니다.');
}
$db = db_connect();
$db->transStart();
$this->memberModel->update((int) $requestRow->mb_idx, [
'mb_level' => $requestedLevel,
]);
$this->approvalModel->update($id, [
'mar_status' => MemberApprovalRequestModel::STATUS_APPROVED,
'mar_processed_at' => date('Y-m-d H:i:s'),
'mar_processed_by' => (int) (session()->get('mb_idx') ?? 0),
'mar_reject_reason' => null,
]);
$db->transComplete();
if (! $db->transStatus()) {
return redirect()->to(site_url('admin/access/approvals'))->with('error', '승인 처리 중 오류가 발생했습니다.');
}
return redirect()->to(site_url('admin/access/approvals'))->with('success', '승인 처리되었습니다.');
}
public function reject(int $id)
{
$requestRow = $this->approvalModel->find($id);
if (! $requestRow) {
return redirect()->to(site_url('admin/access/approvals'))->with('error', '승인 요청을 찾을 수 없습니다.');
}
if ($requestRow->mar_status !== MemberApprovalRequestModel::STATUS_PENDING) {
return redirect()->to(site_url('admin/access/approvals'))->with('error', '이미 처리된 요청입니다.');
}
$reason = trim((string) $this->request->getPost('reject_reason'));
if ($reason === '') {
$reason = '관리자 반려';
}
$this->approvalModel->update($id, [
'mar_status' => MemberApprovalRequestModel::STATUS_REJECTED,
'mar_reject_reason' => mb_substr($reason, 0, 255),
'mar_processed_at' => date('Y-m-d H:i:s'),
'mar_processed_by' => (int) (session()->get('mb_idx') ?? 0),
]);
return redirect()->to(site_url('admin/access/approvals'))->with('success', '반려 처리되었습니다.');
}
}