From d9e1baa1042b45099a6d8c2fef98383f592f9fa7 Mon Sep 17 00:00:00 2001
From: Sebastian Mihalache <sebastian.mihalache@gmail.con>
Date: Thu, 21 Jun 2018 16:57:43 +0300
Subject: [PATCH] feat(component-manuscript-manager): create team for new
 fragment

---
 .../src/services/Fragment.js                  |  4 ++
 .../src/services/Team.js                      | 23 +++++++
 .../src/services/User.js                      |  6 ++
 .../src/routes/fragments/patch.js             | 60 +++++++++++++++++++
 packages/xpub-faraday/config/authsome-mode.js |  2 +-
 5 files changed, 94 insertions(+), 1 deletion(-)

diff --git a/packages/component-helper-service/src/services/Fragment.js b/packages/component-helper-service/src/services/Fragment.js
index 078aa44fa..d41e1c456 100644
--- a/packages/component-helper-service/src/services/Fragment.js
+++ b/packages/component-helper-service/src/services/Fragment.js
@@ -5,6 +5,10 @@ class Fragment {
     this.fragment = fragment
   }
 
+  set _fragment(newFragment) {
+    this.fragment = newFragment
+  }
+
   async getFragmentData({ handlingEditor = {} }) {
     const { fragment: { metadata = {}, recommendations = [], id } } = this
     const heRecommendation = recommendations.find(
diff --git a/packages/component-helper-service/src/services/Team.js b/packages/component-helper-service/src/services/Team.js
index 9d8d6148a..9679b4854 100644
--- a/packages/component-helper-service/src/services/Team.js
+++ b/packages/component-helper-service/src/services/Team.js
@@ -136,6 +136,29 @@ class Team {
     await user.save()
     await collection.save()
   }
+
+  createOrUpdateTeamForNewVersion({ role, iterable }) {
+    iterable.forEach(async obj => {
+      let { userId } = obj
+      if (role === 'author') {
+        userId = obj.id
+      }
+      let team = await this.getTeam({
+        role,
+        objectType: 'fragment',
+      })
+      if (team) {
+        team.members.push(userId)
+        team.save()
+      } else {
+        team = this.createTeam({
+          role,
+          userId,
+          objectType: 'fragment',
+        })
+      }
+    })
+  }
 }
 
 module.exports = Team
diff --git a/packages/component-helper-service/src/services/User.js b/packages/component-helper-service/src/services/User.js
index 7d9d3e520..d165dae7e 100644
--- a/packages/component-helper-service/src/services/User.js
+++ b/packages/component-helper-service/src/services/User.js
@@ -61,6 +61,12 @@ class User {
     const eic = users.find(user => user.editorInChief || user.admin)
     return eic
   }
+
+  async updateUserTeams({ userId, teamId }) {
+    const user = await this.UserModel.find(userId)
+    user.teams.push(teamId)
+    user.save()
+  }
 }
 
 module.exports = User
diff --git a/packages/component-manuscript-manager/src/routes/fragments/patch.js b/packages/component-manuscript-manager/src/routes/fragments/patch.js
index 2dfa426ea..3edf6c601 100644
--- a/packages/component-manuscript-manager/src/routes/fragments/patch.js
+++ b/packages/component-manuscript-manager/src/routes/fragments/patch.js
@@ -1,4 +1,6 @@
 const {
+  Team,
+  User,
   services,
   Fragment,
   Collection,
@@ -30,6 +32,64 @@ module.exports = models => async (req, res) => {
 
     const collectionHelper = new Collection({ collection })
     const fragmentHelper = new Fragment({ fragment })
+    const teamHelper = new Team({
+      TeamModel: models.Team,
+      collectionId,
+      fragmentId,
+    })
+
+    fragment.authors = fragment.authors || []
+    teamHelper.createOrUpdateTeamForNewVersion({
+      role: 'author',
+      iterable: fragment.authors,
+    })
+
+    const authorsTeam = await teamHelper.getTeam({
+      role: 'author',
+      objectType: 'fragment',
+    })
+
+    const userHelper = new User({ UserModel: models.User })
+    if (authorsTeam) {
+      fragment.authors.forEach(author => {
+        userHelper.updateUserTeams({
+          userId: author.id,
+          teamId: authorsTeam.id,
+        })
+      })
+    }
+
+    fragment.invitations = fragment.invitations || []
+    teamHelper.createOrUpdateTeamForNewVersion({
+      role: 'reviewer',
+      iterable: fragment.invitations,
+    })
+
+    const reviewersTeam = await teamHelper.getTeam({
+      role: 'reviewer',
+      objectType: 'fragment',
+    })
+
+    if (reviewersTeam) {
+      fragment.invitations.forEach(inv => {
+        userHelper.updateUserTeams({
+          userId: inv.userId,
+          teamId: reviewersTeam.id,
+        })
+      })
+    }
+
+    const fragLength = collection.fragments.length
+    if (fragLength < 2) {
+      return res.status(400).json({
+        error: 'No previous version has been found.',
+      })
+    }
+
+    const previousFragment = await models.Fragment.find(
+      collection.fragments[fragLength - 2],
+    )
+    fragmentHelper.fragment = previousFragment
 
     const heRecommendation = fragmentHelper.getHeRequestToRevision()
     if (!heRecommendation) {
diff --git a/packages/xpub-faraday/config/authsome-mode.js b/packages/xpub-faraday/config/authsome-mode.js
index 65787b60b..2a2aa6ad7 100644
--- a/packages/xpub-faraday/config/authsome-mode.js
+++ b/packages/xpub-faraday/config/authsome-mode.js
@@ -278,7 +278,7 @@ const authsomeMode = async (userId, operation, object, context) => {
   const user = await context.models.User.find(userId)
 
   // Admins and editor in chiefs can do anything
-  // if (user && (user.admin || user.editorInChief)) return true
+  if (user && (user.admin || user.editorInChief)) return true
 
   if (user) {
     return authenticatedUser(user, operation, object, context)
-- 
GitLab