import { cookies } from "next/headers"; import { SignJWT, jwtVerify } from "jose"; const SECRET = new TextEncoder().encode(process.env.NEXTAUTH_SECRET || "dev-secret"); export async function crearSesionAdmin(adminId: string): Promise { const token = await new SignJWT({ sub: adminId, role: "admin" }) .setProtectedHeader({ alg: "HS256" }) .setExpirationTime("8h") .sign(SECRET); return token; } export async function crearSesionCliente(clienteId: string): Promise { const token = await new SignJWT({ sub: clienteId, role: "cliente" }) .setProtectedHeader({ alg: "HS256" }) .setExpirationTime("24h") .sign(SECRET); return token; } export async function crearSesionJefe(jefeId: string): Promise { const token = await new SignJWT({ sub: jefeId, role: "jefe" }) .setProtectedHeader({ alg: "HS256" }) .setExpirationTime("8h") .sign(SECRET); return token; } export async function verificarSesion( cookieName: string, rolEsperado?: "admin" | "cliente" | "jefe" ): Promise<{ sub: string; role: string } | null> { const cookieStore = await cookies(); const token = cookieStore.get(cookieName)?.value; if (!token) return null; try { const { payload } = await jwtVerify(token, SECRET); const sesion = payload as { sub: string; role: string }; // Los tres tipos de sesión se firman con el mismo secreto, así que un token de // admin o de jefe puesto en la cookie del cliente pasa la verificación de firma. // Cuando el rol importa, se comprueba acá. if (rolEsperado && sesion.role !== rolEsperado) return null; return sesion; } catch { return null; } }