From 2c4677fcdce99e13d429c8cae46dbc9d7f7715f1 Mon Sep 17 00:00:00 2001
From: Mihail Hagiu <mihail.hagiu@thinslices.com>
Date: Wed, 14 Nov 2018 18:02:06 +0200
Subject: [PATCH] fix(ReviewerNumbering): Moved getReviewerNumber logic on
 component-helper-service (WIP)

---
 .../src/services/Collection.js                | 56 +++++++++++++++++++
 .../routes/fragmentsRecommendations/post.js   | 53 +++---------------
 2 files changed, 64 insertions(+), 45 deletions(-)

diff --git a/packages/component-helper-service/src/services/Collection.js b/packages/component-helper-service/src/services/Collection.js
index d4a4310b2..76cea5e62 100644
--- a/packages/component-helper-service/src/services/Collection.js
+++ b/packages/component-helper-service/src/services/Collection.js
@@ -1,3 +1,5 @@
+const { flatten, isEmpty, maxBy, get } = require('lodash')
+
 class Collection {
   constructor({ collection = {} }) {
     this.collection = collection
@@ -103,6 +105,60 @@ class Collection {
     const [firstName, lastName] = this.collection.handlingEditor.name.split(' ')
     return lastName || firstName
   }
+
+  async getAllCollectionFragments({ FragmentModel }) {
+    const allCollectionFragments = await Promise.all(
+      this.collection.fragments.map(async fragmentId => {
+        const fragment = await FragmentModel.find(fragmentId)
+        return fragment
+      }),
+    )
+    return allCollectionFragments
+  }
+
+  async getAllCollectionInvitations({ FragmentModel }) {
+    const allCollectionFragments = await this.getAllCollectionFragments({
+      FragmentModel,
+    })
+    const allCollectionInvitations = flatten(
+      allCollectionFragments.map(fragment => fragment.invitations),
+    )
+    return allCollectionInvitations
+  }
+
+  async getAllNumberedInvitationsForUser({ reqUser, FragmentModel }) {
+    const allCollectionInvitations = await this.getAllCollectionInvitations({
+      FragmentModel,
+    })
+    return allCollectionInvitations
+      .filter(invite => invite.userId === reqUser.id)
+      .filter(invite => invite.reviewerNumber)
+  }
+
+  async getMaxReviewerNumber({ FragmentModel }) {
+    const allCollectionInvitations = await this.getAllCollectionInvitations({
+      FragmentModel,
+    })
+    const maxReviewerNumber = get(
+      maxBy(allCollectionInvitations, 'reviewerNumber'),
+      'reviewerNumber',
+      0,
+    )
+    return maxReviewerNumber
+  }
+
+  async getReviewerNumber({ reqUser, FragmentModel }) {
+    // maybe i should get fragments here and pass them further
+    const allNumberedInvitationsForUser = await this.getAllNumberedInvitationsForUser(
+      {
+        reqUser,
+        FragmentModel,
+      },
+    )
+    if (isEmpty(allNumberedInvitationsForUser))
+      return this.getMaxReviewerNumber() + 1
+    return allNumberedInvitationsForUser[0].reviewerNumber
+  }
 }
 
 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 bc186e353..922f7c700 100644
--- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js
+++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js
@@ -1,15 +1,5 @@
 const uuid = require('uuid')
-const {
-  pick,
-  get,
-  set,
-  has,
-  isEmpty,
-  last,
-  findIndex,
-  maxBy,
-  flatten,
-} = require('lodash')
+const { pick, get, set, has, isEmpty, last, findIndex } = require('lodash')
 const config = require('config')
 const { v4 } = require('uuid')
 
@@ -42,31 +32,6 @@ const sendMTSPackage = async (collection, fragment, isEQA = false) => {
 
 const Notification = require('../../notifications/notification')
 
-const getReviewerNumber = async ({ collection, fragment, models, reqUser }) => {
-  const allCollectionFragments = await Promise.all(
-    collection.fragments.map(async fragmentId => {
-      const fragment = await models.Fragment.find(fragmentId)
-      return fragment
-    }),
-  )
-  const allCollectionInvitations = flatten(
-    allCollectionFragments.map(fragment => fragment.invitations),
-  )
-  const allNumberedUserInvitations = allCollectionInvitations
-    .filter(invite => invite.userId === reqUser.id)
-    .filter(invite => invite.reviewerNumber)
-
-  if (!isEmpty(allNumberedUserInvitations))
-    return allNumberedUserInvitations[0].reviewerNumber
-
-  const maxReviewerNumber = get(
-    maxBy(allCollectionInvitations, 'reviewerNumber'),
-    'reviewerNumber',
-    0,
-  )
-  return maxReviewerNumber + 1
-}
-
 module.exports = models => async (req, res) => {
   const { recommendation, comments, recommendationType } = req.body
   if (!services.checkForUndefinedParams(recommendationType))
@@ -148,9 +113,8 @@ module.exports = models => async (req, res) => {
   newRecommendation.recommendation = recommendation || undefined
   newRecommendation.comments = comments || undefined
 
+  const collectionHelper = new Collection({ collection })
   if (recommendationType === 'editorRecommendation') {
-    const collectionHelper = new Collection({ collection })
-
     collectionHelper.updateStatusOnRecommendation({
       isEditorInChief,
       recommendation,
@@ -237,15 +201,14 @@ module.exports = models => async (req, res) => {
     'userId',
     reqUser.id,
   ])
-  if (invitationIndex >= 0)
-    fragment.invitations[
-      invitationIndex
-    ].reviewerNumber = await getReviewerNumber({
-      collection,
-      fragment,
-      models,
+  if (invitationIndex >= 0) {
+    const FragmentModel = models.Fragment
+    const reviewerNumber = await collectionHelper.getReviewerNumber({
       reqUser,
+      FragmentModel,
     })
+    fragment.invitations[invitationIndex].reviewerNumber = reviewerNumber
+  }
   fragment.recommendations.push(newRecommendation)
   fragment.save()
 
-- 
GitLab