diff --git a/packages/component-invite/config/test.js b/packages/component-invite/config/test.js index 6da7762b05361ae72d6841628918d2864fa1e9f6..9046f749c74d8697f323149d26e1b4b9ba81ab2c 100644 --- a/packages/component-invite/config/test.js +++ b/packages/component-invite/config/test.js @@ -8,10 +8,10 @@ module.exports = { 'http://localhost:3000/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/component-invite/src/controllers/assignCollectionRole.js b/packages/component-invite/src/controllers/assignCollectionRole.js index 2dc68984601b5ab8ddf8a60ea8ae01db49434cb0..36a16362ff3ab1e7002ce38375849053bd9802a9 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 553b4cd75f9d84eceecca548b54a851a94c77331..ae6758c967a6ddb379699ffeb1332d81967b55cc 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 b575118780be1e6c3da1932adac332d543051a5b..2ec5f5f9f7d8ce52f0bba0f12417d8a3f9e09128 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 6c8d4de3a92bccf49ad4f3a4a5de8335796dafb1..c0f7b4affe79e61ee1fad8c167cd40d784c67963 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/component-invite/src/tests/postInvite.test.js b/packages/component-invite/src/tests/postInvite.test.js index 74aff28e5e9e68ecda6dd0eba2ae819d8d78f7aa..a1a4d894374154483ff55736d04bdb903b1a51b3 100644 --- a/packages/component-invite/src/tests/postInvite.test.js +++ b/packages/component-invite/src/tests/postInvite.test.js @@ -6,6 +6,9 @@ const random = require('lodash/random') const fixtures = require('./fixtures/fixtures') const Chance = require('chance') const Model = require('./helpers/Model') +const config = require('config') + +const configRoles = config.get('roles') const models = Model.build() jest.mock('pubsweet-component-mail-service', () => ({ @@ -13,9 +16,7 @@ jest.mock('pubsweet-component-mail-service', () => ({ setupAssignEmail: jest.fn(), })) const chance = new Chance() -const globalRoles = ['editorInChief', 'author', 'admin'] -const manuscriptRoles = ['handlingEditor', 'reviewer'] - +const globalRoles = configRoles.global const body = { email: chance.email(), role: globalRoles[random(0, globalRoles.length - 1)], @@ -48,7 +49,7 @@ describe('Post invite route handler', () => { expect(data.email).toEqual(body.email) expect(data.admin).toEqual(body.admin) }) - it('should return an error when the admin invites an user on a collection', async () => { + it('should return an error when the admin invites a user on a collection', async () => { const req = httpMocks.createRequest({ body, }) @@ -62,8 +63,8 @@ describe('Post invite route handler', () => { `admin cannot invite an ${body.role} to a collection`, ) }) - it('should return an error when the admin invites a manuscript role', async () => { - body.role = manuscriptRoles[random(0, manuscriptRoles.length - 1)] + it('should return an error when the admin invites a reviewer', async () => { + body.role = 'reviewer' body.admin = false const req = httpMocks.createRequest({ body, @@ -76,6 +77,7 @@ describe('Post invite route handler', () => { expect(data.error).toEqual( `admin tried to invite an invalid role: ${body.role}`, ) + body.role = globalRoles[random(0, globalRoles.length - 1)] }) it('should return an error params are missing', async () => { delete body.email diff --git a/packages/xpub-faraday/config/default.js b/packages/xpub-faraday/config/default.js index 1c1b4105179b4f8c6c16ba02a2890736b5b9283b..d6b8a057e65d92cac258106b300f973bcff68971 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 1ed3e06f9bc48bce828e3542295611e8f748b23e..550c6caa6c0ae14212271b1f57d95e431079363c 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(),