import { NextRequest, NextResponse } from 'next/server'; import prisma from '@/lib/prisma'; import crypto from 'crypto'; import { verifyCsrfToken, verifyOrigin } from '@/lib/csrf'; export async function POST(request: NextRequest) { // CSRF Protection const isOriginValid = verifyOrigin(request); const isCsrfValid = await verifyCsrfToken(request); if (!isOriginValid || !isCsrfValid) { return NextResponse.json( { error: 'Protection CSRF : Requête invalide' }, { status: 403 } ); } try { const { email } = await request.json(); if (!email) { return NextResponse.json( { error: 'Email requis' }, { status: 400 } ); } // Find user const user = await prisma.user.findUnique({ where: { email } }); if (!user) { // For security, same message even if user doesn't exist return NextResponse.json( { message: 'Si un compte existe pour cet email et n\'est pas encore vérifié, un nouvel email de vérification a été envoyé.' }, { status: 200 } ); } if (user.emailVerified) { return NextResponse.json( { error: 'Ce compte est déjà vérifié.' }, { status: 400 } ); } // Generate new verification token const verificationToken = crypto.randomBytes(32).toString('hex'); // Update user with new token await prisma.user.update({ where: { id: user.id }, data: { verificationToken } }); // Send verification email try { const settings = await prisma.siteSetting.findUnique({ where: { id: 'singleton' } }); const siteName = settings?.siteName || 'Afrohub'; const subject = settings?.verifyEmailSubject || 'Vérification de votre compte - Afrohub'; const verifyUrl = `${process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000'}/api/auth/verify?token=${verificationToken}`; let html = settings?.verifyEmailTemplate || `
Bonjour {name},
Vous avez demandé le renvoi de l'email de vérification pour votre compte sur {siteName}. Veuillez vérifier votre adresse email en cliquant sur le bouton ci-dessous :