From 6a58089415d199a9d0afaf04fff4d279d27985b3 Mon Sep 17 00:00:00 2001
From: Tania Fecheta <tania.fecheta@thinslices.com>
Date: Mon, 19 Nov 2018 21:24:03 +0200
Subject: [PATCH] fix(fragmentRecomendation/post): don't allow eic to make
 another recommendation after Return to HE d

---
 .../src/services/Fragment.js                  | 12 ++++++++-
 .../routes/fragmentsRecommendations/post.js   | 26 ++++++++++++-------
 2 files changed, 27 insertions(+), 11 deletions(-)

diff --git a/packages/component-helper-service/src/services/Fragment.js b/packages/component-helper-service/src/services/Fragment.js
index ba56f7a41..1c294af21 100644
--- a/packages/component-helper-service/src/services/Fragment.js
+++ b/packages/component-helper-service/src/services/Fragment.js
@@ -1,4 +1,4 @@
-const { get, remove } = require('lodash')
+const { get, remove, findLast, last } = require('lodash')
 const config = require('config')
 const User = require('./User')
 
@@ -150,6 +150,16 @@ class Fragment {
     )
   }
 
+  canHEMakeAnotherRecommendation(currentUserRecommendations) {
+    const lastHERecommendation = last(currentUserRecommendations)
+    const { fragment: { recommendations = [] } } = this
+    const returnToHERecommendation = findLast(
+      recommendations,
+      r => r.recommendation === 'return-to-handling-editor',
+    )
+    if (!returnToHERecommendation) return false
+    return returnToHERecommendation.createdOn > lastHERecommendation.createdOn
+  }
   async getReviewersAndEditorsData({ collection, UserModel }) {
     const {
       invitations = [],
diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js
index 80c1b7437..6221128db 100644
--- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js
+++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js
@@ -1,6 +1,6 @@
 /* eslint-disable no-return-await */
 const uuid = require('uuid')
-const { pick, get, set, has, isEmpty, last, findLast } = require('lodash')
+const { pick, get, set, has, isEmpty, last } = require('lodash')
 const config = require('config')
 const { v4 } = require('uuid')
 const logger = require('@pubsweet/logger')
@@ -63,10 +63,6 @@ module.exports = models => async (req, res) => {
     [],
   ).filter(r => r.userId === req.user)
 
-  const returnToHERecommendation = findLast(
-    get(fragment, 'recommendations', []),
-    r => r.recommendation === 'return-to-handling-editor',
-  )
   const authsome = authsomeHelper.getAuthsome(models)
   const target = {
     fragment,
@@ -104,12 +100,22 @@ module.exports = models => async (req, res) => {
       return res
         .status(400)
         .json({ error: 'Cannot write another review on this version.' })
-    } else if (
+    }
+    if (
+      recommendationType === recommendations.type.editor &&
+      !isEditorInChief &&
+      !fragmentHelper.canHEMakeAnotherRecommendation(currentUserRecommendations)
+    ) {
+      return res.status(400).json({
+        error: 'Cannot make another recommendation on this version.',
+      })
+    }
+    if (
       recommendationType === recommendations.type.editor &&
-      ((returnToHERecommendation &&
-        returnToHERecommendation.createdOn <=
-          last(currentUserRecommendations).createdOn) ||
-        !returnToHERecommendation)
+      isEditorInChief &&
+      recommendation !== recommendations.reject &&
+      last(currentUserRecommendations).recommendation ===
+        'return-to-handling-editor'
     ) {
       return res.status(400).json({
         error: 'Cannot make another recommendation on this version.',
-- 
GitLab