TypeScript 50.6%
JavaScript 46.1%
SQL 2.1%
Shell 0.6%
CSS 0.5%
1import { NextRequest, NextResponse } from "next/server";2import { z } from "zod";3import { requestCode } from "@/lib/auth/otp";4import { assertSameOrigin, clientIp } from "@/lib/auth/session";5import { handle, parseBody } from "@/lib/api";6export const dynamic = "force-dynamic";7const Body = z.object({ email: z.string().min(3).max(254) });8/** Réponse volontairement neutre : ne révèle jamais si l'adresse possède un compte. */9export async function POST(req: NextRequest) {10 try {11 await assertSameOrigin();12 const { email } = await parseBody(req, Body);13 const r = await requestCode(email, await clientIp());14 if (!r.ok && r.reason === "invalid_email") return NextResponse.json({ error: { code: "invalid_email", message: "Adresse courriel invalide" } }, { status: 400 });15 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 });16 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é." });17 } catch (e) { return handle(e); }18}19