From 714c3ca1611ce5c53539c303dd2404c081546a63 Mon Sep 17 00:00:00 2001 From: Sebastian Mihalache <sebastian.mihalache@gmail.con> Date: Tue, 5 Jun 2018 15:23:22 +0300 Subject: [PATCH] feat(component-manuscript-manager): send emails on manuscript final reject --- packages/component-mail-service/src/Mail.js | 54 +++++++++++-- .../src/helpers/Collection.js | 2 +- .../src/helpers/User.js | 77 ++++++++++++------- .../routes/fragmentsRecommendations/patch.js | 2 - .../routes/fragmentsRecommendations/post.js | 59 +++++++++----- .../src/helpers/Collection.js | 2 +- .../src/helpers/User.js | 2 +- 7 files changed, 138 insertions(+), 60 deletions(-) diff --git a/packages/component-mail-service/src/Mail.js b/packages/component-mail-service/src/Mail.js index 56fd0af8b..3289fe934 100644 --- a/packages/component-mail-service/src/Mail.js +++ b/packages/component-mail-service/src/Mail.js @@ -261,11 +261,16 @@ module.exports = { let subject, textBody const emailTemplate = 'notification' + const detailsUrl = meta.baseUrl + ? helpers.createUrl( + meta.baseUrl, + `/projects/${meta.collection.id}/versions/${ + meta.fragment.id + }/details`, + ) + : '' const replacements = { - detailsUrl: helpers.createUrl( - meta.baseUrl, - `/projects/${meta.collection.id}/versions/${meta.fragment.id}/details`, - ), + detailsUrl, beforeAnchor: '', afterAnchor: '', hasLink: true, @@ -380,7 +385,7 @@ module.exports = { replacements.hasLink = false replacements.previewText = 'a manuscript has received a recommendation based on reviews' - replacements.intro = `Dear Dr. ${user.firstName} ${user.lastName}` + replacements.intro = `Dear Dr. ${meta.reviewerName}` replacements.paragraph = `I appreciate any time you may have spent reviewing manuscript "${ meta.fragment.title @@ -390,12 +395,11 @@ module.exports = { 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 + replacements.signatureName = meta.editorName textBody = `${replacements.intro} ${replacements.paragraph} ${ replacements.signatureName }` break - case 'no-response-reviewers-after-recommendation': subject = meta.emailSubject replacements.hasLink = false @@ -464,6 +468,42 @@ module.exports = { replacements.signatureName }` break + case 'he-manuscript-rejected': + subject = meta.emailSubject + replacements.hasLink = false + replacements.previewText = 'a manuscript has been rejected' + replacements.intro = `Dear Dr. ${meta.handlingEditorName}` + + replacements.paragraph = `Thank you for your recommendation to reject the manuscript titled "${ + meta.fragment.title + }" by ${ + meta.fragment.authorName + } based on the reviews you received.<br/><br/> + I can confirm this article has now been rejected.` + delete replacements.detailsUrl + replacements.signatureName = meta.eicName + textBody = `${replacements.intro} ${replacements.paragraph} ${ + replacements.signatureName + }` + break + case 'submitting-reviewers-after-decision': + subject = meta.emailSubject + replacements.hasLink = false + replacements.previewText = 'a decision has been made on a manuscript' + replacements.intro = `Dear Dr. ${meta.reviewerName}` + + replacements.paragraph = `Thank you for your review on the manuscript titled "${ + meta.fragment.title + }" by ${ + meta.fragment.authorName + }. After taking into account the reviews and the recommendation of the Handling Editor, I can confirm this article has now been rejected.<br/><br/> + If you have any queries about this decision, then please email them to Hindawi as soon as possible.` + delete replacements.detailsUrl + replacements.signatureName = meta.editorName + textBody = `${replacements.intro} ${replacements.paragraph} ${ + replacements.signatureName + }` + break default: subject = 'Hindawi Notification!' break diff --git a/packages/component-manuscript-manager/src/helpers/Collection.js b/packages/component-manuscript-manager/src/helpers/Collection.js index ed03809ef..b5e783c80 100644 --- a/packages/component-manuscript-manager/src/helpers/Collection.js +++ b/packages/component-manuscript-manager/src/helpers/Collection.js @@ -43,7 +43,7 @@ const updateStatus = async (collection, newStatus) => { const getFragmentAndAuthorData = async ({ UserModel, fragment, - collection: { fragments, authors, handlingEditor }, + collection: { authors, handlingEditor }, }) => { const heRecommendation = fragment.recommendations.find( rec => rec.userId === handlingEditor.id, diff --git a/packages/component-manuscript-manager/src/helpers/User.js b/packages/component-manuscript-manager/src/helpers/User.js index 573e16978..5d51a7ae7 100644 --- a/packages/component-manuscript-manager/src/helpers/User.js +++ b/packages/component-manuscript-manager/src/helpers/User.js @@ -1,7 +1,7 @@ const collectionHelper = require('./Collection') const get = require('lodash/get') -const last = require('lodash/last') const config = require('config') +const mailService = require('pubsweet-component-mail-service') const manuscriptTypes = config.get('manuscript-types') const getEditorInChief = async UserModel => { @@ -16,7 +16,6 @@ const setupReviewSubmittedEmailData = async ({ fragment: { id, title, submittingAuthor }, collection, user, - mailService, }) => { const eic = await getEditorInChief(UserModel) const toEmail = collection.handlingEditor.email @@ -40,14 +39,12 @@ const setupReviewSubmittedEmailData = async ({ }) } -const setupAgreedReviewersEmailData = async ({ - baseUrl, - fragment: { title, authorName }, +const setupReviewersEmail = async ({ + fragment: { title, authorName, recommendations }, collection, - mailService, UserModel, - FragmentModel, recommendation, + isSubmitted = false, }) => { const agreedReviewerInvitations = collectionHelper.getAgreedReviewerInvitation( collection.invitations, @@ -56,28 +53,33 @@ const setupAgreedReviewersEmailData = async ({ rec.recommendationType === 'review' && rec.submittedOn && invUserId === rec.userId - const userPromises = await agreedReviewerInvitations.map(async inv => { - const fragmentId = last(collection.fragments) - const fragment = await FragmentModel.find(fragmentId) - const submittedReview = fragment.recommendations.find(hasReview(inv.userId)) - if (submittedReview === undefined) return UserModel.find(inv.userId) + const reviewerPromises = await agreedReviewerInvitations.map(async inv => { + const submittedReview = recommendations.find(hasReview(inv.userId)) + const shouldReturnUser = + (isSubmitted && submittedReview) || (!isSubmitted && !submittedReview) + if (shouldReturnUser) return UserModel.find(inv.userId) }) - let users = await Promise.all(userPromises) - users = users.filter(Boolean) - const subject = `${collection.customId}: Manuscript ${getSubject( - recommendation, - )}` - users.forEach(user => + let reviewers = await Promise.all(reviewerPromises) + reviewers = reviewers.filter(Boolean) + const subject = isSubmitted + ? `${collection.customId}: Manuscript Decision` + : `${collection.customId}: Manuscript ${getSubject(recommendation)}` + const emailType = isSubmitted + ? 'submitting-reviewers-after-decision' + : 'agreed-reviewers-after-recommendation' + const eic = await getEditorInChief(UserModel) + const editorName = isSubmitted + ? `${eic.firstName} ${eic.lastName}` + : collection.handlingEditor.name + reviewers.forEach(user => mailService.sendNotificationEmail({ toEmail: user.email, - user, - emailType: 'agreed-reviewers-after-recommendation', + emailType, meta: { - collection: { customId: collection.customId }, fragment: { title, authorName }, - handlingEditorName: collection.handlingEditor.name, - baseUrl, + editorName, emailSubject: subject, + reviewerName: `${user.firstName} ${user.lastName}`, }, }), ) @@ -87,7 +89,6 @@ const setupNoResponseReviewersEmailData = async ({ baseUrl, fragment: { title, authorName, type }, collection, - mailService, UserModel, }) => { const invitations = collection.invitations.filter( @@ -122,7 +123,6 @@ const setupEiCRecommendationEmailData = async ({ UserModel, fragment: { id, title, authorName }, collection, - mailService, recommendation, comments, }) => { @@ -172,7 +172,6 @@ const setupAuthorsEmailData = async ({ UserModel, fragment: { id, title, submittingAuthor }, collection, - mailService, comments, requestToRevision = false, }) => { @@ -217,6 +216,29 @@ const setupAuthorsEmailData = async ({ }) } +const setupManuscriptRejectedEmailForHe = async ({ + UserModel, + fragment: { title, submittingAuthor }, + collection: { customId, handlingEditor }, +}) => { + const eic = await getEditorInChief(UserModel) + const toEmail = handlingEditor.email + await mailService.sendNotificationEmail({ + toEmail, + emailType: 'he-manuscript-rejected', + meta: { + emailSubject: `${customId}: Manuscript Decision`, + fragment: { + title, + authorName: `${submittingAuthor.firstName} ${ + submittingAuthor.lastName + }`, + }, + handlingEditorName: handlingEditor.name, + eicName: `${eic.firstName} ${eic.lastName}`, + }, + }) +} const getSubject = recommendation => ['minor', 'major'].includes(recommendation) ? 'Revision Requested' @@ -233,8 +255,9 @@ const getHeRecommendation = recommendation => { module.exports = { getEditorInChief, setupReviewSubmittedEmailData, - setupAgreedReviewersEmailData, + setupReviewersEmail, setupEiCRecommendationEmailData, setupAuthorsEmailData, setupNoResponseReviewersEmailData, + setupManuscriptRejectedEmailForHe, } diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/patch.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/patch.js index 0fc06e4a4..97ee0a9f2 100644 --- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/patch.js +++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/patch.js @@ -2,7 +2,6 @@ const helpers = require('../../helpers/helpers') 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 { collectionId, fragmentId, recommendationId } = req.params @@ -51,7 +50,6 @@ module.exports = models => async (req, res) => { fragment: { id: fragment.id, title, submittingAuthor }, collection, user, - mailService, }) if (!['pendingApproval', 'revisionRequested'].includes(collection.status)) await collectionHelper.updateStatus(collection, 'reviewCompleted') diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js index 6f568ec15..f3653eb33 100644 --- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js +++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js @@ -3,7 +3,6 @@ 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') const get = require('lodash/get') module.exports = models => async (req, res) => { @@ -51,18 +50,22 @@ module.exports = models => async (req, res) => { newRecommendation.recommendation = recommendation || undefined newRecommendation.comments = comments || undefined + const UserModel = models.User + const { title, submittingAuthor, type, heRecommendation, } = await collectionHelper.getFragmentAndAuthorData({ - UserModel: models.User, + UserModel, fragment, collection, }) const baseUrl = helpers.getBaseUrl(req) - + const authorName = `${submittingAuthor.firstName} ${ + submittingAuthor.lastName + }` if (reqUser.editorInChief || reqUser.admin) { if (recommendation === 'return-to-handling-editor') await collectionHelper.updateStatus(collection, 'reviewCompleted') @@ -71,45 +74,60 @@ module.exports = models => async (req, res) => { collection, recommendation, ) - if (recommendation !== 'publish') + if (recommendation === 'reject') { await userHelper.setupAuthorsEmailData({ baseUrl, - UserModel: models.User, + UserModel, collection, - mailService, fragment: { title, submittingAuthor }, comments: get(heRecommendation, 'comments'), requestToRevision: false, }) + await userHelper.setupManuscriptRejectedEmailForHe({ + UserModel, + fragment: { title, submittingAuthor }, + collection: { + customId: collection.customId, + handlingEditor: collection.handlingEditor, + }, + }) + await userHelper.setupReviewersEmail({ + UserModel, + collection, + fragment: { + title, + authorName, + recommendations: fragment.recommendations, + }, + recommendation, + isSubmitted: true, + }) + } } else if (recommendationType === 'editorRecommendation') { await collectionHelper.updateStatusByRecommendation( collection, recommendation, ) - const authorName = `${submittingAuthor.firstName} ${ - submittingAuthor.lastName - }` - await userHelper.setupAgreedReviewersEmailData({ - baseUrl, - UserModel: models.User, - FragmentModel: models.Fragment, + await userHelper.setupReviewersEmail({ + UserModel, collection, - mailService, - fragment: { title, authorName }, + fragment: { + title, + authorName, + recommendations: fragment.recommendations, + }, recommendation, }) await userHelper.setupNoResponseReviewersEmailData({ baseUrl, - UserModel: models.User, + UserModel, collection, - mailService, fragment: { title, authorName, type }, }) await userHelper.setupEiCRecommendationEmailData({ baseUrl, - UserModel: models.User, + UserModel, collection, - mailService, recommendation, fragment: { title, id: fragment.id, authorName }, comments: newRecommendation.comments, @@ -117,9 +135,8 @@ module.exports = models => async (req, res) => { if (['minor', 'major'].includes(recommendation)) await userHelper.setupAuthorsEmailData({ baseUrl, - UserModel: models.User, + UserModel, collection, - mailService, fragment: { title, id: fragment.id, submittingAuthor }, comments: newRecommendation.comments, requestToRevision: true, diff --git a/packages/component-user-manager/src/helpers/Collection.js b/packages/component-user-manager/src/helpers/Collection.js index 44f6724a4..c20799452 100644 --- a/packages/component-user-manager/src/helpers/Collection.js +++ b/packages/component-user-manager/src/helpers/Collection.js @@ -27,7 +27,7 @@ module.exports = { return res.status(200).json(user) } try { - await mailService.sendSimpleEmail({ + mailService.sendSimpleEmail({ toEmail: user.email, user, emailType: 'add-author', diff --git a/packages/component-user-manager/src/helpers/User.js b/packages/component-user-manager/src/helpers/User.js index aa2cfb6aa..41077ba17 100644 --- a/packages/component-user-manager/src/helpers/User.js +++ b/packages/component-user-manager/src/helpers/User.js @@ -24,7 +24,7 @@ module.exports = { ) try { - await mailService.sendSimpleEmail({ + mailService.sendSimpleEmail({ toEmail: newUser.email, user: newUser, emailType: invitationType, -- GitLab