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, };