From 0b4d9ec630230dfd5a3f1dd9f02cc61acd679e7e Mon Sep 17 00:00:00 2001
From: Sebastian Mihalache <sebastian.mihalache@gmail.con>
Date: Tue, 10 Jul 2018 17:07:50 +0300
Subject: [PATCH] feat(component-manuscript-manager): move new version into
 fragment revision property

---
 .../src/services/Email.js                     |  2 --
 .../src/services/Fragment.js                  | 16 +++++++++++
 .../src/routes/fragments/patch.js             | 28 +++++++++----------
 .../routes/fragmentsRecommendations/post.js   | 10 ++++++-
 packages/xpub-faraday/config/validations.js   |  1 +
 5 files changed, 39 insertions(+), 18 deletions(-)

diff --git a/packages/component-helper-service/src/services/Email.js b/packages/component-helper-service/src/services/Email.js
index e3ea6688a..ed67564d2 100644
--- a/packages/component-helper-service/src/services/Email.js
+++ b/packages/component-helper-service/src/services/Email.js
@@ -46,12 +46,10 @@ class Email {
     const reviewerInvitations = fragmentHelper.getReviewerInvitations({
       agree,
     })
-
     const hasReview = invUserId => rec =>
       rec.recommendationType === 'review' &&
       rec.submittedOn &&
       invUserId === rec.userId
-
     const reviewerPromises = await reviewerInvitations.map(async inv => {
       if (!agree) return UserModel.find(inv.userId)
       const submittedReview = recommendations.find(hasReview(inv.userId))
diff --git a/packages/component-helper-service/src/services/Fragment.js b/packages/component-helper-service/src/services/Fragment.js
index 6e418ee90..da6f9e1f3 100644
--- a/packages/component-helper-service/src/services/Fragment.js
+++ b/packages/component-helper-service/src/services/Fragment.js
@@ -106,6 +106,22 @@ class Fragment {
         (rec.recommendation === 'minor' || rec.recommendation === 'major'),
     )
   }
+
+  async getInvitationsForSubmittingReviewers() {
+    const { fragment: { recommendations = [] } } = this
+    const agreedInvitations = this.getReviewerInvitations({
+      agree: true,
+    })
+
+    return agreedInvitations.filter(async inv =>
+      recommendations.find(hasReview(inv.userId)),
+    )
+  }
 }
 
+const hasReview = invUserId => rec =>
+  rec.recommendationType === 'review' &&
+  rec.submittedOn &&
+  invUserId === rec.userId
+
 module.exports = Fragment
diff --git a/packages/component-manuscript-manager/src/routes/fragments/patch.js b/packages/component-manuscript-manager/src/routes/fragments/patch.js
index af3511344..e6770f009 100644
--- a/packages/component-manuscript-manager/src/routes/fragments/patch.js
+++ b/packages/component-manuscript-manager/src/routes/fragments/patch.js
@@ -19,13 +19,13 @@ module.exports = models => async (req, res) => {
       return res.status(400).json({
         error: `Collection and fragment do not match.`,
       })
-    const fragLength = collection.fragments.length
-    if (fragLength < 2) {
+
+    fragment = await models.Fragment.find(fragmentId)
+    if (!fragment.revision) {
       return res.status(400).json({
-        error: 'No previous version has been found.',
+        error: 'No revision has been found.',
       })
     }
-    fragment = await models.Fragment.find(fragmentId)
 
     const authsome = authsomeHelper.getAuthsome(models)
     const target = {
@@ -47,7 +47,10 @@ module.exports = models => async (req, res) => {
     })
     const userHelper = new User({ UserModel: models.User })
 
-    const reviewerIds = fragment.invitations.map(inv => {
+    let newFragment = new models.Fragment(fragment.revision)
+    newFragment = await newFragment.save()
+
+    const reviewerIds = newFragment.invitations.map(inv => {
       const { userId } = inv
       return userId
     })
@@ -65,7 +68,7 @@ module.exports = models => async (req, res) => {
       }),
     )
 
-    const authorIds = fragment.authors.map(auth => {
+    const authorIds = newFragment.authors.map(auth => {
       const { id } = auth
       return id
     })
@@ -89,15 +92,10 @@ module.exports = models => async (req, res) => {
     authorIds.forEach(id =>
       userHelper.updateUserTeams({
         userId: id,
-        teamId: reviewersTeam.id,
+        teamId: authorsTeam.id,
       }),
     )
 
-    const previousFragment = await models.Fragment.find(
-      collection.fragments[fragLength - 2],
-    )
-    fragmentHelper.fragment = previousFragment
-
     const heRecommendation = fragmentHelper.getHeRequestToRevision()
     if (!heRecommendation) {
       return res.status(400).json({
@@ -109,8 +107,8 @@ module.exports = models => async (req, res) => {
       recommendation: heRecommendation.recommendation,
     })
 
-    fragment.submitted = Date.now()
-    fragment = await fragment.save()
+    newFragment.submitted = Date.now()
+    newFragment = await newFragment.save()
 
     const parsedFragment = await fragmentHelper.getFragmentData({
       handlingEditor: collection.handlingEditor,
@@ -137,7 +135,7 @@ module.exports = models => async (req, res) => {
       })
     }
 
-    return res.status(200).json(fragment)
+    return res.status(200).json(newFragment)
   } catch (e) {
     const notFoundError = await services.handleNotFoundError(e, 'Item')
     return res.status(notFoundError.status).json({
diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js
index 53ae3e904..cd16e330d 100644
--- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js
+++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js
@@ -1,5 +1,5 @@
 const uuid = require('uuid')
-const { chain } = require('lodash')
+const { chain, cloneDeep } = require('lodash')
 const {
   Email,
   services,
@@ -120,7 +120,15 @@ module.exports = models => async (req, res) => {
       recommendation,
       comments: newRecommendation.comments,
     })
+
     if (['minor', 'major'].includes(recommendation)) {
+      if (recommendation === 'major') {
+        fragment.revision = cloneDeep(fragment)
+        delete fragment.revision.recommendations
+        delete fragment.revision.id
+        fragment.revision.invitations = await fragmentHelper.getInvitationsForSubmittingReviewers()
+      }
+
       email.parsedFragment.newComments = newRecommendation.comments
       email.setupAuthorsEmail({
         requestToRevision: true,
diff --git a/packages/xpub-faraday/config/validations.js b/packages/xpub-faraday/config/validations.js
index fa6222be8..7dbe9d6b2 100644
--- a/packages/xpub-faraday/config/validations.js
+++ b/packages/xpub-faraday/config/validations.js
@@ -111,6 +111,7 @@ module.exports = {
           ),
         }),
       ),
+      revision: Joi.object(),
     },
   ],
   user: {
-- 
GitLab