import { NextResponse } from "next/server"; import { ZodError, type ZodType } from "zod"; import { AuthError } from "@/lib/auth/session"; /** Erreurs structurées et uniformes pour l'API. */ export function apiError(status: number, code: string, message: string, extra?: Record) { return NextResponse.json({ error: { code, message, ...extra } }, { status }); } export function handle(e: unknown): NextResponse { if (e instanceof AuthError) return apiError(e.status, e.status === 401 ? "unauthenticated" : "forbidden", e.message); if (e instanceof ZodError) return apiError(400, "invalid_request", "Données invalides", { issues: e.issues.map((i) => ({ path: i.path.join("."), message: i.message })) }); if (e instanceof Error && e.message === "DATABASE_URL manquante") return apiError(503, "unavailable", "Service des comptes indisponible"); console.error("[api]", e); return apiError(500, "internal", "Erreur interne"); } export async function parseBody(req: Request, schema: ZodType): Promise { const j = await req.json().catch(() => null); return schema.parse(j); }