diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js index c0301c0d5162d064f9b89c3fc660f1d745562b3f..c2a2d99bdd590cafe9895440156803dcec6f3fb8 100644 --- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js +++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js @@ -1,3 +1,4 @@ +/* eslint-disable no-return-await */ const uuid = require('uuid') const { pick, get, set, has, isEmpty, last } = require('lodash') const config = require('config') @@ -42,7 +43,7 @@ module.exports = models => async (req, res) => { const { collectionId, fragmentId } = req.params - let collection, fragment + let collection, fragment, fragments try { collection = await models.Collection.find(collectionId) @@ -58,6 +59,19 @@ module.exports = models => async (req, res) => { }) } + try { + fragments = await Promise.all( + collection.fragments.map( + async fragment => await models.Fragment.find(fragment), + ), + ) + } catch (e) { + const notFoundError = await services.handleNotFoundError(e, 'Item') + fragments = [] + return res.status(notFoundError.status).json({ + error: notFoundError.message, + }) + } const authsome = authsomeHelper.getAuthsome(models) const target = { fragment, @@ -87,6 +101,13 @@ module.exports = models => async (req, res) => { .json({ error: 'Cannot write a review on an older version.' }) } + const lastRecommendationByHE = last( + get(fragments[fragments.length - 2], 'recommendations', []) || + [].find( + recommendation => + recommendation.recommendationType === 'editorRecommendation', + ), + ) if ( recommendation === recommendations.publish && recommendationType === recommendations.type.editor && @@ -94,10 +115,21 @@ module.exports = models => async (req, res) => { collection.handlingEditor.id === req.user ) { const fragmentHelper = new Fragment({ fragment }) - if (!fragmentHelper.hasReviewReport()) { - return res - .status(400) - .json({ error: 'Cannot publish without at least one reviewer report.' }) + const canHeMakeRecommendationAfterMajor = + fragmentHelper.hasReviewReport() && + lastRecommendationByHE.recommendation === 'major' + + const collectionHasReview = fragments.find(fragment => + new Fragment({ fragment }).hasReviewReport(), + ) + const canHeMakeRecommendationAfterMinor = + collectionHasReview && lastRecommendationByHE.recommendation !== 'major' + if ( + !(canHeMakeRecommendationAfterMajor || canHeMakeRecommendationAfterMinor) + ) { + return res.status(400).json({ + error: 'Cannot publish without at least one reviewer report.', + }) } }