From 3bc728088b0ee223d7996ba361845bab8aed809f Mon Sep 17 00:00:00 2001 From: Sebastian <sebastian.mihalache@thinslices.com> Date: Thu, 22 Mar 2018 15:47:47 +0200 Subject: [PATCH] feat(component-invite): resend invitation --- .../src/controllers/assignCollectionRole.js | 36 ++++++++++++++----- packages/component-invite/src/helpers/Team.js | 6 ++++ .../component-invite/src/routes/postInvite.js | 1 - .../src/tests/postInvite.test.js | 27 +++++++++++++- 4 files changed, 60 insertions(+), 10 deletions(-) diff --git a/packages/component-invite/src/controllers/assignCollectionRole.js b/packages/component-invite/src/controllers/assignCollectionRole.js index 2dc689846..98b44fd47 100644 --- a/packages/component-invite/src/controllers/assignCollectionRole.js +++ b/packages/component-invite/src/controllers/assignCollectionRole.js @@ -14,6 +14,7 @@ module.exports = async ( collectionId, models, url, + resend, ) => { if (reqUser.admin) { logger.error(`admin tried to invite a ${role} to a collection`) @@ -62,17 +63,36 @@ module.exports = async ( try { let user = await models.User.findByEmail(email) - - const team = await teamHelper.setupManuscriptTeam( - models, - user, - collectionId, - role, - ) + let team + if (resend === 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) - user = await teamHelper.setupInvitation(user, role, collectionId, team.id) + + if (user.invitations === undefined) { + user = await teamHelper.setupInvitation(user, role, collectionId, team.id) + } else { + const matchingInvitation = teamHelper.getMatchingInvitation( + user.invitations, + collectionId, + role, + ) + if (matchingInvitation === undefined) { + user = await teamHelper.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..c2d1924a6 100644 --- a/packages/component-invite/src/helpers/Team.js +++ b/packages/component-invite/src/helpers/Team.js @@ -166,6 +166,11 @@ const getInviteData = (invitations, collectionId, role) => { return { timestamp, status } } +const getMatchingInvitation = (invitations, collectionId, role) => + invitations.find( + invite => invite.type === role && invite.collectionId === collectionId, + ) + module.exports = { createNewTeam, setupEiCTeams, @@ -175,4 +180,5 @@ module.exports = { removeTeamMember, getTeamMembersByCollection, getInviteData, + getMatchingInvitation, } diff --git a/packages/component-invite/src/routes/postInvite.js b/packages/component-invite/src/routes/postInvite.js index 6c8d4de3a..d588b7eb2 100644 --- a/packages/component-invite/src/routes/postInvite.js +++ b/packages/component-invite/src/routes/postInvite.js @@ -28,7 +28,6 @@ module.exports = models => async (req, res) => { return } const collectionId = get(req, 'params.collectionId') - const url = `${req.protocol}://${req.get('host')}` if (collectionId) { return require('../controllers/assignCollectionRole')( diff --git a/packages/component-invite/src/tests/postInvite.test.js b/packages/component-invite/src/tests/postInvite.test.js index 74aff28e5..202c13615 100644 --- a/packages/component-invite/src/tests/postInvite.test.js +++ b/packages/component-invite/src/tests/postInvite.test.js @@ -30,7 +30,13 @@ const notFoundError = new Error() notFoundError.name = 'NotFoundError' notFoundError.status = 404 -const { admin, editorInChief, handlingEditor, author } = fixtures.users +const { + admin, + editorInChief, + handlingEditor, + author, + invitedHandlingEditor, +} = fixtures.users const { standardCollection } = fixtures.collections const postInvitePath = '../routes/postInvite' describe('Post invite route handler', () => { @@ -216,4 +222,23 @@ describe('Post invite route handler', () => { const data = JSON.parse(res._getData()) expect(data.error).toEqual(`Role ${body.role} is invalid`) }) + it('should return success when the EiC resends an invitation to a handlingEditor with a collection', async () => { + const body = { + email: invitedHandlingEditor.email, + role: 'handlingEditor', + } + const req = httpMocks.createRequest({ + body, + }) + req.user = editorInChief.id + req.params.collectionId = standardCollection.id + const res = httpMocks.createResponse() + await require(postInvitePath)(models)(req, res) + + expect(res.statusCode).toBe(200) + const data = JSON.parse(res._getData()) + expect(data.email).toEqual(body.email) + expect(data.invitations[0].collectionId).toEqual(req.params.collectionId) + expect(data.invitations).toHaveLength(1) + }) }) -- GitLab