adba
Version:
Any DataBase to API
207 lines (206 loc) • 8.56 kB
JavaScript
;
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;