From e3cf29a9759ec1a6182d7c74cfdee09a189e70d3 Mon Sep 17 00:00:00 2001
From: Sebastian <sebastian.mihalache@thinslices.com>
Date: Tue, 20 Mar 2018 20:45:29 +0200
Subject: [PATCH] feat(component-invite): delete invitation

---
 .../component-invite/src/HandleInvitation.js  |  5 +++
 .../src/controllers/assignCollectionRole.js   |  3 +-
 packages/component-invite/src/helpers/Team.js | 38 +++++--------------
 .../src/routes/getCollectionUsers.js          |  3 +-
 .../src/tests/fixtures/teamIDs.js             | 10 ++---
 .../src/tests/fixtures/teams.js               |  7 ++--
 .../src/tests/fixtures/users.js               | 14 +++----
 7 files changed, 33 insertions(+), 47 deletions(-)

diff --git a/packages/component-invite/src/HandleInvitation.js b/packages/component-invite/src/HandleInvitation.js
index d3c5c3733..7ecdd0caf 100644
--- a/packages/component-invite/src/HandleInvitation.js
+++ b/packages/component-invite/src/HandleInvitation.js
@@ -15,6 +15,11 @@ const HandleInvitation = app => {
     authBearer,
     require('./routes/getCollectionUsers')(app.locals.models),
   )
+  app.delete(
+    '/api/collections/:collectionId/users/:userId',
+    authBearer,
+    require('./routes/deleteInvitation')(app.locals.models),
+  )
 }
 
 module.exports = HandleInvitation
diff --git a/packages/component-invite/src/controllers/assignCollectionRole.js b/packages/component-invite/src/controllers/assignCollectionRole.js
index 2dc689846..0b7a2dd2b 100644
--- a/packages/component-invite/src/controllers/assignCollectionRole.js
+++ b/packages/component-invite/src/controllers/assignCollectionRole.js
@@ -3,6 +3,7 @@ const config = require('config')
 const helpers = require('../helpers/helpers')
 const teamHelper = require('../helpers/Team')
 const mailService = require('pubsweet-component-mail-service')
+const inviteHelper = require('../helpers/Invitation')
 
 const configRoles = config.get('roles')
 
