@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
JavaScript
;
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();