UNPKG

adba

Version:
207 lines (206 loc) 8.56 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.enqueueEmailList = exports.processEmailList = void 0; exports.setEmailProcessModel = setEmailProcessModel; exports.setSystemModel = setSystemModel; exports.colorPrimary = colorPrimary; exports.setConfig = setConfig; const nodemailer_1 = __importDefault(require("nodemailer")); const fs_1 = __importDefault(require("fs")); const mjml_1 = __importDefault(require("mjml")); const handlebars_1 = __importDefault(require("handlebars")); const dbl_utils_1 = require("dbl-utils"); const moment_1 = __importDefault(require("moment")); const config = { EmailProcessModel: null, SystemModel: null, colorPrimary: '#ffffff', attemptsTotal: 3, maxScheduling: 10, maxPriorScheduling: 20, priorOrder: 10, runningPriorSchedule: false, runningSchedule: false, priorDelay: 1000 * 60, delay: 1000 * 60 * 60, }; function setEmailProcessModel(EmailProcessModel) { config.EmailProcessModel = EmailProcessModel; } function setSystemModel(SystemModel) { config.SystemModel = SystemModel; } function colorPrimary(color) { config.colorPrimary = color; } function setConfig(cfg) { Object.assign(config, cfg); } const buildTemplate = (template, data) => { let text; let html; let subject; //encriptar correo para almacenarlo, desencriptar para enviarlo switch (template) { case 'otp': const mjmlOtp = fs_1.default.readFileSync('./templates/otp.mjml', 'utf8'); const { html, errors } = (0, mjml_1.default)(mjmlOtp, { filePath: './templates' }); if (errors.length) { console.error(errors.filter(e => !e.message.includes('has invalid value: {'))); } const template = handlebars_1.default.compile(html); const htmlBuilded = template(Object.assign(Object.assign({}, data), { frontend: process.env.FRONTEND, colorPrimary: config.colorPrimary })); return { subject: '[Kreditor] Código de validación', html: htmlBuilded, text: [ data.userName, ' este es tu código de validación: ', data.otp, '\n', 'Este dato es personal e intrasferible. Por favor, no compartas este código con nadie.' ].join(' '), cc: [], bcc: [], attachments: [] }; default: break; } return { subject, html, text }; }; const sendEmail = (to_1, template_1, data_1, ...args_1) => __awaiter(void 0, [to_1, template_1, data_1, ...args_1], void 0, function* (to, template, data, order = 10) { if (!config.EmailProcessModel) return false; const emailElements = buildTemplate(template, data); const emailProcess = config.EmailProcessModel.fromJson(Object.assign(Object.assign({ emailAddress: (0, dbl_utils_1.splitAndFlat)([to]) }, emailElements), { order, active: true })); try { const response = yield config.EmailProcessModel.query().insert(emailProcess); console.log('email scheduled:', response); return true; } catch (err) { console.error('error scheduling email:'); console.error(err); return false; } }); const processEmailList = (transporter, emailList) => __awaiter(void 0, void 0, void 0, function* () { if (!config.EmailProcessModel) return false; for (const emailDoc of emailList) { if (['archived', 'completed'].includes(emailDoc.status)) continue; try { yield transporter.sendMail({ from: emailDoc.from, to: emailDoc.emailAddress, html: emailDoc.html, text: emailDoc.text, attachments: emailDoc.attachments, cc: emailDoc.cc, bcc: emailDoc.bcc, subject: emailDoc.subject, }); console.log(`Email sent to ${emailDoc.emailAddress}`); emailDoc.status = 'completed'; emailDoc.lastAttempt = (0, moment_1.default)().format('YYYY-mm-dd HH:mm:ss'); emailDoc.active = false; } catch (error) { console.error('Failed to send email:', error); emailDoc.attempts += 1; emailDoc.lastAttempt = (0, moment_1.default)().format('YYYY-mm-dd HH:mm:ss'); emailDoc.status = emailDoc.attempts > config.attemptsTotal ? 'archived' : 'failed'; } yield config.EmailProcessModel.query().update(emailDoc).catch(e => console.error(e)); } }); exports.processEmailList = processEmailList; const enqueueEmailList = (transportConf) => __awaiter(void 0, void 0, void 0, function* () { if (!config.SystemModel) return false; if (!config.EmailProcessModel) return false; let t9r; try { //configuration of oauth2.0 /* const sysTokens: ISystemConfigModel | null = await config.SystemModel.query().findOne({ name: 'emailTokens' }) as ISystemConfigModel | null; if (!sysTokens || !sysTokens.value) throw new Error('Email OAuth2 not configured'); const refreshToken = sysTokens.value; { service: process.env.EMAIL_SERVICE, auth: { type: 'OAuth2', user: process.env.EMAIL_USER, clientId: process.env.EMAIL_CLIENT_ID, clientSecret: process.env.EMAIL_CLIENT_SECRET, refreshToken } } */ t9r = yield new Promise((resolve, reject) => { const transporter = nodemailer_1.default.createTransport(transportConf); transporter.verify((error, success) => { if (error) { console.error('Error al conectar con el servidor SMTP:', error); reject(error); } else { console.log('Servidor está listo para enviar correos:', success); resolve(transporter); } }); }); } catch (error) { console.error('[ERROR]', error); return false; } console.log('enqueue emails'); setInterval(() => __awaiter(void 0, void 0, void 0, function* () { config.runningPriorSchedule = true; const emailList = yield config.EmailProcessModel.query() .where('order', '<=', config.priorOrder) .whereNotIn('status', ['completed', 'expired', 'archived']) .where('attempts', '<=', config.attemptsTotal) .orderBy('order', "ASC") .limit(config.maxPriorScheduling); console.log('emailList prior:', emailList.length); yield (0, exports.processEmailList)(t9r, emailList); config.runningPriorSchedule = false; }), config.priorDelay); setInterval(() => __awaiter(void 0, void 0, void 0, function* () { if (config.runningPriorSchedule) return; config.runningSchedule = true; const emailList = yield config.EmailProcessModel.query() .where('order', '>', config.priorOrder) .whereNotIn('status', ['completed', 'expired', 'archived']) .where('attempts', '<=', config.attemptsTotal) .orderBy('order', "ASC") .limit(config.maxScheduling); console.log('emailList standard:', emailList.length); yield (0, exports.processEmailList)(t9r, emailList); config.runningSchedule = false; }), config.delay); return true; }); exports.enqueueEmailList = enqueueEmailList; exports.default = sendEmail;