fix: corriger le flux de réinitialisation par e-mail
Some checks failed
Validation applicative / TypeScript, tests et build (push) Failing after 2m22s

This commit is contained in:
manus-admin
2026-09-02 11:30:37 +02:00
parent 166729bdbc
commit 2cac56b8c6
8 changed files with 247 additions and 58 deletions

View File

@@ -38,8 +38,8 @@ export type InsertUser = typeof users.$inferInsert;
*/
export const passwordResetTokens = mysqlTable("passwordResetTokens", {
id: int("id").autoincrement().primaryKey(),
/** Email de l'utilisateur qui demande la réinitialisation */
email: varchar("email", { length: 320 }).notNull(),
/** Utilisateur propriétaire du token. Ce contrat correspond à la table déployée. */
userId: int("userId").notNull(),
/** Token unique généré pour la réinitialisation */
token: varchar("token", { length: 255 }).notNull().unique(),
/** Date d'expiration du token (24h après création) */
@@ -143,7 +143,8 @@ export const inscriptions = mysqlTable("inscriptions", {
id: int("id").autoincrement().primaryKey(),
sequenceId: int("sequenceId").notNull(),
apprenantId: int("apprenantId").notNull(),
statut: mysqlEnum("statut", ["confirmee", "en_attente", "annulee"]).default("confirmee").notNull(),
/** `liste_attente` est la valeur historique et réellement déployée dans les trois environnements. */
statut: mysqlEnum("statut", ["confirmee", "liste_attente", "annulee"]).default("confirmee").notNull(),
dateInscription: timestamp("dateInscription").defaultNow().notNull(),
updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(),
});
@@ -190,10 +191,31 @@ export type InsertEmailConfig = typeof emailConfig.$inferInsert;
/**
* Table des templates d'emails
*/
export const emailTemplateTypes = [
"inscription",
"teaser",
"rappel",
"rappelJ1",
"rappel1",
"rappel2",
"rappel3",
"rappel4",
"rappel5",
"rappel6",
"reset_password",
"attestation",
] as const;
export type EmailTemplateType = (typeof emailTemplateTypes)[number];
export function isEmailTemplateType(value: string): value is EmailTemplateType {
return (emailTemplateTypes as readonly string[]).includes(value);
}
export const emailTemplates = mysqlTable("emailTemplates", {
id: int("id").autoincrement().primaryKey(),
/** Type de template (inscription, teaser, rappel1, rappel2, rappel3, rappel4, rappel5, rappel6, reset_password) */
type: mysqlEnum("type", ["inscription", "teaser", "rappel", "rappelJ1", "rappel1", "rappel2", "rappel3", "rappel4", "rappel5", "rappel6", "reset_password", "attestation"]).notNull().unique(),
type: mysqlEnum("type", emailTemplateTypes).notNull().unique(),
titre: varchar("titre", { length: 255 }).notNull(),
/** Corps du message avec variables dynamiques */
bodyContent: text("bodyContent").notNull(),
@@ -312,7 +334,13 @@ export const questionnaires = mysqlTable("questionnaires", {
description: text("description"),
/** Type de questionnaire (satisfaction, evaluation_pre, evaluation_post) */
type: mysqlEnum("type", ["satisfaction", "evaluation_pre", "evaluation_post"]).notNull(),
/** Formation ciblée ; null signifie que le questionnaire s'applique à toutes les formations. */
formationId: int("formationId"),
actif: boolean("actif").default(true).notNull(),
/** Active l'envoi automatique après la fin d'une séquence. */
envoiAutomatique: boolean("envoiAutomatique").default(false).notNull(),
/** Délai, en jours, entre la fin de séquence et l'envoi automatique. */
delaiEnvoiJours: int("delaiEnvoiJours").default(1).notNull(),
createdAt: timestamp("createdAt").defaultNow().notNull(),
updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(),
});
@@ -335,9 +363,14 @@ export const questions = mysqlTable("questions", {
valeurMin: int("valeurMin"),
/** Valeur maximale pour les échelles */
valeurMax: int("valeurMax"),
/** Libellé affiché pour l'extrémité minimale de l'échelle. */
echelleLabelMin: varchar("echelleLabelMin", { length: 100 }),
/** Libellé affiché pour l'extrémité maximale de l'échelle. */
echelleLabelMax: varchar("echelleLabelMax", { length: 100 }),
obligatoire: boolean("obligatoire").default(false).notNull(),
ordre: int("ordre").notNull(),
createdAt: timestamp("createdAt").defaultNow().notNull(),
updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(),
});
export type Question = typeof questions.$inferSelect;