diff --git a/packages/component-helper-service/src/services/Collection.js b/packages/component-helper-service/src/services/Collection.js index da5501f62f064197439b80b7e6814ff024493dee..154e8f28f5f3bba1ea3f7851489a6d33ad77b60d 100644 --- a/packages/component-helper-service/src/services/Collection.js +++ b/packages/component-helper-service/src/services/Collection.js @@ -1,3 +1,7 @@ +const { findLast, get } = require('lodash') + +const Fragment = require('./Fragment') + class Collection { constructor({ collection = {} }) { this.collection = collection @@ -103,6 +107,36 @@ class Collection { const [firstName, lastName] = this.collection.handlingEditor.name.split(' ') return lastName || firstName } + + // eslint-disable-next-line class-methods-use-this + hasAtLeastOneReviewReport(fragments) { + return fragments.some(fragment => + new Fragment({ fragment }).hasReviewReport(), + ) + } + + canHEMakeRecommendation(fragments, fragmentHelper) { + if (this.collection.fragments.length === 1) { + return fragmentHelper.hasReviewReport() + } + const previousVersionRecommendations = get( + fragments[fragments.length - 2], + 'recommendations', + [], + ) + + const lastRecommendationByHE = findLast( + previousVersionRecommendations, + recommendation => + recommendation.userId === this.collection.handlingEditor.id && + recommendation.recommendationType === 'editorRecommendation', + ) + if (lastRecommendationByHE.recommendation === 'minor') { + return this.hasAtLeastOneReviewReport(fragments) + } else if (lastRecommendationByHE.recommendation === 'major') { + return fragmentHelper.hasReviewReport() + } + } } module.exports = Collection diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js index ccb5a6d7c12fa6b3ea8de897ac0b791fa7d3fe75..68ac1a9ada44f9046590f4c2f5cbd36d3ffcb0c9 100644 --- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js +++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js @@ -42,6 +42,8 @@ module.exports = models => async (req, res) => { }) } + const collectionHelper = new Collection({ collection }) + try { fragments = await Promise.all( collection.fragments.map( @@ -102,38 +104,13 @@ module.exports = models => async (req, res) => { .json({ error: 'Cannot make another recommendation on this version.' }) } - function canHEMakeRecommendation(fragmentHelper) { - if (collection.fragments.length === 1) { - return fragmentHelper.hasReviewReport() - } - const previousVersionRecommendations = get( - fragments[fragments.length - 2], - 'recommendations', - [], - ) - - const lastRecommendationByHE = findLast( - previousVersionRecommendations, - recommendation => - recommendation.userId === collection.handlingEditor.id && - recommendation.recommendationType === 'editorRecommendation', - ) - if (lastRecommendationByHE.recommendation === 'minor') { - return fragments.find(fragment => - new Fragment({ fragment }).hasReviewReport(), - ) - } else if (lastRecommendationByHE.recommendation === 'major') { - return fragmentHelper.hasReviewReport() - } - } - if ( recommendation === recommendations.publish && recommendationType === recommendations.type.editor && collection.handlingEditor && collection.handlingEditor.id === req.user ) { - if (!canHEMakeRecommendation(fragmentHelper)) { + if (!collectionHelper.canHEMakeRecommendation(fragments, fragmentHelper)) { return res.status(400).json({ error: 'Cannot publish without at least one reviewer report.', }) @@ -153,8 +130,6 @@ module.exports = models => async (req, res) => { newRecommendation.comments = comments || undefined if (recommendationType === 'editorRecommendation') { - const collectionHelper = new Collection({ collection }) - collectionHelper.updateStatusOnRecommendation({ isEditorInChief, recommendation,