import { cookies } from "next/headers"; import { NextResponse } from "next/server"; import { isProductionEnv } from "@/config/env"; import { getDb } from "@/infra/db/client"; import { currentMemberships, WORKSPACE_COOKIE } from "@/server/auth/context"; import { assertMembership } from "@/server/auth/workspace"; export const runtime = "nodejs"; export const dynamic = "force-dynamic"; /** Associações do usuário autenticado. */ export async function GET() { const current = await currentMemberships(); if (!current) { return NextResponse.json({ error: { code: "UNAUTHENTICATED", message: "Sessão necessária." } }, { status: 401 }); } return NextResponse.json({ memberships: current.memberships }); } /** * Grava a preferência de workspace ativo. O cookie resultante é só preferência: * toda requisição revalida a associação no servidor. Gravar aqui sem checar * membership transformaria o cookie em credencial. */ export async function POST(request: Request) { const current = await currentMemberships(); if (!current) { return NextResponse.json({ error: { code: "UNAUTHENTICATED", message: "Sessão necessária." } }, { status: 401 }); } let body: { workspaceId?: string }; try { body = (await request.json()) as { workspaceId?: string }; } catch { return NextResponse.json({ error: { code: "INVALID_BODY", message: "Corpo inválido." } }, { status: 400 }); } if (!body.workspaceId) { return NextResponse.json( { error: { code: "WORKSPACE_REQUIRED", message: "Informe o workspace." } }, { status: 400 }, ); } const db = await getDb(); try { await assertMembership(db, current.userId, body.workspaceId); } catch { return NextResponse.json( { error: { code: "WORKSPACE_FORBIDDEN", message: "Você não é membro deste workspace." } }, { status: 403 }, ); } const jar = await cookies(); jar.set(WORKSPACE_COOKIE, body.workspaceId, { httpOnly: true, sameSite: "lax", secure: isProductionEnv() || process.env.NODE_ENV === "production", path: "/", maxAge: 60 * 60 * 12, }); return NextResponse.json({ ok: true, workspaceId: body.workspaceId }); }