@hicoder/express-core
Version:
Restful API exposure middleware for Express and Mongoose based framework. Provide Rest API automatically based on Mongoose schema. It can also work with angular-core to develop end to end MEAN stack web applications.
169 lines (156 loc) • 4.31 kB
JavaScript
function emailAllErrorExternal(req, res, next, emailAllResult, err) {
if (
emailAllResult.success + emailAllResult.fail + emailAllResult.queuing >
0
) {
emailAllResult.error = err;
return res.send(emailAllResult);
}
return next(err);
}
function emailAllCheckExternal(req, restController) {
let body = req.body;
if (typeof body === 'string') {
try {
body = JSON.parse(body);
} catch (e) {
throw createError(400, 'Bad document in body.');
}
}
const actionData = body ? body.actionData : {};
const {
emailInput,
emailTemplate,
subject,
content,
emailFields,
emailFieldsRefArray,
emailFieldsRefObj,
} = actionData;
let badRequest = false;
let badRequestMsg = ''
if (emailInput === 'template') {
if (!emailTemplate) {
badRequest = true;
badRequestMsg = 'template is not provided'
}
} else if (emailInput === 'compose') {
if (!subject || !content) {
badRequest = true;
badRequestMsg = 'content or subject is not provided'
}
} else {
badRequest = true;
badRequestMsg = 'neither a template or a composed email'
}
if (emailFields.length == 0 && (!emailFieldsRefArray || emailFieldsRefArray.length == 0)) {
badRequest = true;
badRequestMsg = 'no email recipients is defined'
}
if (badRequest) {
throw createError(400, `Bad action data for emailing: ${badRequestMsg}`);
}
const { emailer, emailerObj } = restController.mddsProperties || {};
if (!emailer) {
throw createError(503, 'Emailing service is not available');
}
return actionData;
}
async function emailAllExternal(req, rows, restController) {
const {
emailInput,
emailTemplate,
subject,
content,
emailFields,
emailFieldsRefArray,
emailFieldsRefObj,
} = emailAllCheckExternal(req, restController);
const { emailer, emailerObj, replacement } =
restController.mddsProperties;
if (!emailFields) {
emailFields = [];
}
if (!emailFieldsRefArray) {
emailFieldsRefArray = [];
}
const recipients = [];
const substitutions = [];
for (let i = 0; i < rows.length; i++) {
for (let j = 0; j < emailFields.length; j++) {
const emailField = emailFields[j];
const eml = rows[i][emailField];
if (eml) {
recipients.push(eml);
substitutions.push(rows[i]);
}
}
for (let j = 0; j < emailFieldsRefArray.length; j++) {
const emailFieldRef = emailFieldsRefArray[j];
const emailFieldsForRef = emailFieldsRefObj[emailFieldRef];
let rowRefField = rows[i][emailFieldRef];
for (let k = 0; k < emailFieldsForRef.length; k++) {
const emailField = emailFieldsForRef[k];
let objs = [];
if (Array.isArray(rowRefField)) {
objs = rowRefField;
} else if (typeof rowRefField === 'object') {
objs = [rowRefField];
} else if (typeof rowRefField === 'string') {
// This is an _id
throw new Error(`Field ${emailFieldRef} is not populated. Add it to the brief view.`);
}
for (let o of objs) {
const eml = o[emailField];
if (eml) {
recipients.push(eml);
substitutions.push(rows[i]);
}
}
}
}
}
// filter emails and send
try {
let result;
if (emailInput === 'template') {
result = await emailer.sendEmailTemplate(
recipients,
emailTemplate,
replacement || emailerObj || {},
substitutions
);
} else {
result = await emailer.sendEmail(
undefined,
recipients,
subject,
content,
replacement || emailerObj || {},
substitutions
);
}
// result: {success: 1, fail: 0, queuing: 1, errors: []}
let err = new Error(`Email send failed: unknown error.`);
if (result.errors.length > 0) {
err = result.errors[0];
}
if (result.success + result.fail + result.queuing >= 0) {
return {
success: result.success,
queuing: result.queuing,
fail: result.fail,
error: err,
};
} else {
throw err;
}
} catch (err2) {
throw err2;
}
}
module.exports = {
emailAllCheckExternal,
emailAllErrorExternal,
emailAllExternal,
};