recreate project

This commit is contained in:
root
2026-02-10 22:11:06 -05:00
commit 663c0cdbda
10149 changed files with 1379710 additions and 0 deletions
@@ -0,0 +1,213 @@
<?php
namespace App\Controllers\View;
use App\Controllers\BaseController;
use App\Controllers\View\EmailController;
use App\Models\NotificationModel;
use App\Models\UserNotificationModel;
use App\Models\UserModel;
class NotificationsController extends BaseController
{
protected $notificationModel;
protected $userNotificationModel;
protected $userModel;
public function __construct()
{
$this->notificationModel = new NotificationModel();
$this->userNotificationModel = new UserNotificationModel();
$this->userModel = new UserModel();
}
public function index()
{
$userId = session()->get('user_id');
$notifications = $this->userNotificationModel
->select('notifications.*, user_notifications.is_read')
->join('notifications', 'notifications.id = user_notifications.notification_id')
->where('user_notifications.user_id', $userId)
->orderBy('notifications.created_at', 'DESC')
->findAll();
return view('notifications/index', ['notifications' => $notifications]);
}
public function create()
{
return view('notifications/create');
}
public function send()
{
$title = $this->request->getPost('title');
$message = $this->request->getPost('message');
$group = $this->request->getPost('target_group');
$channels = $this->request->getPost('channels'); // ['in_app', 'email', 'sms']
$notifId = $this->notificationModel->insert([
'title' => $title,
'message' => $message,
'target_group' => $group,
'delivery_channels' => implode(',', $channels),
'created_at' => utc_now()
]);
$users = $this->userModel->where('role', $group)->findAll();
foreach ($users as $user) {
$this->userNotificationModel->insert([
'notification_id' => $notifId,
'user_id' => $user['id'],
'is_read' => false
]);
if (in_array('email', $channels)) {
$this->sendEmail($user['email'], $title, $message);
}
if (in_array('sms', $channels) && !empty($user['phone'])) {
$this->sendSMS($user['phone'], $message);
}
}
return redirect()->back()->with('success', 'Notification sent successfully.');
}
public function markAsRead($id)
{
$userId = session()->get('user_id');
$this->userNotificationModel->where('notification_id', $id)
->where('user_id', $userId)
->set(['is_read' => 1])
->update();
return redirect()->back();
}
public function listActive()
{
helper('url');
$targetGroup = $this->request->getGet('target_group');
return view('notifications/list_active', [
'notificationsEndpoint' => site_url('api/notifications/active'),
'defaultTargetGroup' => $targetGroup,
]);
}
public function listDeleted()
{
helper(['url', 'form']);
return view('notifications/list_deleted', [
'deletedNotificationsEndpoint' => site_url('api/notifications/deleted'),
'restoreEndpoint' => site_url('notifications/restore'),
'csrfTokenName' => csrf_token(),
'csrfTokenValue' => csrf_hash(),
]);
}
public function activeNotificationsData()
{
$targetGroup = $this->request->getGet('target_group');
return $this->response->setJSON($this->buildActiveNotificationsPayload($targetGroup));
}
public function deletedNotificationsData()
{
return $this->response->setJSON($this->buildDeletedNotificationsPayload());
}
public function restore($id)
{
if ($this->notificationModel->restoreNotification($id)) {
return redirect()->to(base_url('notifications/deleted'))->with('success', 'Notification restored successfully.');
}
return redirect()->to(base_url('notifications/deleted'))->with('error', 'Failed to restore notification.');
}
protected function sendEmail($to, $subject, $message)
{
$mailer = new EmailController();
$mailer->sendEmail($to, $subject, $message);
}
protected function sendSMS($phone, $message)
{
log_message('info', "SMS to {$phone}: {$message}");
}
private function buildActiveNotificationsPayload(?string $targetGroup): array
{
$targetGroup = $targetGroup !== null ? trim($targetGroup) : null;
if ($targetGroup === '') {
$targetGroup = null;
}
$rows = $this->notificationModel->getActiveNotifications($targetGroup);
if (!is_array($rows)) {
$rows = [];
}
$now = time();
$notifications = array_map(static function ($row) use ($now) {
if (!is_array($row)) {
return [];
}
$expiresAt = $row['expires_at'] ?? null;
$expiryTs = $expiresAt ? strtotime((string) $expiresAt) : false;
$isExpired = $expiryTs !== false && $expiryTs <= $now;
return [
'id' => $row['id'] ?? null,
'title' => $row['title'] ?? null,
'message' => $row['message'] ?? null,
'priority' => $row['priority'] ?? null,
'scheduled_at' => $row['scheduled_at'] ?? null,
'expires_at' => $expiresAt,
'created_at' => $row['created_at'] ?? null,
'target_group' => $row['target_group'] ?? null,
'isExpired' => $isExpired,
];
}, $rows);
return [
'notifications' => $notifications,
];
}
private function buildDeletedNotificationsPayload(): array
{
$rows = $this->notificationModel->getDeletedNotifications();
if (!is_array($rows)) {
$rows = [];
}
$notifications = array_map(static function ($row) {
if (!is_array($row)) {
return [];
}
return [
'id' => $row['id'] ?? null,
'title' => $row['title'] ?? null,
'message' => $row['message'] ?? null,
'priority' => $row['priority'] ?? null,
'scheduled_at' => $row['scheduled_at'] ?? null,
'expires_at' => $row['expires_at'] ?? null,
'deleted_at' => $row['deleted_at'] ?? null,
];
}, $rows);
return [
'notifications' => $notifications,
];
}
}