diff --git a/packages/component-helper-service/src/services/Email.js b/packages/component-helper-service/src/services/Email.js index e3ea6688ae4056120140770cb81343f139670034..ed67564d236aa90984de2a9790d95a35cca66a24 100644 --- a/packages/component-helper-service/src/services/Email.js +++ b/packages/component-helper-service/src/services/Email.js @@ -46,12 +46,10 @@ class Email { const reviewerInvitations = fragmentHelper.getReviewerInvitations({ agree, }) - const hasReview = invUserId => rec => rec.recommendationType === 'review' && rec.submittedOn && invUserId === rec.userId - const reviewerPromises = await reviewerInvitations.map(async inv => { if (!agree) return UserModel.find(inv.userId) const submittedReview = recommendations.find(hasReview(inv.userId)) diff --git a/packages/component-helper-service/src/services/Fragment.js b/packages/component-helper-service/src/services/Fragment.js index 6e418ee90f6d1e80bf308e16e9c89f627efeaaa4..da6f9e1f32b4f91425d4b1701f66b5eb0ab37ca1 100644 --- a/packages/component-helper-service/src/services/Fragment.js +++ b/packages/component-helper-service/src/services/Fragment.js @@ -106,6 +106,22 @@ class Fragment { (rec.recommendation === 'minor' || rec.recommendation === 'major'), ) } + + async getInvitationsForSubmittingReviewers() { + const { fragment: { recommendations = [] } } = this + const agreedInvitations = this.getReviewerInvitations({ + agree: true, + }) + + return agreedInvitations.filter(async inv => + recommendations.find(hasReview(inv.userId)), + ) + } } +const hasReview = invUserId => rec => + rec.recommendationType === 'review' && + rec.submittedOn && + invUserId === rec.userId + module.exports = Fragment diff --git a/packages/component-manuscript-manager/src/routes/fragments/patch.js b/packages/component-manuscript-manager/src/routes/fragments/patch.js index af3511344a735f5a4d303bbfa6423a99eeb6293f..e6770f009b07a6636c132ff6b04fc4417df48624 100644 --- a/packages/component-manuscript-manager/src/routes/fragments/patch.js +++ b/packages/component-manuscript-manager/src/routes/fragments/patch.js @@ -19,13 +19,13 @@ module.exports = models => async (req, res) => { return res.status(400).json({ error: `Collection and fragment do not match.`, }) - const fragLength = collection.fragments.length - if (fragLength < 2) { + + fragment = await models.Fragment.find(fragmentId) + if (!fragment.revision) { return res.status(400).json({ - error: 'No previous version has been found.', + error: 'No revision has been found.', }) } - fragment = await models.Fragment.find(fragmentId) const authsome = authsomeHelper.getAuthsome(models) const target = { @@ -47,7 +47,10 @@ module.exports = models => async (req, res) => { }) const userHelper = new User({ UserModel: models.User }) - const reviewerIds = fragment.invitations.map(inv => { + let newFragment = new models.Fragment(fragment.revision) + newFragment = await newFragment.save() + + const reviewerIds = newFragment.invitations.map(inv => { const { userId } = inv return userId }) @@ -65,7 +68,7 @@ module.exports = models => async (req, res) => { }), ) - const authorIds = fragment.authors.map(auth => { + const authorIds = newFragment.authors.map(auth => { const { id } = auth return id }) @@ -89,15 +92,10 @@ module.exports = models => async (req, res) => { authorIds.forEach(id => userHelper.updateUserTeams({ userId: id, - teamId: reviewersTeam.id, + teamId: authorsTeam.id, }), ) - const previousFragment = await models.Fragment.find( - collection.fragments[fragLength - 2], - ) - fragmentHelper.fragment = previousFragment - const heRecommendation = fragmentHelper.getHeRequestToRevision() if (!heRecommendation) { return res.status(400).json({ @@ -109,8 +107,8 @@ module.exports = models => async (req, res) => { recommendation: heRecommendation.recommendation, }) - fragment.submitted = Date.now() - fragment = await fragment.save() + newFragment.submitted = Date.now() + newFragment = await newFragment.save() const parsedFragment = await fragmentHelper.getFragmentData({ handlingEditor: collection.handlingEditor, @@ -137,7 +135,7 @@ module.exports = models => async (req, res) => { }) } - return res.status(200).json(fragment) + return res.status(200).json(newFragment) } catch (e) { const notFoundError = await services.handleNotFoundError(e, 'Item') return res.status(notFoundError.status).json({ diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js index 53ae3e90411ee519901840258d8776a40ef9aeee..cd16e330d7bf6bd47eb07b5bc235339451b555f2 100644 --- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js +++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js @@ -1,5 +1,5 @@ const uuid = require('uuid') -const { chain } = require('lodash') +const { chain, cloneDeep } = require('lodash') const { Email, services, @@ -120,7 +120,15 @@ module.exports = models => async (req, res) => { recommendation, comments: newRecommendation.comments, }) + if (['minor', 'major'].includes(recommendation)) { + if (recommendation === 'major') { + fragment.revision = cloneDeep(fragment) + delete fragment.revision.recommendations + delete fragment.revision.id + fragment.revision.invitations = await fragmentHelper.getInvitationsForSubmittingReviewers() + } + email.parsedFragment.newComments = newRecommendation.comments email.setupAuthorsEmail({ requestToRevision: true, diff --git a/packages/xpub-faraday/config/validations.js b/packages/xpub-faraday/config/validations.js index fa6222be84d3181f4942373e7b06a7b6cb6f9b3d..7dbe9d6b2ce22637c2b4404522868fcaf6a8dc9f 100644 --- a/packages/xpub-faraday/config/validations.js +++ b/packages/xpub-faraday/config/validations.js @@ -111,6 +111,7 @@ module.exports = { ), }), ), + revision: Joi.object(), }, ], user: {