From 80ee6b0f9ab894f7351a1f4c3fd99155a497cce3 Mon Sep 17 00:00:00 2001
From: Sebastian Mihalache <sebastian.mihalache@gmail.con>
Date: Tue, 3 Jul 2018 15:01:41 +0300
Subject: [PATCH] fix email bugs and reviewers copy

---
 .../src/services/Email.js                     |  8 +-
 .../src/services/Team.js                      | 41 ++-------
 .../src/routes/fragments/patch.js             | 91 ++++++++++---------
 .../component-wizard/src/redux/conversion.js  |  9 +-
 4 files changed, 71 insertions(+), 78 deletions(-)

diff --git a/packages/component-helper-service/src/services/Email.js b/packages/component-helper-service/src/services/Email.js
index 64e5bfe6f..e3ea6688a 100644
--- a/packages/component-helper-service/src/services/Email.js
+++ b/packages/component-helper-service/src/services/Email.js
@@ -31,14 +31,16 @@ class Email {
     isSubmitted = false,
     isRevision = false,
     recommendation = {},
+    newFragmentId = '',
   }) {
     const {
       baseUrl,
       UserModel,
       collection,
-      parsedFragment: { recommendations, title, type, id },
+      parsedFragment: { recommendations, title, type },
       authors: { submittingAuthor: { firstName = '', lastName = '' } },
     } = this
+    let { parsedFragment: { id } } = this
     const fragment = await FragmentModel.find(id)
     const fragmentHelper = new Fragment({ fragment })
     const reviewerInvitations = fragmentHelper.getReviewerInvitations({
@@ -85,6 +87,7 @@ class Email {
         emailType = 'submitting-reviewers-after-revision'
         subject = `${collection.customId}: Manuscript Update`
         editorName = collection.handlingEditor.name
+        id = newFragmentId || id
       }
     } else {
       subject = `${collection.customId}: Reviewer Unassigned`
@@ -108,6 +111,7 @@ class Email {
           fragment: {
             title,
             authorName: `${firstName} ${lastName}`,
+            id,
           },
         },
       }),
@@ -397,7 +401,7 @@ class Email {
     const eic = await userHelper.getEditorInChief()
 
     mailService.sendNotificationEmail({
-      toEmail: eic.email,
+      toEmail: collection.handlingEditor.email,
       emailType: 'new-version-submitted',
       meta: {
         baseUrl,
diff --git a/packages/component-helper-service/src/services/Team.js b/packages/component-helper-service/src/services/Team.js
index 3b208c4b6..2e27f9a14 100644
--- a/packages/component-helper-service/src/services/Team.js
+++ b/packages/component-helper-service/src/services/Team.js
@@ -8,7 +8,7 @@ class Team {
     this.collectionId = collectionId
   }
 
-  async createTeam({ role, userId, objectType }) {
+  async createTeam({ role = '', members = [], objectType = '' }) {
     const { fragmentId, TeamModel, collectionId } = this
     const objectId = objectType === 'collection' ? collectionId : fragmentId
 
@@ -44,7 +44,7 @@ class Team {
         type: objectType,
         id: objectId,
       },
-      members: [userId],
+      members,
     }
     let team = new TeamModel(teamBody)
     team = await team.save()
@@ -79,7 +79,11 @@ class Team {
         logger.error(e)
       }
     } else {
-      const team = await this.createTeam({ role, userId: user.id, objectType })
+      const team = await this.createTeam({
+        role,
+        members: [user.id],
+        objectType,
+      })
       user.teams.push(team.id)
       await user.save()
       return team
@@ -136,37 +140,6 @@ class Team {
     await user.save()
     await collection.save()
   }
-
-  async createOrUpdateTeamForNewVersion({ role, iterable }) {
-    const userIds = await Promise.all(
-      iterable.map(async obj => {
-        let { userId } = obj
-        if (role === 'author') {
-          userId = obj.id
-        }
-        return userId
-      }),
-    )
-
-    await Promise.all(
-      userIds.map(async id => {
-        const team = await this.getTeam({
-          role,
-          objectType: 'fragment',
-        })
-        if (team) {
-          team.members.push(id)
-          await team.save()
-        } else {
-          await this.createTeam({
-            role,
-            userId: id,
-            objectType: 'fragment',
-          })
-        }
-      }),
-    )
-  }
 }
 
 module.exports = Team
diff --git a/packages/component-manuscript-manager/src/routes/fragments/patch.js b/packages/component-manuscript-manager/src/routes/fragments/patch.js
index 155a5bdae..d32334dcf 100644
--- a/packages/component-manuscript-manager/src/routes/fragments/patch.js
+++ b/packages/component-manuscript-manager/src/routes/fragments/patch.js
@@ -7,6 +7,7 @@ const {
   Collection,
   authsome: authsomeHelper,
 } = require('pubsweet-component-helper-service')
+const union = require('lodash/union')
 
 module.exports = models => async (req, res) => {
   const { collectionId, fragmentId } = req.params
@@ -44,48 +45,54 @@ module.exports = models => async (req, res) => {
       collectionId,
       fragmentId,
     })
+    const userHelper = new User({ UserModel: models.User })
 
-    fragment.authors = fragment.authors || []
-    await teamHelper.createOrUpdateTeamForNewVersion({
-      role: 'author',
-      iterable: fragment.authors,
+    const reviewerIds = fragment.invitations.map(inv => {
+      const { userId } = inv
+      return userId
     })
 
-    const authorsTeam = await teamHelper.getTeam({
-      role: 'author',
+    const reviewersTeam = await teamHelper.createTeam({
+      role: 'reviewer',
+      members: reviewerIds,
       objectType: 'fragment',
     })
 
-    const userHelper = new User({ UserModel: models.User })
-    if (authorsTeam) {
-      fragment.authors.forEach(async author => {
-        await userHelper.updateUserTeams({
-          userId: author.id,
-          teamId: authorsTeam.id,
-        })
-      })
-    }
+    reviewerIds.forEach(id =>
+      userHelper.updateUserTeams({
+        userId: id,
+        teamId: reviewersTeam.id,
+      }),
+    )
 
-    fragment.invitations = fragment.invitations || []
-    await teamHelper.createOrUpdateTeamForNewVersion({
-      role: 'reviewer',
-      iterable: fragment.invitations,
+    const authorIds = fragment.authors.map(auth => {
+      const { id } = auth
+      return id
     })
 
-    const reviewersTeam = await teamHelper.getTeam({
-      role: 'reviewer',
+    let authorsTeam = await teamHelper.getTeam({
+      role: 'author',
       objectType: 'fragment',
     })
 
-    if (reviewersTeam) {
-      fragment.invitations.forEach(async inv => {
-        await userHelper.updateUserTeams({
-          userId: inv.userId,
-          teamId: reviewersTeam.id,
-        })
+    if (!authorsTeam) {
+      authorsTeam = await teamHelper.createTeam({
+        role: 'author',
+        members: authorIds,
+        objectType: 'fragment',
       })
+    } else {
+      authorsTeam.members = union(authorsTeam.members, authorIds)
+      await authorsTeam.save()
     }
 
+    authorIds.forEach(id =>
+      userHelper.updateUserTeams({
+        userId: id,
+        teamId: reviewersTeam.id,
+      }),
+    )
+
     const previousFragment = await models.Fragment.find(
       collection.fragments[fragLength - 2],
     )
@@ -105,26 +112,28 @@ module.exports = models => async (req, res) => {
     fragment.submitted = Date.now()
     fragment = await fragment.save()
 
+    const parsedFragment = await fragmentHelper.getFragmentData({
+      handlingEditor: collection.handlingEditor,
+    })
+    const authors = await fragmentHelper.getAuthorData({
+      UserModel: models.User,
+    })
+    const email = new Email({
+      authors,
+      collection,
+      parsedFragment,
+      UserModel: models.User,
+      baseUrl: services.getBaseUrl(req),
+    })
+    email.setupNewVersionSubmittedEmail()
+
     if (heRecommendation.recommendation === 'major') {
-      const parsedFragment = await fragmentHelper.getFragmentData({
-        handlingEditor: collection.handlingEditor,
-      })
-      const authors = await fragmentHelper.getAuthorData({
-        UserModel: models.User,
-      })
-      const email = new Email({
-        authors,
-        collection,
-        parsedFragment,
-        UserModel: models.User,
-        baseUrl: services.getBaseUrl(req),
-      })
-      email.setupNewVersionSubmittedEmail()
       email.setupReviewersEmail({
         agree: true,
         isRevision: true,
         isSubmitted: true,
         FragmentModel: models.Fragment,
+        newFragmentId: fragment.id,
       })
     }
 
diff --git a/packages/component-wizard/src/redux/conversion.js b/packages/component-wizard/src/redux/conversion.js
index a7d861b8e..b88ae87c8 100644
--- a/packages/component-wizard/src/redux/conversion.js
+++ b/packages/component-wizard/src/redux/conversion.js
@@ -84,10 +84,17 @@ export const createRevision = (
   history,
 ) => dispatch => {
   // copy invitations only if minor revision
-  const { id, submitted, recommendations, ...prev } = previousVersion
+  const {
+    id,
+    submitted,
+    recommendations,
+    invitations,
+    ...prev
+  } = previousVersion
   return dispatch(
     actions.createFragment(collection, {
       ...prev,
+      invitations: invitations.filter(inv => inv.isAccepted),
       created: new Date(),
       version: previousVersion.version + 1,
     }),
-- 
GitLab