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

@@ -8,6 +8,8 @@ import {
sequences,
datesFormation,
inscriptions,
passwordResetTokens,
InsertPasswordResetToken,
InsertFormation,
InsertApprenant,
InsertSequence,
@@ -419,3 +421,49 @@ export async function deleteUser(id: number) {
await db.delete(users).where(eq(users.id, id));
}
// ==================== GESTION DES TOKENS DE RÉINITIALISATION ====================
export async function createPasswordResetToken(userId: number, token: string, expiresAt: Date) {
const db = await getDb();
if (!db) throw new Error("Database not available");
const result = await db.insert(passwordResetTokens).values({
userId,
token,
expiresAt,
used: false,
});
return result;
}
export async function getPasswordResetToken(token: string) {
const db = await getDb();
if (!db) return undefined;
const result = await db.select()
.from(passwordResetTokens)
.where(eq(passwordResetTokens.token, token))
.limit(1);
return result.length > 0 ? result[0] : undefined;
}
export async function markTokenAsUsed(tokenId: number) {
const db = await getDb();
if (!db) throw new Error("Database not available");
await db.update(passwordResetTokens)
.set({ used: true })
.where(eq(passwordResetTokens.id, tokenId));
}
export async function deleteExpiredTokens() {
const db = await getDb();
if (!db) throw new Error("Database not available");
const now = new Date();
await db.delete(passwordResetTokens)
.where(sql`${passwordResetTokens.expiresAt} < ${now}`);
}