feat(backend): API admin configuration avec test SMTP (#6)
Implémentation de l'API REST pour la gestion de la configuration système par les administrateurs. Nouveaux fichiers : - modules/config/config.controller.ts : Controller REST - modules/config/dto/update-config.dto.ts : DTO mise à jour - modules/config/dto/test-smtp.dto.ts : DTO test SMTP Endpoints créés : ✅ GET /api/v1/configuration/setup/status → Vérifier si la configuration initiale est terminée ✅ POST /api/v1/configuration/setup/complete → Marquer la configuration comme terminée ✅ POST /api/v1/configuration/test-smtp → Tester la connexion SMTP + envoi email de test ✅ PATCH /api/v1/configuration/bulk → Mise à jour multiple des configurations ✅ GET /api/v1/configuration → Récupérer toutes les configurations (admin) ✅ GET /api/v1/configuration/:category → Récupérer par catégorie (email/app/security) Fonctionnalités : - Validation des données avec class-validator - Test SMTP avec Nodemailer - Envoi d'email de test HTML - Gestion d'erreurs complète - Rechargement automatique du cache - Traçabilité des modifications Sécurité : - Guards commentés (à activer avec JWT) - Validation des catégories - Mots de passe masqués dans les réponses Dépendances ajoutées : - nodemailer ^6.9.16 - @types/nodemailer ^6.4.16 Tests effectués : ✅ GET /setup/status → {setupCompleted: false} ✅ GET /email → 8 configurations email ✅ Build Docker réussi ✅ Toutes les routes mappées correctement Ref: #6
This commit is contained in:
@@ -176,13 +176,77 @@ export class AppConfigService implements OnModuleInit {
|
||||
|
||||
/**
|
||||
* Test de la configuration SMTP
|
||||
* @returns true si la connexion SMTP fonctionne
|
||||
* @param testEmail Email de destination pour le test
|
||||
* @returns Objet avec success et error éventuel
|
||||
*/
|
||||
async testSmtpConnection(): Promise<boolean> {
|
||||
// TODO: Implémenter le test SMTP avec Nodemailer
|
||||
// Pour l'instant, on retourne true
|
||||
this.logger.log('🧪 Test de connexion SMTP (à implémenter)');
|
||||
return true;
|
||||
async testSmtpConnection(testEmail?: string): Promise<{ success: boolean; error?: string }> {
|
||||
try {
|
||||
this.logger.log('🧪 Test de connexion SMTP...');
|
||||
|
||||
// Récupération de la configuration SMTP
|
||||
const smtpHost = this.get<string>('smtp_host');
|
||||
const smtpPort = this.get<number>('smtp_port');
|
||||
const smtpSecure = this.get<boolean>('smtp_secure');
|
||||
const smtpAuthRequired = this.get<boolean>('smtp_auth_required');
|
||||
const smtpUser = this.get<string>('smtp_user');
|
||||
const smtpPassword = this.get<string>('smtp_password');
|
||||
const emailFromName = this.get<string>('email_from_name');
|
||||
const emailFromAddress = this.get<string>('email_from_address');
|
||||
|
||||
// Import dynamique de nodemailer
|
||||
const nodemailer = await import('nodemailer');
|
||||
|
||||
// Configuration du transporteur
|
||||
const transportConfig: any = {
|
||||
host: smtpHost,
|
||||
port: smtpPort,
|
||||
secure: smtpSecure,
|
||||
};
|
||||
|
||||
if (smtpAuthRequired && smtpUser && smtpPassword) {
|
||||
transportConfig.auth = {
|
||||
user: smtpUser,
|
||||
pass: smtpPassword,
|
||||
};
|
||||
}
|
||||
|
||||
const transporter = nodemailer.createTransport(transportConfig);
|
||||
|
||||
// Vérification de la connexion
|
||||
await transporter.verify();
|
||||
this.logger.log('✅ Connexion SMTP vérifiée');
|
||||
|
||||
// Si un email de test est fourni, on envoie un email
|
||||
if (testEmail) {
|
||||
await transporter.sendMail({
|
||||
from: `"${emailFromName}" <${emailFromAddress}>`,
|
||||
to: testEmail,
|
||||
subject: '🧪 Test de configuration SMTP - P\'titsPas',
|
||||
text: 'Ceci est un email de test pour vérifier la configuration SMTP de votre application P\'titsPas.',
|
||||
html: `
|
||||
<div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
|
||||
<h2 style="color: #4CAF50;">✅ Test de configuration SMTP réussi !</h2>
|
||||
<p>Ceci est un email de test pour vérifier la configuration SMTP de votre application <strong>P'titsPas</strong>.</p>
|
||||
<p>Si vous recevez cet email, cela signifie que votre configuration SMTP fonctionne correctement.</p>
|
||||
<hr style="border: 1px solid #eee; margin: 20px 0;">
|
||||
<p style="color: #666; font-size: 12px;">
|
||||
Cet email a été envoyé automatiquement depuis votre application P'titsPas.<br>
|
||||
Configuration testée le ${new Date().toLocaleString('fr-FR')}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
});
|
||||
this.logger.log(`📧 Email de test envoyé à ${testEmail}`);
|
||||
}
|
||||
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
this.logger.error('❌ Échec du test SMTP', error);
|
||||
return {
|
||||
success: false,
|
||||
error: error.message || 'Erreur inconnue lors du test SMTP',
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user