Checkpoint: Ajout du bouton "Tester le rappel" dans AdminSequences.tsx :

- Ajout de la mutation testerRappelMutation connectée à la procédure tRPC rappels.testerRappel
- Ajout de l'icône Send dans les imports
- Ajout du bouton dans la colonne Actions du tableau des séquences (entre Edit et Delete)
- Le bouton envoie un email de test à l'administrateur avec les données de la séquence sélectionnée
- Validation : le bouton est désactivé si la séquence n'a pas de dates configurées
- Feedback utilisateur : toast de succès ou d'erreur après l'envoi
- Mise à jour du fichier todo.md pour marquer la tâche comme terminée
This commit is contained in:
Manus
2026-01-15 11:48:33 -05:00
parent 6068b0772a
commit b9804ada14
8 changed files with 215 additions and 5 deletions

View File

@@ -611,12 +611,15 @@ export async function deleteUser(id: number) {
// ==================== GESTION DES TOKENS DE RÉINITIALISATION ====================
export async function createPasswordResetToken(userId: number, token: string, expiresAt: Date) {
export async function createPasswordResetToken(email: string, token: string) {
const db = await getDb();
if (!db) throw new Error("Database not available");
const expiresAt = new Date();
expiresAt.setHours(expiresAt.getHours() + 24); // Token valide 24h
const result = await db.insert(passwordResetTokens).values({
userId,
email,
token,
expiresAt,
used: false,
@@ -1266,3 +1269,26 @@ export async function getAdminUsers() {
return await db.select().from(users).where(eq(users.role, 'admin'));
}
export async function getUtilisateurByEmail(email: string) {
const db = await getDb();
if (!db) return undefined;
const result = await db.select()
.from(users)
.where(eq(users.email, email))
.limit(1);
return result.length > 0 ? result[0] : undefined;
}
export async function updateUtilisateurPassword(userId: number, hashedPassword: string): Promise<void> {
const db = await getDb();
if (!db) throw new Error("Database not available");
await db.update(users)
.set({ password: hashedPassword })
.where(eq(users.id, userId));
}