From 671f6a3a34dfd2b8d4f3091b565164373bb928c9 Mon Sep 17 00:00:00 2001
From: Sebastian Mihalache <sebastian.mihalache@gmail.con>
Date: Wed, 30 May 2018 13:52:55 +0300
Subject: [PATCH] feat(component-manuscript-manager): update status after EiC
 reject

---
 .../config/test.js                            |  8 +++++++
 .../src/FragmentsRecommendations.js           | 12 +++++-----
 .../src/helpers/Collection.js                 | 24 +++++++++++++++++++
 .../routes/fragmentsRecommendations/post.js   |  6 +++++
 packages/xpub-faraday/config/authsome-mode.js |  5 ++++
 5 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/packages/component-manuscript-manager/config/test.js b/packages/component-manuscript-manager/config/test.js
index 05b1d5944..6869d659a 100644
--- a/packages/component-manuscript-manager/config/test.js
+++ b/packages/component-manuscript-manager/config/test.js
@@ -59,6 +59,14 @@ module.exports = {
       public: 'Under Review',
       private: 'Pending Approval',
     },
+    rejected: {
+      public: 'Rejected',
+      private: 'Rejected',
+    },
+    published: {
+      public: 'Published',
+      private: 'Published',
+    },
   },
   'manuscript-types': {
     research: 'Research',
diff --git a/packages/component-manuscript-manager/src/FragmentsRecommendations.js b/packages/component-manuscript-manager/src/FragmentsRecommendations.js
index 681be174d..2c5d64711 100644
--- a/packages/component-manuscript-manager/src/FragmentsRecommendations.js
+++ b/packages/component-manuscript-manager/src/FragmentsRecommendations.js
@@ -15,7 +15,7 @@ const FragmentsRecommendations = app => {
    * @apiParam {fragmentId} fragmentId Fragment id
    * @apiParamExample {json} Body
    *    {
-   *      "recommendation": "accept", [acceptedValues: accept, revise, etc.],
+   *      "recommendation": "publish", [acceptedValues: publish, reject, minor, major],
    *      "comments":
    *      [
    *        {
@@ -40,7 +40,7 @@ const FragmentsRecommendations = app => {
    *     "userId": "4c3f8ee1-785b-4adb-87b4-407a27f652c6",
    *     "createdOn": 1525428890167,
    *     "updatedOn": 1525428890167,
-   *     "recommendation": "accept", [acceptedValues: accept, revise, etc.],
+   *     "recommendation": "publish",
    *     "comments":
    *     [
    *       {
@@ -56,7 +56,7 @@ const FragmentsRecommendations = app => {
    *        ]
    *      }
    *     ],
-   *     "recommendationType": "review" [acceptedValues: review, editorRecommendation]
+   *     "recommendationType": "review"
    *   }
    * @apiErrorExample {json} Invite user errors
    *    HTTP/1.1 403 Forbidden
@@ -70,14 +70,14 @@ const FragmentsRecommendations = app => {
     require(`${routePath}/post`)(app.locals.models),
   )
   /**
-   * @api {patch} /api/collections/:collectionId/fragments/:fragmentId/recommendations/:recommendationId Create a recommendation on a fragment
+   * @api {patch} /api/collections/:collectionId/fragments/:fragmentId/recommendations/:recommendationId Modify a recommendation on a fragment
    * @apiGroup FragmentsRecommendations
    * @apiParam {collectionId} collectionId Collection id
    * @apiParam {fragmentId} fragmentId Fragment id
    * @apiParam {recommendationId} recommendationId Recommendation id
    * @apiParamExample {json} Body
    *   {
-   *     "recommendation": "accept", [acceptedValues: accept, revise, etc.],
+   *     "recommendation": "publish", [acceptedValues: publish, reject, minor, major],
    *     "comments":
    *     [
    *       {
@@ -102,7 +102,7 @@ const FragmentsRecommendations = app => {
    *     "userId": "4c3f8ee1-785b-4adb-87b4-407a27f652c6",
    *     "createdOn": 1525428890167,
    *     "updatedOn": 1525428890167,
-   *     "recommendation": "accept", [acceptedValues: accept, revise, etc.],
+   *     "recommendation": "publish",
    *     "comments":
    *     [
    *       {
diff --git a/packages/component-manuscript-manager/src/helpers/Collection.js b/packages/component-manuscript-manager/src/helpers/Collection.js
index b3897a93f..85a056a5c 100644
--- a/packages/component-manuscript-manager/src/helpers/Collection.js
+++ b/packages/component-manuscript-manager/src/helpers/Collection.js
@@ -12,6 +12,29 @@ const updateStatusByRecommendation = async (collection, recommendation) => {
   await collection.save()
 }
 
+const updateFinalStatusByRecommendation = async (
+  collection,
+  recommendation,
+) => {
+  let newStatus
+  switch (recommendation) {
+    case 'reject':
+      newStatus = 'rejected'
+      break
+    case 'publish':
+      newStatus = 'published'
+      break
+    case 'return-to-handling-editor':
+      newStatus = 'reviewCompleted'
+      break
+    default:
+      break
+  }
+  collection.status = newStatus
+  collection.visibleStatus = statuses[collection.status].private
+  await collection.save()
+}
+
 const updateStatus = async (collection, newStatus) => {
   collection.status = newStatus
   collection.visibleStatus = statuses[collection.status].private
@@ -55,4 +78,5 @@ module.exports = {
   getFragmentAndAuthorData,
   getAgreedReviewerInvitation,
   updateStatus,
+  updateFinalStatusByRecommendation,
 }
diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js
index 3e44b62e5..592c6cea7 100644
--- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js
+++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js
@@ -54,6 +54,12 @@ module.exports = models => async (req, res) => {
   newRecommendation.comments = comments || undefined
 
   if (recommendationType === 'editorRecommendation') {
+    if (reqUser.editorInChief === true) {
+      await collectionHelper.updateFinalStatusByRecommendation(
+        collection,
+        recommendation,
+      )
+    }
     await collectionHelper.updateStatusByRecommendation(
       collection,
       recommendation,
diff --git a/packages/xpub-faraday/config/authsome-mode.js b/packages/xpub-faraday/config/authsome-mode.js
index fbbea3d6a..88f4b83d3 100644
--- a/packages/xpub-faraday/config/authsome-mode.js
+++ b/packages/xpub-faraday/config/authsome-mode.js
@@ -14,6 +14,11 @@ async function teamPermissions(user, operation, object, context) {
   let collectionsPermissions = await Promise.all(
     teams.map(async team => {
       const collection = await context.models.Collection.find(team.object.id)
+      if (
+        collection.status === 'rejected' &&
+        team.teamType.permissions === 'reviewer'
+      )
+        return null
       const collPerm = {
         id: collection.id,
         permission: team.teamType.permissions,
-- 
GitLab