Checkpoint: Ajout de la fonctionnalité complète de réinitialisation de mot de passe avec génération de tokens temporaires (24h), stockage en base de données, et envoi d'emails automatiques. Nouveau bouton dans la page de gestion des utilisateurs avec dialogue de confirmation.

This commit is contained in:
Manus Sandbox
2025-11-17 16:21:11 -05:00
parent c9f6f8f068
commit 155c4592e1
10 changed files with 832 additions and 1 deletions

View File

@@ -583,6 +583,47 @@ export const appRouter = router({
await db.deleteUser(input.id);
return { success: true };
}),
requestPasswordReset: adminProcedure.input(z.object({ id: z.number() })).mutation(async ({ input }) => {
const user = await db.getUserById(input.id);
if (!user) {
throw new Error("Utilisateur introuvable");
}
if (!user.email) {
throw new Error("Cet utilisateur n'a pas d'adresse email");
}
// Générer un token unique
const crypto = await import('crypto');
const token = crypto.randomBytes(32).toString('hex');
// Définir l'expiration à 24h
const expiresAt = new Date();
expiresAt.setHours(expiresAt.getHours() + 24);
// Sauvegarder le token en base
await db.createPasswordResetToken(user.id, token, expiresAt);
// Générer le lien de réinitialisation
// TODO: Remplacer par l'URL réelle de votre application en production
const resetLink = `https://votre-domaine.com/reset-password?token=${token}`;
// Envoyer l'email
const emailService = await import('./emailService');
const emailSent = await emailService.sendPasswordResetEmail({
apprenantEmail: user.email,
apprenantNom: user.name || 'Utilisateur',
apprenantPrenom: '',
resetLink,
});
if (!emailSent) {
throw new Error("Échec de l'envoi de l'email");
}
return { success: true, message: "Email de réinitialisation envoyé" };
}),
}),
});