Checkpoint: Ajout de l'interface de configuration SMTP avec Resend : formulaire de configuration (API key, email expéditeur, nom), basculement simulation/production, test d'envoi immédiat, stockage sécurisé en base de données, et guide de configuration intégré

This commit is contained in:
Manus Sandbox
2025-11-18 02:00:48 -05:00
parent 20dc80cd74
commit 9d67724e83
11 changed files with 1298 additions and 13 deletions

View File

@@ -10,16 +10,18 @@ import {
inscriptions,
passwordResetTokens,
InsertPasswordResetToken,
InsertFormation,
InsertApprenant,
emailTemplates,
emailConfig,
InsertEmailConfig,
InsertSequence,
InsertDateFormation,
InsertInscription,
InsertFormation,
InsertApprenant,
Sequence,
DateFormation,
Apprenant,
Formation,
emailTemplates,
EmailTemplate,
InsertEmailTemplate
} from "../drizzle/schema";
@@ -602,3 +604,55 @@ export async function initializeDefaultEmailTemplates() {
console.log("[DB] Templates d'emails par défaut initialisés");
}
// ==================== Email Config ====================
/**
* Récupère la configuration email active
*/
export async function getActiveEmailConfig() {
const db = await getDb();
if (!db) return undefined;
const result = await db
.select()
.from(emailConfig)
.where(eq(emailConfig.active, true))
.limit(1);
return result.length > 0 ? result[0] : undefined;
}
/**
* Crée ou met à jour la configuration email
*/
export async function upsertEmailConfig(data: InsertEmailConfig) {
const db = await getDb();
if (!db) return;
// Désactiver toutes les configurations existantes
await db.update(emailConfig).set({ active: false });
// Créer la nouvelle configuration
await db.insert(emailConfig).values({
...data,
active: true,
});
}
/**
* Met à jour la configuration email
*/
export async function updateEmailConfig(id: number, data: Partial<InsertEmailConfig>) {
const db = await getDb();
if (!db) return;
await db
.update(emailConfig)
.set({
...data,
updatedAt: new Date(),
})
.where(eq(emailConfig.id, id));
}