From df96bdf5aed1673c69c6cf535c98bfc9daf4837b Mon Sep 17 00:00:00 2001
From: Sebastian <sebastian.mihalache@thinslices.com>
Date: Tue, 20 Mar 2018 08:16:11 +0200
Subject: [PATCH] feat(component-invite): add HE global role

---
 .../src/controllers/assignCollectionRole.js       | 15 +++++++++++----
 packages/component-invite/src/helpers/Team.js     | 11 +++++++++++
 packages/component-invite/src/helpers/helpers.js  |  1 +
 .../component-invite/src/routes/postInvite.js     |  3 +--
 packages/xpub-faraday/config/default.js           |  4 ++--
 packages/xpub-faraday/config/validations.js       |  1 +
 6 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/packages/component-invite/src/controllers/assignCollectionRole.js b/packages/component-invite/src/controllers/assignCollectionRole.js
index 2dc689846..36a16362f 100644
--- a/packages/component-invite/src/controllers/assignCollectionRole.js
+++ b/packages/component-invite/src/controllers/assignCollectionRole.js
@@ -63,12 +63,19 @@ module.exports = async (
   try {
     let user = await models.User.findByEmail(email)
 
-    const team = await teamHelper.setupManuscriptTeam(
-      models,
-      user,
+    let team = teamHelper.getTeamByGroupAndCollection(
       collectionId,
       role,
+      models.Team,
     )
+    if (team === undefined) {
+      team = await teamHelper.setupManuscriptTeam(
+        models,
+        user,
+        collectionId,
+        role,
+      )
+    }
 
     // getting the updated user from the DB - creating a team also updates the user
     user = await models.User.findByEmail(email)
@@ -84,7 +91,7 @@ module.exports = async (
       return res.status(200).json(user)
     } catch (e) {
       logger.error(e)
-      return res.status(500).json({ error: 'Mailing could not be sent.' })
+      return res.status(500).json({ error: 'Mail could not be sent.' })
     }
   } catch (e) {
     const notFoundError = await helpers.handleNotFoundError(e, 'user')
diff --git a/packages/component-invite/src/helpers/Team.js b/packages/component-invite/src/helpers/Team.js
index 553b4cd75..ae6758c96 100644
--- a/packages/component-invite/src/helpers/Team.js
+++ b/packages/component-invite/src/helpers/Team.js
@@ -166,6 +166,16 @@ const getInviteData = (invitations, collectionId, role) => {
   return { timestamp, status }
 }
 
+const getTeamByGroupAndCollection = async (collectionId, role, TeamModel) => {
+  const teams = await TeamModel.all()
+  return teams.find(
+    team =>
+      team.group === role &&
+      team.object.type === 'collection' &&
+      team.object.id === collectionId,
+  )
+}
+
 module.exports = {
   createNewTeam,
   setupEiCTeams,
@@ -175,4 +185,5 @@ module.exports = {
   removeTeamMember,
   getTeamMembersByCollection,
   getInviteData,
+  getTeamByGroupAndCollection,
 }
diff --git a/packages/component-invite/src/helpers/helpers.js b/packages/component-invite/src/helpers/helpers.js
index b57511878..2ec5f5f9f 100644
--- a/packages/component-invite/src/helpers/helpers.js
+++ b/packages/component-invite/src/helpers/helpers.js
@@ -96,6 +96,7 @@ const createNewUser = async (
     title,
     editorInChief: role === 'editorInChief',
     admin: role === 'admin',
+    handlingEditor: role === 'handlingEditor',
   }
   let newUser = new UserModel(userBody)
   try {
diff --git a/packages/component-invite/src/routes/postInvite.js b/packages/component-invite/src/routes/postInvite.js
index 6c8d4de3a..c0f7b4aff 100644
--- a/packages/component-invite/src/routes/postInvite.js
+++ b/packages/component-invite/src/routes/postInvite.js
@@ -30,7 +30,7 @@ module.exports = models => async (req, res) => {
   const collectionId = get(req, 'params.collectionId')
 
   const url = `${req.protocol}://${req.get('host')}`
-  if (collectionId) {
+  if (collectionId)
     return require('../controllers/assignCollectionRole')(
       email,
       role,
@@ -40,7 +40,6 @@ module.exports = models => async (req, res) => {
       models,
       url,
     )
-  }
 
   if (reqUser.admin)
     return require('../controllers/inviteGlobalRole')(
diff --git a/packages/xpub-faraday/config/default.js b/packages/xpub-faraday/config/default.js
index f8a4b92db..db5c012a2 100644
--- a/packages/xpub-faraday/config/default.js
+++ b/packages/xpub-faraday/config/default.js
@@ -48,10 +48,10 @@ module.exports = {
     url: process.env.PUBSWEET_INVITE_PASSWORD_RESET_URL || '/invite',
   },
   roles: {
-    global: ['admin', 'editorInChief', 'author'],
+    global: ['admin', 'editorInChief', 'author', 'handlingEditor'],
     collection: ['handlingEditor', 'reviewer'],
     inviteRights: {
-      admin: ['admin', 'editorInChief', 'author'],
+      admin: ['admin', 'editorInChief', 'author', 'handlingEditor'],
       editorInChief: ['handlingEditor'],
       handlingEditor: ['reviewer'],
     },
diff --git a/packages/xpub-faraday/config/validations.js b/packages/xpub-faraday/config/validations.js
index 1ed3e06f9..550c6caa6 100644
--- a/packages/xpub-faraday/config/validations.js
+++ b/packages/xpub-faraday/config/validations.js
@@ -97,6 +97,7 @@ module.exports = {
     invitations: Joi.array(),
     teams: Joi.array(),
     editorInChief: Joi.boolean(),
+    handlingEditor: Joi.boolean(),
   },
   team: {
     group: Joi.string(),
-- 
GitLab