diff --git a/packages/component-helper-service/src/services/Fragment.js b/packages/component-helper-service/src/services/Fragment.js index ba56f7a41f116f412842fa721f2336cf6430f169..1c294af21f0a50bc14fbe9de6ab254134f0c708d 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 80c1b743799a457857c17c7a58388e5109ccab2f..6221128db3ad56a31f659d1294051313ebbf7cd1 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.',