resolveRecipient($recipientType); $query = Notification::query() ->where('recipient_type', $recipientType) ->where('recipient_id', $recipient->id); $unreadCount = (clone $query)->where('is_read', false)->count(); if ($request->filled('is_read')) { $query->where('is_read', $request->boolean('is_read')); } if ($request->filled('search')) { $search = $request->string('search'); $query->where(function ($q) use ($search) { $q->where('title', 'like', "%{$search}%") ->orWhere('body', 'like', "%{$search}%"); }); } $query->orderByDesc('created_at'); if ($request->filled('page') || $request->filled('per_page')) { $perPage = (int) $request->integer('per_page', 15); $paginator = $query->paginate($perPage, ['*'], 'page', (int) $request->integer('page', 1)); return response()->json([ 'error' => false, 'data' => [ 'items' => $paginator->items(), 'total' => $paginator->total(), 'unread_count' => $unreadCount, ], ]); } $notifications = $query->limit(20)->get(); return response()->json([ 'error' => false, 'data' => [ 'items' => $notifications, 'unread_count' => $unreadCount, ], ]); } public function show(Request $request, string $recipientType, int $id): JsonResponse { $recipient = $this->resolveRecipient($recipientType); $notification = Notification::query() ->where('recipient_type', $recipientType) ->where('recipient_id', $recipient->id) ->whereKey($id) ->first(); if (!$notification) { return response()->json(['error' => true, 'message' => 'Notification not found'], 404); } return response()->json(['error' => false, 'data' => $notification]); } public function markRead(Request $request, string $recipientType, int $id): JsonResponse { $recipient = $this->resolveRecipient($recipientType); $notification = Notification::query() ->where('recipient_type', $recipientType) ->where('recipient_id', $recipient->id) ->whereKey($id) ->first(); if (!$notification) { return response()->json(['error' => true, 'message' => 'Notification not found'], 404); } $notification->update([ 'is_read' => true, 'read_at' => now(), ]); return response()->json(['error' => false, 'data' => $notification]); } public function markAllRead(Request $request, string $recipientType): JsonResponse { $recipient = $this->resolveRecipient($recipientType); Notification::query() ->where('recipient_type', $recipientType) ->where('recipient_id', $recipient->id) ->where('is_read', false) ->update([ 'is_read' => true, 'read_at' => now(), ]); return response()->json(['error' => false, 'message' => 'Marked as read']); } private function resolveRecipient(string $recipientType) { return match ($recipientType) { 'admin' => auth('admin')->user(), 'client' => auth('client')->user(), default => abort(404), }; } }