Files
L-Ami-Fiduciaire/app/Http/Controllers/NotificationController.php

88 lines
3.0 KiB
PHP
Raw Normal View History

<?php
namespace App\Http\Controllers;
use App\Concerns\HasWorkspaceScope;
use App\Models\Declaration;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Inertia\Inertia;
use Inertia\Response;
class NotificationController extends Controller
{
use HasWorkspaceScope;
public function index(Request $request): Response
{
$workspace = $this->currentWorkspace();
$notifications = $request->user()
->notifications()
->whereJsonContains('data->workspace_id', $workspace->id)
->latest()
->paginate(25);
$declarationIds = collect($notifications->items())->pluck('data.declaration_id')->filter()->unique()->values();
$senderIds = collect($notifications->items())->pluck('data.sender_id')->filter()->unique()->values();
$declarations = Declaration::whereIn('id', $declarationIds)->pluck('title', 'id');
$senders = User::whereIn('id', $senderIds)->pluck('name', 'id');
$notifications->through(function ($n) use ($declarations, $senders) {
$data = $n->data;
$declarationId = $data['declaration_id'] ?? null;
$senderId = $data['sender_id'] ?? null;
$declarationExists = $declarationId && isset($declarations[$declarationId]);
$data['declaration_title'] = $declarationExists ? $declarations[$declarationId] : null;
$data['sender_name'] = $senderId ? ($senders[$senderId] ?? null) : null;
$data['url'] = $declarationExists ? route('declarations.show', $declarationId) : null;
return [
'id' => $n->id,
'type' => class_basename($n->type),
'data' => $data,
'read_at' => $n->read_at?->toISOString(),
'created_at' => $n->created_at->diffForHumans(),
];
});
return Inertia::render('notifications/Index', [
'notifications' => $notifications,
'markAllReadUrl' => route('notifications.readAll'),
'readUrl' => route('notifications.read', ['id' => '__ID__']),
]);
}
public function markAsRead(Request $request, string $id): RedirectResponse
{
$request->user()
->notifications()
->where('id', $id)
->firstOrFail()
->markAsRead();
$workspaceId = $request->session()->get('current_workspace_id');
Cache::forget("user:{$request->user()->id}:workspace:{$workspaceId}:unread_notifications");
return back();
}
public function markAllAsRead(Request $request): RedirectResponse
{
$workspace = $this->currentWorkspace();
$request->user()
->unreadNotifications()
->whereJsonContains('data->workspace_id', $workspace->id)
->update(['read_at' => now()]);
Cache::forget("user:{$request->user()->id}:workspace:{$workspace->id}:unread_notifications");
return back();
}
}