import { NextResponse } from "next/server"; import { API_BASE_URL } from "@/lib/api"; import { sessionCookieName } from "@/lib/session"; export async function POST(request: Request) { const { email, password } = await request.json(); const res = await fetch(`${API_BASE_URL}/auth/login`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ email, password }), cache: "no-store", }); if (!res.ok) { const body = await res.json().catch(() => ({ message: "Falha ao entrar" })); return NextResponse.json({ message: body.message ?? "Falha ao entrar" }, { status: res.status }); } const data = await res.json(); // Sessão gravada mesmo com senha pendente de troca (secao 199) — só dá // pra chamar POST /auth/change-password autenticado, então o cookie // precisa existir antes de mandar pra /trocar-senha. `mustChangePassword` // devolvido aqui é só o sinal pro client escolher a próxima tela. const response = NextResponse.json({ ok: true, mustChangePassword: Boolean(data.mustChangePassword) }); response.cookies.set(sessionCookieName(), JSON.stringify({ accessToken: data.accessToken, refreshToken: data.refreshToken }), { httpOnly: true, sameSite: "lax", secure: process.env.NODE_ENV === "production", path: "/", // Call center: turno de agente pode passar de 8h — 12h é o teto // absoluto do cookie mesmo com o refresh silencioso do middleware // deslizando ele pra frente a cada requisição (o mesmo valor está // duplicado em post-login/route.ts, select-tenant/actions.ts e // middleware.ts — os 4 precisam ficar em sincronia). maxAge: 60 * 60 * 12, }); return response; }