UNPKG

@jackiemacklein/nettz-utils

Version:

Serviços de imagem, e-mail, códigos de barras, utilitários numéricos e componentes React para apps Node.js com TypeScript

138 lines (136 loc) 5.8 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const services_1 = __importDefault(require("./services")); const date_fns_1 = require("date-fns"); const locale_1 = require("date-fns/locale"); class EmailTemplateService { constructor() { } static getInstance() { if (!EmailTemplateService.instance) { EmailTemplateService.instance = new EmailTemplateService(); } return EmailTemplateService.instance; } // Método para processar um template substituindo variáveis processTemplate(template, data) { let processedTemplate = template; // Substituir variáveis no formato {{variavel}} Object.keys(data).forEach((key) => { const value = data[key]; const regex = new RegExp(`{{\\s*${key}\\s*}}`, "g"); if (value instanceof Date) { // Formatar datas processedTemplate = processedTemplate.replace(regex, (0, date_fns_1.format)(value, "dd/MM/yyyy HH:mm", { locale: locale_1.ptBR })); } else if (value !== null && value !== undefined) { processedTemplate = processedTemplate.replace(regex, String(value)); } else { // Substituir por string vazia se o valor for null ou undefined processedTemplate = processedTemplate.replace(regex, ""); } }); return processedTemplate; } // Enviar email usando um template HTML /** * @param to - Email do destinatário * @param subject - Assunto do email * @param templateHtml - Template HTML do email, as variáveis devem ser escritas como {{variavel}} * @param data - Dados para substituir nas variáveis do template, as chaves devem ser as mesmas das variáveis do template * @param options - Opções adicionais do email * @returns - Promise que resolve com true se o email foi enviado com sucesso, false caso contrário */ async sendTemplateEmail(to, subject, templateHtml, data, options = {}) { const processedHtml = this.processTemplate(templateHtml, data); // Gerar versão texto do email (simplificada) const textVersion = processedHtml .replace(/<br\s*\/?>/gi, "\n") .replace(/<\/p>/gi, "\n\n") .replace(/<[^>]*>/g, ""); return services_1.default.sendEmail({ to, subject, html: processedHtml, text: textVersion, cc: options.cc, bcc: options.bcc, attachments: options.attachments, }); } // Método para enviar notificações comuns do sistema /** * * @param to - Email do destinatário * @param subject - Assunto do email * @param message - Mensagem do email * @param buttonText - Texto do botão * @param buttonUrl - URL do botão * @returns - Promise que resolve com true se o email foi enviado com sucesso, false caso contrário */ async sendSystemNotification(to, subject, message, buttonText, buttonUrl) { const template = ` <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style> body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; } .container { max-width: 600px; margin: 0 auto; padding: 20px; } .header { background-color: #4a6da7; color: white; padding: 10px 20px; text-align: center; } .content { padding: 20px; background-color: #f9f9f9; } .footer { font-size: 12px; text-align: center; margin-top: 20px; color: #666; } .button { display: inline-block; background-color: #4a6da7; color: white; padding: 10px 20px; text-decoration: none; border-radius: 4px; margin-top: 15px; } </style> </head> <body> <div class="container"> <div class="header"> <h2>{{systemName}}</h2> </div> <div class="content"> {{message}} {{#if buttonUrl}} <div style="text-align: center; margin-top: 25px;"> <a href="{{buttonUrl}}" class="button">{{buttonText}}</a> </div> {{/if}} </div> <div class="footer"> <p>Este é um email automático, por favor não responda.</p> <p>© {{currentYear}} {{systemName}}. Todos os direitos reservados.</p> </div> </div> </body> </html> `; // Preparar dados para o template const templateData = { systemName: "Sistema", // Substituir pelo nome real do sistema message: message.replace(/\n/g, "<br>"), currentYear: new Date().getFullYear(), }; // Adicionar botão se necessário if (buttonText && buttonUrl) { templateData.buttonText = buttonText; templateData.buttonUrl = buttonUrl; } // Processar o template manualmente para lidar com condicionais let processedTemplate = template; if (buttonText && buttonUrl) { processedTemplate = processedTemplate.replace("{{#if buttonUrl}}", ""); processedTemplate = processedTemplate.replace("{{/if}}", ""); } else { // Remover o bloco condicional inteiro const regex = /{{#if buttonUrl}}([\s\S]*?){{\/if}}/g; processedTemplate = processedTemplate.replace(regex, ""); } return this.sendTemplateEmail(to, subject, processedTemplate, templateData); } } exports.default = EmailTemplateService.getInstance();