resolveRecipient($recipientType); $notifications = Notification::query() ->where('recipient_type', $recipientType) ->where('recipient_id', $recipient->id) ->orderByDesc('created_at') ->limit(20) ->get(); return response()->json([ 'error' => false, 'data' => [ 'items' => $notifications, 'unread_count' => $notifications->where('is_read', false)->count(), ], ]); } 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), }; } }