UNPKG

@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
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, };