@@ -72,7 +73,7 @@ module.exports = async (
 
     // getting the updated user from the DB - creating a team also updates the user
     user = await models.User.findByEmail(email)
-    user = await teamHelper.setupInvitation(user, role, collectionId, team.id)
+    user = await inviteHelper.setupInvitation(user, role, collectionId, team.id)
 
     try {
       await mailService.setupAssignEmail(
diff --git a/packages/component-invite/src/helpers/Team.js b/packages/component-invite/src/helpers/Team.js
index 553b4cd75..18684f566 100644
--- a/packages/component-invite/src/helpers/Team.js
+++ b/packages/component-invite/src/helpers/Team.js
@@ -113,26 +113,12 @@ const getMatchingTeams = (teams, TeamModel, collectionId, role) =>
     })
     .filter(Boolean)
 
-const setupInvitation = async (user, role, collectionId, teamId) => {
-  const invitation = {
-    type: role,
-    hasAnswer: false,
-    isAccepted: false,
-    collectionId,
-    timestamp: Date.now(),
-    teamId,
-  }
-  user.invitations = user.invitations || []
-  user.invitations.push(invitation)
-  user = await user.save()
-  return user
-}
-
 const removeTeamMember = async (teamId, userId, TeamModel) => {
   const team = await TeamModel.find(teamId)
   const members = team.members.filter(member => member !== userId)
   team.members = members
   await TeamModel.updateProperties(team)
+
   await team.save()
 }
 
@@ -151,19 +137,14 @@ const getTeamMembersByCollection = async (collectionId, role, TeamModel) => {
   return members
 }
 
-const getInviteData = (invitations, collectionId, role) => {
-  const matchingInvitation = invitations.find(
-    invite => invite.type === role && invite.collectionId === collectionId,
+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,
   )
-  let status = 'pending'
-  if (matchingInvitation.isAccepted) {
-    status = 'accepted'
-  } else if (matchingInvitation.hasAnswer) {
-    status = 'refused'
-  }
-
-  const { timestamp } = matchingInvitation
-  return { timestamp, status }
 }
 
 module.exports = {
@@ -171,8 +152,7 @@ module.exports = {
   setupEiCTeams,
   setupManuscriptTeam,
   getMatchingTeams,
-  setupInvitation,
   removeTeamMember,
   getTeamMembersByCollection,
-  getInviteData,
+  getTeamByGroupAndCollection,
 }
diff --git a/packages/component-invite/src/routes/getCollectionUsers.js b/packages/component-invite/src/routes/getCollectionUsers.js
index 16903452e..94570732b 100644
--- a/packages/component-invite/src/routes/getCollectionUsers.js
+++ b/packages/component-invite/src/routes/getCollectionUsers.js
@@ -1,6 +1,7 @@
 const helpers = require('../helpers/helpers')
 const teamHelper = require('../helpers/Team')
 const config = require('config')
+const inviteHelper = require('../helpers/Invitation')
 
 const configRoles = config.get('roles')
 module.exports = models => async (req, res) => {
@@ -39,7 +40,7 @@ module.exports = models => async (req, res) => {
 
     const membersData = members.map(async member => {
       const user = await models.User.find(member)
-      const { timestamp, status } = teamHelper.getInviteData(
+      const { timestamp, status } = inviteHelper.getInviteData(
         user.invitations,
         collectionId,
         role,
diff --git a/packages/component-invite/src/tests/fixtures/teamIDs.js b/packages/component-invite/src/tests/fixtures/teamIDs.js
index f8e1c9f22..74f1842bb 100644
--- a/packages/component-invite/src/tests/fixtures/teamIDs.js
+++ b/packages/component-invite/src/tests/fixtures/teamIDs.js
@@ -1,10 +1,10 @@
 const Chance = require('chance')
 
 const chance = new Chance()
+const heID = chance.guid()
+const revID = chance.guid()
 
-const teamIDs = {
-  heTeam: chance.guid(),
-  reviewerTeam: chance.guid(),
+module.exports = {
+  heTeamID: heID,
+  reviewerTeamID: revID,
 }
-
-module.exports = { teamIDs }
diff --git a/packages/component-invite/src/tests/fixtures/teams.js b/packages/component-invite/src/tests/fixtures/teams.js
index 84de7cd6b..460e42f67 100644
--- a/packages/component-invite/src/tests/fixtures/teams.js
+++ b/packages/component-invite/src/tests/fixtures/teams.js
@@ -1,7 +1,6 @@
 const users = require('./users')
 const collections = require('./collections')
-const { heTeam, reviewerTeam } = require('./teamIDs')
-
+const { heTeamID, reviewerTeamID } = require('./teamIDs')
 const { standardCollection } = collections
 const { editorInChief, handlingEditor, reviewer, invitedHandlingEditor } = users
 const teams = {
@@ -34,7 +33,7 @@ const teams = {
     members: [handlingEditor.id, invitedHandlingEditor.id],
     save: jest.fn(() => teams.heTeam),
     updateProperties: jest.fn(() => teams.heTeam),
-    id: heTeam,
+    id: heTeamID,
   },
   reviewerTeam: {
     teamType: {
@@ -50,7 +49,7 @@ const teams = {
     members: [reviewer.id],
     save: jest.fn(() => teams.reviewerTeam),
     updateProperties: jest.fn(() => teams.reviewerTeam),
-    id: reviewerTeam,
+    id: reviewerTeamID,
   },
 }
 module.exports = teams
diff --git a/packages/component-invite/src/tests/fixtures/users.js b/packages/component-invite/src/tests/fixtures/users.js
index a04b7ff4c..53e00485e 100644
--- a/packages/component-invite/src/tests/fixtures/users.js
+++ b/packages/component-invite/src/tests/fixtures/users.js
@@ -1,5 +1,5 @@
 const { standardCollection } = require('./collections')
-const { heTeam, reviewerTeam } = require('./teamIDs')
+const { heTeamID, reviewerTeamID } = require('./teamIDs')
 
 const users = {
   admin: {
@@ -42,10 +42,10 @@ const users = {
         isAccepted: false,
         collectionId: standardCollection.id,
         timestamp: Date.now(),
-        teamId: heTeam,
+        teamId: heTeamID,
       },
     ],
-    teams: [heTeam],
+    teams: [heTeamID],
     save: jest.fn(() => users.handlingEditor),
     editorInChief: false,
   },
@@ -78,7 +78,7 @@ const users = {
     title: 'Ms',
     save: jest.fn(() => users.reviewer),
     isConfirmed: false,
-    teams: [reviewerTeam],
+    teams: [reviewerTeamID],
     invitations: [
       {
         type: 'reviewer',
@@ -86,7 +86,7 @@ const users = {
         isAccepted: false,
         collectionId: '123',
         timestamp: Date.now(),
-        teamId: reviewerTeam,
+        teamId: reviewerTeamID,
       },
     ],
   },
@@ -106,10 +106,10 @@ const users = {
         isAccepted: false,
         collectionId: standardCollection.id,
         timestamp: Date.now(),
-        teamId: heTeam,
+        teamId: heTeamID,
       },
     ],
-    teams: [heTeam],
+    teams: [heTeamID],
     save: jest.fn(() => users.handlingEditor),
     editorInChief: false,
   },
-- 
GitLab