import { NextResponse, NextRequest } from 'next/server'; import prisma from '@/lib/prisma'; import { sendEmail } from '@/lib/mail'; import crypto from 'crypto'; import { verifyCsrfToken, verifyOrigin } from '@/lib/csrf'; export async function POST(req: NextRequest) { // CSRF Protection const isOriginValid = verifyOrigin(req); const isCsrfValid = await verifyCsrfToken(req); if (!isOriginValid || !isCsrfValid) { return NextResponse.json( { error: 'Protection CSRF : Requête invalide' }, { status: 403 } ); } try { const { email } = await req.json(); if (!email) { return NextResponse.json({ error: 'Email est requis' }, { status: 400 }); } const user = await prisma.user.findUnique({ where: { email }, }); if (!user) { // Pour des raisons de sécurité, on ne dit pas si l'utilisateur existe ou non return NextResponse.json({ message: 'Si un compte existe pour cet email, un lien de réinitialisation a été envoyé.' }); } // Générer un token const token = crypto.randomBytes(32).toString('hex'); const expiry = new Date(Date.now() + 3600000); // 1 heure await prisma.user.update({ where: { id: user.id }, data: { resetToken: token, resetTokenExpiry: expiry, }, }); const resetUrl = `${process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000'}/reset-password?token=${token}`; // Get site settings for email template const settings = await prisma.siteSetting.findUnique({ where: { id: 'singleton' } }); const siteName = settings?.siteName || 'Afrohub'; const subject = settings?.resetPasswordSubject || 'Réinitialisation de votre mot de passe - Afrohub'; let html = settings?.resetPasswordTemplate || `
Bonjour ${user.name},
Vous avez demandé la réinitialisation de votre mot de passe. Cliquez sur le bouton ci-dessous pour choisir un nouveau mot de passe :
Ce lien expirera dans 1 heure. Si vous n'avez pas demandé cette réinitialisation, vous pouvez ignorer cet email.
© 2025 ${siteName}. Tous droits réservés.