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