unread->featureEnabled()) { throw new NotFoundHttpException('اعلان داخل اپ غیرفعال است.'); } } public function index() { $this->assertFeatureEnabled(); $customerId = (int) auth()->id(); $rows = $this->unread->visibleQuery($customerId) ->orderByDesc('id') ->limit(100) ->get(['id', 'title', 'body', 'severity', 'created_at']); $readIds = AppNotificationRead::query() ->where('customer_id', $customerId) ->whereIn('notification_id', $rows->pluck('id')) ->pluck('notification_id') ->all(); $readSet = array_fill_keys($readIds, true); $payload = $rows->map(function (AppNotification $row) use ($readSet) { return [ 'id' => $row->id, 'title' => $row->title, 'body' => $row->body, 'severity' => $row->severity, 'created_at' => $row->created_at, 'is_read' => isset($readSet[$row->id]), ]; }); return response()->json($payload); } public function unreadCount() { $this->assertFeatureEnabled(); $customerId = (int) auth()->id(); return response()->json($this->unread->payloadForCustomer($customerId)); } public function markRead(Request $request, int $id) { $this->assertFeatureEnabled(); $customerId = (int) auth()->id(); $exists = $this->unread->visibleQuery($customerId)->where('id', $id)->exists(); if (! $exists) { throw new NotFoundHttpException('اعلان یافت نشد.'); } AppNotificationRead::query()->updateOrCreate( [ 'notification_id' => $id, 'customer_id' => $customerId, ], [ 'read_at' => now(), ] ); $this->unread->publishForCustomer($customerId); return response()->json(true); } public function markAllRead() { $this->assertFeatureEnabled(); $customerId = (int) auth()->id(); $ids = $this->unread->visibleQuery($customerId)->pluck('id'); $now = now(); foreach ($ids as $notificationId) { AppNotificationRead::query()->updateOrCreate( [ 'notification_id' => $notificationId, 'customer_id' => $customerId, ], [ 'read_at' => $now, ] ); } $this->unread->publishForCustomer($customerId); return response()->json(true); } }