File manager - Edit - /home/webapp69.cm.in.th/u69319090028/Shop/app/Models/DeleteAccountRequest.php
Back
<?php /** * DeleteAccountRequest Model * Maps to `delete_account_requests` table */ require_once __DIR__ . '/../Core/Model.php'; class DeleteAccountRequest extends Model { protected string $table = 'delete_account_requests'; public function getPendingRequestByUserId(int $userId): ?array { $sql = "SELECT * FROM `delete_account_requests` WHERE `user_id` = :user_id AND `status` = 'pending' ORDER BY `id` DESC LIMIT 1"; return $this->fetchOne($sql, [':user_id' => $userId]); } public function createRequest(int $userId, ?string $reason): int { return $this->insert([ 'user_id' => $userId, 'reason' => $reason, 'status' => 'pending', 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s') ]); } public function cancelRequest(int $requestId, int $userId): bool { $sql = "UPDATE `delete_account_requests` SET `status` = 'cancelled', `updated_at` = NOW() WHERE `id` = :id AND `user_id` = :user_id AND `status` = 'pending'"; $this->query($sql, [':id' => $requestId, ':user_id' => $userId]); return true; } public function countPending(): int { $sql = "SELECT COUNT(*) FROM `delete_account_requests` WHERE `status` = 'pending'"; return (int)$this->db->query($sql)->fetchColumn(); } public function getStatusCounts(): array { $sql = "SELECT `status`, COUNT(*) as cnt FROM `delete_account_requests` GROUP BY `status`"; $rows = $this->db->query($sql)->fetchAll(); $counts = ['pending' => 0, 'approved' => 0, 'rejected' => 0, 'cancelled' => 0]; foreach ($rows as $r) { $counts[$r['status']] = (int)$r['cnt']; } return $counts; } public function getRequests(array $filters = [], int $limit = 20, int $offset = 0): array { [$whereSql, $params] = $this->buildConditions($filters); $sql = "SELECT dar.*, u.username, u.email, u.first_name, u.last_name, u.phone, u.status as user_status, admin_u.username as processed_by_username FROM `delete_account_requests` dar JOIN `users` u ON dar.user_id = u.id LEFT JOIN `users` admin_u ON dar.processed_by = admin_u.id WHERE {$whereSql} ORDER BY CASE WHEN dar.status = 'pending' THEN 0 ELSE 1 END, dar.created_at DESC LIMIT :limit OFFSET :offset"; $stmt = $this->db->prepare($sql); foreach ($params as $k => $v) { $stmt->bindValue($k, $v); } $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); $stmt->bindValue(':offset', $offset, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetchAll(); } public function countRequests(array $filters = []): int { [$whereSql, $params] = $this->buildConditions($filters); $sql = "SELECT COUNT(*) FROM `delete_account_requests` dar JOIN `users` u ON dar.user_id = u.id WHERE {$whereSql}"; $stmt = $this->db->prepare($sql); $stmt->execute($params); return (int)$stmt->fetchColumn(); } public function findWithUser(int $id): ?array { $sql = "SELECT dar.*, u.username, u.email, u.first_name, u.last_name, u.phone, u.status as user_status, admin_u.username as processed_by_username FROM `delete_account_requests` dar JOIN `users` u ON dar.user_id = u.id LEFT JOIN `users` admin_u ON dar.processed_by = admin_u.id WHERE dar.id = :id LIMIT 1"; return $this->fetchOne($sql, [':id' => $id]); } public function approveRequest(int $requestId, int $adminId, ?string $adminNote = null): bool { $req = $this->findWithUser($requestId); if (!$req || $req['status'] !== 'pending') { return false; } $userId = (int)$req['user_id']; try { $this->db->beginTransaction(); // 1. Update request status $stmt1 = $this->db->prepare("UPDATE `delete_account_requests` SET `status` = 'approved', `admin_note` = :note, `processed_by` = :admin_id, `processed_at` = NOW(), `updated_at` = NOW() WHERE `id` = :id AND `status` = 'pending'"); $stmt1->execute([ ':id' => $requestId, ':note' => $adminNote, ':admin_id' => $adminId ]); // 2. Soft-delete user $stmt2 = $this->db->prepare("UPDATE `users` SET `status` = 'deleted', `deleted_at` = NOW(), `updated_at` = NOW() WHERE `id` = :uid"); $stmt2->execute([':uid' => $userId]); // 3. Clear user active sessions $stmt3 = $this->db->prepare("DELETE FROM `user_sessions` WHERE `user_id` = :uid"); $stmt3->execute([':uid' => $userId]); $this->db->commit(); return true; } catch (Exception $e) { if ($this->db->inTransaction()) { $this->db->rollBack(); } return false; } } public function rejectRequest(int $requestId, int $adminId, ?string $adminNote = null): bool { $stmt = $this->db->prepare("UPDATE `delete_account_requests` SET `status` = 'rejected', `admin_note` = :note, `processed_by` = :admin_id, `processed_at` = NOW(), `updated_at` = NOW() WHERE `id` = :id AND `status` = 'pending'"); $stmt->execute([ ':id' => $requestId, ':note' => $adminNote, ':admin_id' => $adminId ]); return $stmt->rowCount() > 0; } private function buildConditions(array $filters): array { $conditions = ['1=1']; $params = []; if (!empty($filters['status']) && $filters['status'] !== 'all') { $conditions[] = "dar.status = :status"; $params[':status'] = $filters['status']; } if (!empty($filters['q'])) { $conditions[] = "(u.username LIKE :q_user OR u.email LIKE :q_email OR u.first_name LIKE :q_name OR dar.reason LIKE :q_reason)"; $q = '%' . trim($filters['q']) . '%'; $params[':q_user'] = $q; $params[':q_email'] = $q; $params[':q_name'] = $q; $params[':q_reason'] = $q; } return [implode(' AND ', $conditions), $params]; } }
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.25 |
proxy
|
phpinfo
|
Settings