diff --git a/packages/component-mail-service/src/Mail.js b/packages/component-mail-service/src/Mail.js index 53a5a456e4c78e984e1e1b8d30c45d1c8dfa0fab..f6121253652f20a29125e10a19972415c9647a4b 100644 --- a/packages/component-mail-service/src/Mail.js +++ b/packages/component-mail-service/src/Mail.js @@ -4,7 +4,6 @@ const helpers = require('./helpers/helpers') const resetPasswordPath = config.get('invite-reviewer.url') const resetPath = config.get('invite-reset-password.url') -const emailSending = config.get('email-sending') module.exports = { sendSimpleEmail: async ({ @@ -132,8 +131,7 @@ module.exports = { html: htmlBody, } - if (emailSending === 'true') return Email.send(mailData) - return {} + return Email.send(mailData) }, sendReviewerInvitationEmail: async ({ user, @@ -249,8 +247,7 @@ module.exports = { text: textBody, html: htmlBody, } - if (emailSending === 'true') return Email.send(mailData) - return {} + return Email.send(mailData) }, sendNotificationEmail: async ({ toEmail, user, emailType, meta = {} }) => { let subject, textBody @@ -260,6 +257,8 @@ module.exports = { meta.baseUrl, `/projects/${meta.collection.id}/versions/${meta.fragment.id}/details`, ), + beforeAnchor: '', + afterAnchor: '', } switch (emailType) { case 'unassign-reviewer': @@ -359,7 +358,6 @@ module.exports = { }" by ${meta.fragment.authorName}.` replacements.beforeAnchor = 'You can view the full PDF file of the manuscript and post your review report using the following URL:' - replacements.afterAnchor = '' replacements.signatureName = meta.handlingEditorName textBody = `${replacements.intro} ${replacements.paragraph} ${ replacements.beforeAnchor @@ -367,6 +365,27 @@ module.exports = { replacements.signatureName }` break + case 'after-he-recommendation': + subject = `${ + meta.collection.customId + }: Manuscript Recommendation Submitted` + replacements.previewText = + 'a manuscript has received a recommendation based on reviews' + replacements.intro = `Dear Dr. ${user.firstName} ${user.lastName}` + + replacements.paragraph = `I appreciate any time you may have spent reviewing manuscript "${ + meta.fragment.title + }" by ${ + meta.fragment.authorName + }. However, an editorial decision has been made and the review of this manuscript is now complete. I apologize for any inconvenience. <br/> + If you have comments on this manuscript you believe the Editor should see, please email them to Hindawi as soon as possible. <br/> + Thank you for your interest and I hope you will consider reviewing for Hindawi again.` + delete replacements.detailsUrl + replacements.signatureName = meta.handlingEditorName + textBody = `${replacements.intro} ${replacements.paragraph} ${ + replacements.signatureName + }` + break default: subject = 'Hindawi Notification!' break @@ -379,8 +398,6 @@ module.exports = { text: textBody, html: htmlBody, } - - if (emailSending === 'true') return Email.send(mailData) - return {} + return Email.send(mailData) }, } diff --git a/packages/component-mail-service/src/helpers/helpers.js b/packages/component-mail-service/src/helpers/helpers.js index 295cd42e88f9ca01cd9a32d4bc67e2957447519c..27aec6312911c7b57bfcb629afbbfcdc490187f0 100644 --- a/packages/component-mail-service/src/helpers/helpers.js +++ b/packages/component-mail-service/src/helpers/helpers.js @@ -33,11 +33,12 @@ const getNotificationBody = (emailType, replacements) => { signatureName: replacements.signatureName, }) - handlePartial('manuscriptDetailsLink', { - beforeAnchor: replacements.beforeAnchor, - detailsUrl: replacements.detailsUrl, - afterAnchor: replacements.afterAnchor, - }) + if (replacements.detailsUrl !== undefined) + handlePartial('manuscriptDetailsLink', { + beforeAnchor: replacements.beforeAnchor, + detailsUrl: replacements.detailsUrl, + afterAnchor: replacements.afterAnchor, + }) handlePartial('notificationBody', { intro: replacements.intro, diff --git a/packages/component-mail-service/src/templates/partials/notificationBody.hbs b/packages/component-mail-service/src/templates/partials/notificationBody.hbs index e2bcdfb0d79f08c46263b138a721995456e5657d..5460c5065ee835ca465b278aba5f86e738b39092 100644 --- a/packages/component-mail-service/src/templates/partials/notificationBody.hbs +++ b/packages/component-mail-service/src/templates/partials/notificationBody.hbs @@ -5,8 +5,10 @@ <p data-pm-slice="1 1 []">{{intro}},</p> <p> </p> <p> - {{paragraph}} - {{> manuscriptDetailsLink}} + {{{paragraph}}} + {{#if detailsUrl }} + {{> manuscriptDetailsLink}} + {{/if}} </p> <p> </p> {{> signature}} diff --git a/packages/component-manuscript-manager/src/helpers/Collection.js b/packages/component-manuscript-manager/src/helpers/Collection.js index a22bffc945c47ca43104cc6d842d0e6309bf1d86..166dd37ab2ca474fcc350df4af09b338edf9574c 100644 --- a/packages/component-manuscript-manager/src/helpers/Collection.js +++ b/packages/component-manuscript-manager/src/helpers/Collection.js @@ -33,7 +33,16 @@ const getFragmentAndAuthorData = async ({ return { title, authorName, id, abstract, authorsList } } +const getAgreedReviewerInvitation = (invitations = []) => + invitations.filter( + inv => + inv.role === 'reviewer' && + inv.hasAnswer === true && + inv.isAccepted === true, + ) + module.exports = { updateStatus, getFragmentAndAuthorData, + getAgreedReviewerInvitation, } diff --git a/packages/component-manuscript-manager/src/helpers/User.js b/packages/component-manuscript-manager/src/helpers/User.js index bc9a24b9e2cc11a33e885bd40ce96dd9e6b1daad..9b37c6c2b6c85371bcf9b5ce849c09b95da4d23f 100644 --- a/packages/component-manuscript-manager/src/helpers/User.js +++ b/packages/component-manuscript-manager/src/helpers/User.js @@ -39,7 +39,44 @@ const setupReviewSubmittedEmailData = async ({ }) } +const setupAfterRecommendationEmailData = async ({ + baseUrl, + UserModel, + FragmentModel, + collection, + mailService, +}) => { + const { title, authorName } = await collectionHelper.getFragmentAndAuthorData( + { + UserModel, + FragmentModel, + collection, + }, + ) + const toEmail = collection.handlingEditor.email + const agreedReviewerInvitations = collectionHelper.getAgreedReviewerInvitation( + collection.invitations, + ) + const users = await Promise.all( + agreedReviewerInvitations.map(async inv => UserModel.find(inv.userId)), + ) + users.forEach(user => + mailService.sendNotificationEmail({ + toEmail, + user, + emailType: 'after-he-recommendation', + meta: { + collection: { customId: collection.customId }, + fragment: { title, authorName }, + handlingEditorName: collection.handlingEditor.name, + baseUrl, + }, + }), + ) +} + module.exports = { getEditorInChief, setupReviewSubmittedEmailData, + setupAfterRecommendationEmailData, } diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js index b582ad5878a63134c5dc9f30120556bfd4959468..fe6fe6b13f54aed23d9b06e3fab41edb2d5bc67e 100644 --- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js +++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js @@ -2,6 +2,8 @@ const helpers = require('../../helpers/helpers') const uuid = require('uuid') const authsomeHelper = require('../../helpers/authsome') const collectionHelper = require('../../helpers/Collection') +const userHelper = require('../../helpers/User') +const mailService = require('pubsweet-component-mail-service') module.exports = models => async (req, res) => { const { recommendation, comments, recommendationType } = req.body @@ -54,9 +56,16 @@ module.exports = models => async (req, res) => { if ( ['reject', 'publish'].includes(recommendation) && recommendationType === 'editorRecommendation' - ) + ) { + await userHelper.setupAfterRecommendationEmailData({ + baseUrl: helpers.getBaseUrl(req), + UserModel: models.User, + FragmentModel: models.Fragment, + collection, + mailService, + }) await collectionHelper.updateStatus(collection, 'pendingApproval') - + } if ( ['minor', 'major'].includes(recommendation) && recommendationType === 'editorRecommendation' diff --git a/packages/component-manuscript-manager/src/tests/fragmentsRecommendations/patch.test.js b/packages/component-manuscript-manager/src/tests/fragmentsRecommendations/patch.test.js index e40ac70a0da7968805e3c5a7d2b2bdd1f23f1584..0e3c8013b981d741859bcf134f48db99e59f7e33 100644 --- a/packages/component-manuscript-manager/src/tests/fragmentsRecommendations/patch.test.js +++ b/packages/component-manuscript-manager/src/tests/fragmentsRecommendations/patch.test.js @@ -8,7 +8,7 @@ const cloneDeep = require('lodash/cloneDeep') const requests = require('./../helpers/requests') jest.mock('pubsweet-component-mail-service', () => ({ - setupReviewSubmittedEmail: jest.fn(), + sendNotificationEmail: jest.fn(), })) const chance = new Chance() const reqBody = { diff --git a/packages/component-manuscript-manager/src/tests/fragmentsRecommendations/post.test.js b/packages/component-manuscript-manager/src/tests/fragmentsRecommendations/post.test.js index 03a9efdc34c943d5ec10e4ad8c1dff9c01a865e9..364448eb2425e07b4f0df6ebcb9de904201d0489 100644 --- a/packages/component-manuscript-manager/src/tests/fragmentsRecommendations/post.test.js +++ b/packages/component-manuscript-manager/src/tests/fragmentsRecommendations/post.test.js @@ -8,6 +8,9 @@ const cloneDeep = require('lodash/cloneDeep') const requests = require('./../helpers/requests') const chance = new Chance() +jest.mock('pubsweet-component-mail-service', () => ({ + sendNotificationEmail: jest.fn(), +})) const reqBody = { recommendation: 'accept', comments: [ diff --git a/packages/xpub-faraday/config/default.js b/packages/xpub-faraday/config/default.js index 9249e88871a368e01c3f7449eb51fa131aaae108..d0206232d69f270f4b2d6bd45277a4795f276321 100644 --- a/packages/xpub-faraday/config/default.js +++ b/packages/xpub-faraday/config/default.js @@ -127,5 +127,4 @@ module.exports = { private: 'Revision Requested', }, }, - 'email-sending': process.env.EMAIL_SENDING || false, }