const admin = require('firebase-admin'); const handlebars = require('handlebars'); const fs = require('fs').promises; const path = require('path'); const {EMAIL_CONFIG} = require('./emailConfig'); /** * Vérifie si l'utilisateur souhaite recevoir ce type d'alerte */ function checkAlertPreference(alertType, preferences) { const typeMapping = { 'EVENT_CREATED': 'eventsNotifications', 'EVENT_MODIFIED': 'eventsNotifications', 'EVENT_CANCELLED': 'eventsNotifications', 'LOST': 'equipmentNotifications', 'EQUIPMENT_MISSING': 'equipmentNotifications', 'DAMAGED': 'equipmentNotifications', 'QUANTITY_MISMATCH': 'equipmentNotifications', 'MAINTENANCE_REMINDER': 'maintenanceNotifications', 'STOCK_LOW': 'stockNotifications', }; const prefKey = typeMapping[alertType]; return prefKey ? (preferences[prefKey] !== false) : true; } /** * Prépare les données pour le template */ async function prepareTemplateData(alert, user) { const data = { userName: `${user.firstName || ''} ${user.lastName || ''}`.trim() || 'Utilisateur', alertTitle: getAlertTitle(alert.type), alertMessage: alert.message, isCritical: alert.severity === 'CRITICAL', actionUrl: `${EMAIL_CONFIG.appUrl}${alert.actionUrl || '/alerts'}`, appUrl: EMAIL_CONFIG.appUrl, unsubscribeUrl: `${EMAIL_CONFIG.appUrl}/my_account?tab=notifications`, year: new Date().getFullYear(), subject: getEmailSubject(alert), }; // Ajouter des détails selon le type d'alerte if (alert.eventId) { try { const eventDoc = await admin.firestore() .collection('events') .doc(alert.eventId) .get(); if (eventDoc.exists) { const event = eventDoc.data(); data.eventName = event.Name || event.name || 'Événement'; if (event.StartDateTime || event.startDate) { const dateField = event.StartDateTime || event.startDate; const date = dateField.toDate ? dateField.toDate() : new Date(dateField); data.eventDate = date.toLocaleDateString('fr-FR', { day: '2-digit', month: '2-digit', year: 'numeric', }); } } } catch (error) { // Ignorer silencieusement } } if (alert.equipmentId) { try { const eqDoc = await admin.firestore() .collection('equipments') .doc(alert.equipmentId) .get(); if (eqDoc.exists) { data.equipmentName = eqDoc.data().name; } } catch (error) { // Ignorer silencieusement } } return data; } /** * Génère le titre de l'email selon le type d'alerte */ function getEmailSubject(alert) { const subjects = { 'EVENT_CREATED': '📅 Nouvel événement créé', 'EVENT_MODIFIED': '📝 Événement modifié', 'EVENT_CANCELLED': '❌ Événement annulé', 'LOST': '🔴 Alerte critique : Équipement perdu', 'EQUIPMENT_MISSING': '⚠️ Équipement manquant', 'DAMAGED': '⚠️ Équipement endommagé', 'QUANTITY_MISMATCH': 'ℹ️ Quantité incorrecte', 'MAINTENANCE_REMINDER': '🔧 Rappel de maintenance', 'STOCK_LOW': '📦 Stock faible', }; return subjects[alert.type] || '🔔 Nouvelle alerte - EM2 Events'; } /** * Génère le titre pour le corps de l'email */ function getAlertTitle(type) { const titles = { 'EVENT_CREATED': 'Nouvel événement créé', 'EVENT_MODIFIED': 'Événement modifié', 'EVENT_CANCELLED': 'Événement annulé', 'LOST': 'Équipement perdu', 'EQUIPMENT_MISSING': 'Équipement manquant', 'DAMAGED': 'Équipement endommagé', 'QUANTITY_MISMATCH': 'Quantité incorrecte', 'MAINTENANCE_REMINDER': 'Maintenance requise', 'STOCK_LOW': 'Stock faible', }; return titles[type] || 'Nouvelle alerte'; } /** * Rend un template HTML avec Handlebars */ async function renderTemplate(templateName, data) { try { // Lire le template de base const basePath = path.join(__dirname, '..', 'templates', 'base-template.html'); const baseTemplate = await fs.readFile(basePath, 'utf8'); // Lire le template de contenu const contentPath = path.join( __dirname, '..', 'templates', `${templateName}.html`, ); const contentTemplate = await fs.readFile(contentPath, 'utf8'); // Compiler les templates const compileContent = handlebars.compile(contentTemplate); const compileBase = handlebars.compile(baseTemplate); // Rendre le contenu const renderedContent = compileContent(data); // Rendre le template de base avec le contenu return compileBase({ ...data, content: renderedContent, }); } catch (error) { // Fallback vers un template simple return `

${data.alertTitle}

${data.alertMessage}

Voir l'alerte `; } } module.exports = { checkAlertPreference, prepareTemplateData, getEmailSubject, getAlertTitle, renderTemplate, };