diff --git a/packages/component-invite/src/controllers/assignCollectionRole.js b/packages/component-invite/src/controllers/assignCollectionRole.js index cccf36662b9113cdcffd9b4bd2ccfd2feb0d637a..aa194324155156c40f30ed7945d2118a51876a8b 100644 --- a/packages/component-invite/src/controllers/assignCollectionRole.js +++ b/packages/component-invite/src/controllers/assignCollectionRole.js @@ -47,7 +47,8 @@ module.exports = async ( isAccepted: false, collectionId, } - user.assignation = assignation + user.assignations = [] + user.assignations.push(assignation) user = await user.save() await mailService.setupAssignEmail( user.email, diff --git a/packages/component-invite/src/routes/postAssignation.js b/packages/component-invite/src/routes/postAssignation.js index 17f841bbbab57cbb0e693a406c04bfe0b95905a2..5829a21ed5f3c2da7e7edb7c56f21a577e839bea 100644 --- a/packages/component-invite/src/routes/postAssignation.js +++ b/packages/component-invite/src/routes/postAssignation.js @@ -11,31 +11,35 @@ module.exports = models => async (req, res) => { } const user = await models.User.find(req.user) - if (!user.assignation) { + if (!user.assignations) { res.status(400).json({ error: 'The user has no assignation' }) logger.error('The request user does not have any assignation') return } const { collectionId } = req.params - if (collectionId !== user.assignation.collectionId) { + const assignations = user.assignations.filter( + assignation => assignation.collectionId === collectionId, + ) + + if (assignations.length === 0) { res.status(400).json({ - error: 'User collection and provided collection do not match', + error: `Collection ${collectionId} does not match any user assignation`, }) logger.error( - `Param ${collectionId} does not match user collection: ${ - user.assignation.collectionId - }`, + `Collection ${collectionId} does not match any user assignation`, ) return } - if (type !== user.assignation.type) { + const matchingAssignation = assignations[0] + + if (type !== matchingAssignation.type) { res.status(400).json({ error: 'User assignation type and provided type do not match', }) logger.error( `Param ${type} does not match user assignation type: ${ - user.assignation.type + matchingAssignation.type }`, ) return @@ -44,9 +48,9 @@ module.exports = models => async (req, res) => { try { await models.Collection.find(collectionId) // TODO: create a team and add the team id to the user's teams array - user.assignation.hasAnswer = true + matchingAssignation.hasAnswer = true if (accept === true) { - user.assignation.isAccepted = true + matchingAssignation.isAccepted = true } await user.save() res.status(204).json() diff --git a/packages/component-invite/src/tests/fixtures/users.js b/packages/component-invite/src/tests/fixtures/users.js index 012d67453bf27075f7e643e09d995d76f7b8ffd8..b918c91c60b44252d28d7750280dc3ffc4a5c616 100644 --- a/packages/component-invite/src/tests/fixtures/users.js +++ b/packages/component-invite/src/tests/fixtures/users.js @@ -31,11 +31,13 @@ const users = { admin: false, id: 'handling123', roles: ['handlingEditor'], - assignation: { - type: 'handlingEditor', - hasAnswer: false, - isAccepted: false, - }, + assignations: [ + { + type: 'handlingEditor', + hasAnswer: false, + isAccepted: false, + }, + ], save: jest.fn(() => users.handlingEditor), }, author: { diff --git a/packages/component-invite/src/tests/postAssignation.test.js b/packages/component-invite/src/tests/postAssignation.test.js index 5610f418c1500ee5a101bdd89505abe355676a80..a2e4dbd9be1de81560050c6fcd7004b24ffd9a6d 100644 --- a/packages/component-invite/src/tests/postAssignation.test.js +++ b/packages/component-invite/src/tests/postAssignation.test.js @@ -53,8 +53,8 @@ describe('Post assignation route handler', () => { await require(postAssignationPath)(models)(req, res) expect(res.statusCode).toBe(204) - expect(acceptingHE.assignation.hasAnswer).toBeTruthy() - expect(acceptingHE.assignation.isAccepted).toBeTruthy() + expect(acceptingHE.assignations[0].hasAnswer).toBeTruthy() + expect(acceptingHE.assignations[0].isAccepted).toBeTruthy() }) it('should return success when the handling editor refuses work on a collection', async () => { const refusingHE = cloneDeep(handlingEditor) @@ -71,8 +71,8 @@ describe('Post assignation route handler', () => { await require(postAssignationPath)(models)(req, res) expect(res.statusCode).toBe(204) - expect(refusingHE.assignation.hasAnswer).toBeTruthy() - expect(refusingHE.assignation.isAccepted).toBeFalsy() + expect(refusingHE.assignations[0].hasAnswer).toBeTruthy() + expect(refusingHE.assignations[0].isAccepted).toBeFalsy() }) it('should return an error params are missing', async () => { const body = { @@ -116,7 +116,7 @@ describe('Post assignation route handler', () => { const req = httpMocks.createRequest({ body, }) - delete noAssignationEditor.assignation + delete noAssignationEditor.assignations req.user = noAssignationEditor const res = httpMocks.createResponse() const models = buildModels(standardCollection, noAssignationEditor) diff --git a/packages/component-invite/src/tests/postInvite.test.js b/packages/component-invite/src/tests/postInvite.test.js index d03f3ebc8f0dc8758bea0f9d49a10abeee3485d5..5a3bdc423ac6499fe156ff50ad5f1b32d92d95af 100644 --- a/packages/component-invite/src/tests/postInvite.test.js +++ b/packages/component-invite/src/tests/postInvite.test.js @@ -208,7 +208,7 @@ describe('Post invite route handler', () => { const data = JSON.parse(res._getData()) expect(data.roles).toContain(body.role) expect(data.email).toEqual(body.email) - expect(data.assignation.collectionId).toEqual(req.params.collectionId) + expect(data.assignations[0].collectionId).toEqual(req.params.collectionId) }) it('should return success when the handlingEditor invites a reviewer with a collection', async () => { const body = { @@ -228,6 +228,6 @@ describe('Post invite route handler', () => { const data = JSON.parse(res._getData()) expect(data.roles).toContain(body.role) expect(data.email).toEqual(body.email) - expect(data.assignation.collectionId).toEqual(req.params.collectionId) + expect(data.assignations[0].collectionId).toEqual(req.params.collectionId) }) }) diff --git a/packages/xpub-faraday/config/validations.js b/packages/xpub-faraday/config/validations.js index 4a753517200ef603bd276a194767b62915db1048..49323a02f1db61c4055a8908af6cd5496b8f8df1 100644 --- a/packages/xpub-faraday/config/validations.js +++ b/packages/xpub-faraday/config/validations.js @@ -93,7 +93,7 @@ module.exports = { lastName: Joi.string().allow(''), affiliation: Joi.string().allow(''), title: Joi.string().allow(''), - assignation: Joi.object(), + assignations: Joi.array(), }, team: { group: Joi.string(),