feat: add app and database modules

This commit is contained in:
2026-05-21 16:05:11 +07:00
parent 37b7e783f5
commit fad70d096b
212 changed files with 23901 additions and 0 deletions
@@ -0,0 +1,71 @@
<?php
namespace App\Notifications;
use App\Events\NotificationSent;
use App\Models\Notification as NotificationModel;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Support\Facades\Auth;
class SystemManagementNotification extends Notification
{
use Queueable;
/**
* Create a new notification instance.
*/
public function __construct(
protected string $title,
protected string $message,
protected string $type = 'info',
protected string $recipient = 'Developer',
protected ?int $createdBy = null
) {
$this->createdBy = $createdBy ?? Auth::id();
}
/**
* Get the notification's delivery channels.
*
* @return array<int, string>
*/
public function via(object $notifiable): array
{
// Manually save to our custom notifications table here
$this->saveToCustomDatabase($notifiable);
return [];
}
/**
* Save to the custom notifications table.
*/
protected function saveToCustomDatabase(object $notifiable): void
{
// Prevent duplicate entries for the same system notification within a short window.
// This is necessary because system notifications are often sent to multiple users
// (e.g., all Administrators), but we only want one entry in the global log.
$recent = NotificationModel::where('title', $this->title)
->where('message', $this->message)
->where('recipient', $this->recipient)
->where('created_at', '>=', now()->subSeconds(5))
->exists();
if ($recent) {
return;
}
$notification = NotificationModel::create([
'title' => $this->title,
'message' => $this->message,
'type' => $this->type,
'recipient' => $this->recipient,
'created_by' => $this->createdBy,
]);
// Broadcast a NotificationSent event so the UI updates in real-time.
// We do this here once after the database record is created.
event(new NotificationSent($notification));
}
}