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
JavaScript
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);
});
});
});
}