user(); $notifications = Notification::query() ->where('user_id', $user->id) ->latest() ->limit(20) ->get() ->map(fn (Notification $n) => [ 'id' => $n->id, 'title' => $n->title, 'body' => $n->body, 'url' => $n->url, 'is_read' => $n->is_read, 'created_at' => $n->created_at->toIso8601String(), ]); $unreadCount = Notification::query() ->where('user_id', $user->id) ->unread() ->count(); return response()->json([ 'notifications' => $notifications, 'unread_count' => $unreadCount, ]); } public function markAsRead(Request $request, Notification $notification): JsonResponse { if ($notification->user_id !== $request->user()->id) { abort(403); } $notification->markAsRead(); return response()->json(['success' => true]); } public function markAllAsRead(Request $request): JsonResponse { Notification::query() ->where('user_id', $request->user()->id) ->unread() ->update(['is_read' => true, 'read_at' => now()]); return response()->json(['success' => true]); } public function destroy(Request $request, Notification $notification): JsonResponse { if ($notification->user_id !== $request->user()->id) { abort(403); } $notification->delete(); return response()->json(['success' => true]); } public function destroyAll(Request $request): JsonResponse { Notification::query() ->where('user_id', $request->user()->id) ->delete(); return response()->json(['success' => true]); } }