service = $service; } // ── Helper: usuario logueado ── private function getUserSession(): ?array { if (!session()->has('user_logged_in')) return null; return [ 'tipo' => session('user_tipo'), 'id' => session('user_id'), ]; } /** * GET /notificaciones — Listado completo paginado */ public function index() { $u = $this->getUserSession(); if (!$u) return redirect('/')->with('panel_error', 'Debés iniciar sesión.'); $notificaciones = $this->service->obtenerTodas($u['tipo'], $u['id']); $totalNoLeidas = $this->service->contarNoLeidas($u['tipo'], $u['id']); return view('notificaciones.index', compact('notificaciones', 'totalNoLeidas')); } /** * POST /notificaciones/{id}/leer — Marcar una como leída */ public function marcarLeida(int $id) { $u = $this->getUserSession(); if (!$u) return response()->json(['ok' => false], 401); $this->service->marcarLeida($id, $u['tipo'], $u['id']); return response()->json(['ok' => true]); } /** * POST /notificaciones/leer-todas — Marcar todas como leídas */ public function marcarTodasLeidas() { $u = $this->getUserSession(); if (!$u) return response()->json(['ok' => false], 401); $count = $this->service->marcarTodasLeidas($u['tipo'], $u['id']); return response()->json(['ok' => true, 'marcadas' => $count]); } /** * GET /notificaciones/count — Badge AJAX (devuelve JSON {count: N}) */ public function count() { $u = $this->getUserSession(); if (!$u) return response()->json(['count' => 0]); return response()->json(['count' => $this->service->contarNoLeidas($u['tipo'], $u['id'])]); } /** * GET /notificaciones/latest — ID de la última no leída */ public function latest() { $u = $this->getUserSession(); if (!$u) return response()->json(['id' => 0]); $notif = $this->service->obtenerNoLeidas($u['tipo'], $u['id'])->first(); return response()->json([ 'id' => $notif ? $notif->id : 0, 'titulo' => $notif ? $notif->titulo : '', 'mensaje' => $notif ? $notif->mensaje : '' ]); } /** * DELETE /notificaciones/{id} — Eliminar una notificación */ public function eliminar(int $id) { $u = $this->getUserSession(); if (!$u) return response()->json(['ok' => false], 401); $this->service->eliminar($id, $u['tipo'], $u['id']); return response()->json(['ok' => true]); } /** * DELETE /notificaciones — Eliminar todas */ public function eliminarTodas() { $u = $this->getUserSession(); if (!$u) return response()->json(['ok' => false], 401); $this->service->eliminarTodas($u['tipo'], $u['id']); return response()->json(['ok' => true]); } /** * POST /notificaciones/subscribe — Guardar suscripción para Web Push */ public function subscribe(Request $request) { $u = $this->getUserSession(); if (!$u) return response()->json(['ok' => false, 'error' => 'No session'], 401); $request->validate([ 'endpoint' => 'required', 'keys.p256dh' => 'required', 'keys.auth' => 'required', ]); \App\Models\PushSubscription::updateOrCreate( [ 'id_usuario' => (string) $u['id'], 'tipo_usuario' => $u['tipo'], 'endpoint' => $request->endpoint, ], [ 'p256dh' => $request->keys['p256dh'], 'auth' => $request->keys['auth'], ] ); return response()->json(['ok' => true]); } }