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:
@@ -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é" };
|
||||
}),
|
||||
}),
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user