UNPKG

alphascript-server

Version:

CRUD operations for mongo and other functionalities to get started quickly in any CMS project

164 lines (137 loc) 5.21 kB
var api = require('../../'); var EmailTemplate = require('email-templates').EmailTemplate; var nodemailer = require('nodemailer'); var htmlToText = require('nodemailer-html-to-text').htmlToText; var moment = require('moment'); moment.locale('pt'); var transporter = nodemailer.createTransport(api.options.smtp); transporter.use('compile', htmlToText()); module.exports = { get: function (req, res) { api.common.Message.find().sort({ created_at: -1 }).limit(100).lean().exec(function (err, items) { if (err) { api.error.log(err); return res.status(500).send(api.error.DB_GENERIC); } res.json(items); }); }, send: function send(template, item, callback) { item._address = api.options.address; item._port = api.options.port; getMailOptions(template, item, function (err, mailOptions) { if (err) return callback(err); transporter.sendMail(mailOptions, function (err) { if (err) { api.error.log(err); return callback("Erro ao enviar email"); } var msg = new api.common.Message(mailOptions); msg.template = template; msg.save(function (err) { if (err) { api.error.log(err); return callback("Erro ao arquivar email em histórico"); } callback(); }); }); }); }, transporter: transporter }; function getPreferredEmail(user) { if (user.email) { return user.email; } return null; } function getRecipients(alert, user, callback) { var from = (alert.from || []).length > 0 ? alert.from[0] : "", to = [], cc = []; alert.to.forEach(function (item) { to.push(item.email); }); alert.cc.forEach(function (item) { cc.push(item.email); }); if (alert.fromSelf || alert.toSelf || alert.ccSelf) { if (!user) return callback('Não foi enviado os dados do utilizador em questão para este alerta: ' + alert.name); var _selfEmail = getPreferredEmail(user); if (alert.fromSelf) from = _selfEmail; if (alert.toSelf) to.push(_selfEmail); if (alert.ccSelf) cc.push(_selfEmail); } if (alert.fromCoordinator || alert.toCoordinator || alert.ccCoordinator) { if (!user) return callback('Não foi enviado os dados do utilizador em questão para este alerta: ' + alert.name); if (!user.owner) return callback(null, from, to, cc); api.common.User.findOne({ _id: user.owner._id }).lean().exec(function (err, coordinator) { if (err) { api.error.log(err); return callback("Impossível estabelecer ligação à base de dados de momento"); } if (!coordinator) return callback('Impossível localizar coordenador: ' + user.owner.username); var _coordinatorEmail = getPreferredEmail(coordinator); if (!_coordinatorEmail) return callback('Coordenador sem email associado: ' + coordinator._id); if (alert.fromCoordinator) from = _coordinatorEmail; if (alert.toCoordinator) to.push(_coordinatorEmail); if (alert.ccCoordinator) cc.push(_coordinatorEmail); callback(null, from, to, cc); }); } else callback(null, from, to, cc); } function getMailOptions(template, item, callback) { api.common.Alert.findOne({ template: template }).populate('attachments.document').lean().exec(function (err, alert) { if (err) { api.error.log(err); return callback("Erro ao formular email"); } if (!alert) return callback('Não existe template para o alerta: ' + template); if (!alert.active) return callback('O template para o alerta "' + template + '" está desabilitado'); getRecipients(alert, item.user, function (err, from, to, cc) { if (err) return callback(err); var emailTemplate; try { emailTemplate = new EmailTemplate(api.options.emailRoot + '/' + template); } catch (e) { api.error.log(e); return callback("Erro ao formular email"); } emailTemplate.render({ item: item, moment: moment }, function (err, email) { if (err) { api.error.log(err); return callback("Erro ao formular email"); } var attachments = []; (alert.attachments || []).forEach(function (attachment) { attachments.push({ filename: attachment.name, path: api.options.publicRoot + attachment.document.filepath, cid: attachment.cid }); }); var subject; try { subject = eval(alert.subject); } catch (e) { api.error.log(e); subject = "Email Automático - " + api.options.appName; } from = from || api.options.emailFrom; if (!from) return callback("Impossível despoletar email sem endereço de envio: " + template); if (to.length === 0) return callback('Impossível despoletar email sem endereço de destinatário: ' + template); var mailOptions = { from: from, to: to, cc: cc, bcc: api.options.emailBcc || [], subject: subject, html: email.html, attachments: attachments }; callback(null, mailOptions); }); }); }); }