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