import { NextRequest, NextResponse } from "next/server"; import { z } from "zod"; import { requestCode } from "@/lib/auth/otp"; import { assertSameOrigin, clientIp } from "@/lib/auth/session"; import { handle, parseBody } from "@/lib/api"; export const dynamic = "force-dynamic"; const Body = z.object({ email: z.string().min(3).max(254) }); /** Réponse volontairement neutre : ne révèle jamais si l'adresse possède un compte. */ export async function POST(req: NextRequest) { try { await assertSameOrigin(); const { email } = await parseBody(req, Body); const r = await requestCode(email, await clientIp()); if (!r.ok && r.reason === "invalid_email") return NextResponse.json({ error: { code: "invalid_email", message: "Adresse courriel invalide" } }, { status: 400 }); if (!r.ok) return NextResponse.json({ ok: true, sent: false, retryAfterSec: r.retryAfterSec, message: r.reason === "cooldown" ? "Un code vient d'être envoyé. Patientez avant d'en demander un autre." : "Trop de demandes. Réessayez plus tard." }, { status: 429 }); return NextResponse.json({ ok: true, sent: true, challengeId: r.challengeId, retryAfterSec: r.retryAfterSec, message: "Si cette adresse est valide, un code vient d'être envoyé." }); } catch (e) { return handle(e); } }