import { NextResponse } from 'next/server'; import prisma from '@/lib/prisma'; import { sendEmail } from '@/lib/mail'; import crypto from 'crypto'; export async function POST(req: Request) { 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 || `

${siteName}

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 :

Réinitialiser mon 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.

`; // Replace placeholders html = html .replace(/{name}/g, user.name) .replace(/{resetUrl}/g, resetUrl) .replace(/{siteName}/g, siteName); await sendEmail({ to: email, subject, html, }); return NextResponse.json({ message: 'Si un compte existe pour cet email, un lien de réinitialisation a été envoyé.' }); } catch (error: any) { console.error('Error in forgot-password:', error); return NextResponse.json({ error: 'Une erreur est survenue lors de la demande' }, { status: 500 }); } }