Skip to content
Snippets Groups Projects
Commit f72feb96 authored by Sebastian's avatar Sebastian
Browse files

feat(component-invite): remove HE from team when refusing

parent 46dd8e44
No related branches found
No related tags found
No related merge requests found
...@@ -62,20 +62,15 @@ module.exports = async ( ...@@ -62,20 +62,15 @@ module.exports = async (
try { try {
let user = await models.User.findByEmail(email) let user = await models.User.findByEmail(email)
const invitation = {
type: role,
hasAnswer: false,
isAccepted: false,
collectionId,
timestamp: Date.now(),
}
user.invitations = user.invitations || []
user.invitations.push(invitation)
user = await user.save()
await teamHelper.setupManuscriptTeam(models, user, collectionId, role) const team = await teamHelper.setupManuscriptTeam(
models,
user,
collectionId,
role,
)
user = await models.User.find(user) user = await teamHelper.setupInvitation(user, role, collectionId, team.id)
try { try {
await mailService.setupAssignEmail( await mailService.setupAssignEmail(
......
...@@ -33,12 +33,9 @@ const createNewTeam = async (collectionId, role, userId, TeamModel) => { ...@@ -33,12 +33,9 @@ const createNewTeam = async (collectionId, role, userId, TeamModel) => {
}, },
members: [userId], members: [userId],
} }
const team = new TeamModel(teamBody) let team = new TeamModel(teamBody)
try { team = await team.save()
await team.save() return team
} catch (e) {
logger.error(e)
}
} }
const setupEiCTeams = async (models, user) => { const setupEiCTeams = async (models, user) => {
...@@ -91,11 +88,13 @@ const setupManuscriptTeam = async (models, user, collectionId, role) => { ...@@ -91,11 +88,13 @@ const setupManuscriptTeam = async (models, user, collectionId, role) => {
try { try {
team = await team.updateProperties(team) team = await team.updateProperties(team)
team = await team.save() team = await team.save()
return team
} catch (e) { } catch (e) {
logger.error(e) logger.error(e)
} }
} else { } else {
await createNewTeam(collectionId, role, user.id, models.Team) const team = await createNewTeam(collectionId, role, user.id, models.Team)
return team
} }
} }
...@@ -113,9 +112,33 @@ const getMatchingTeams = (teams, TeamModel, collectionId, role) => ...@@ -113,9 +112,33 @@ const getMatchingTeams = (teams, TeamModel, collectionId, role) =>
}) })
.filter(Boolean) .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()
}
module.exports = { module.exports = {
createNewTeam, createNewTeam,
setupEiCTeams, setupEiCTeams,
setupManuscriptTeam, setupManuscriptTeam,
getMatchingTeams, getMatchingTeams,
setupInvitation,
removeTeamMember,
} }
const logger = require('@pubsweet/logger') const logger = require('@pubsweet/logger')
const helpers = require('../helpers/helpers') const helpers = require('../helpers/helpers')
const teamHelper = require('../helpers/Team')
module.exports = models => async (req, res) => { module.exports = models => async (req, res) => {
const { type, accept } = req.body const { type, accept } = req.body
...@@ -17,6 +18,7 @@ module.exports = models => async (req, res) => { ...@@ -17,6 +18,7 @@ module.exports = models => async (req, res) => {
return return
} }
const { collectionId } = req.params const { collectionId } = req.params
// console.log('UI', user.invitations)
const filteredInvitations = user.invitations.filter( const filteredInvitations = user.invitations.filter(
invitation => invitation =>
invitation.collectionId === collectionId && invitation.type === type, invitation.collectionId === collectionId && invitation.type === type,
...@@ -38,10 +40,15 @@ module.exports = models => async (req, res) => { ...@@ -38,10 +40,15 @@ module.exports = models => async (req, res) => {
matchingInvitation.hasAnswer = true matchingInvitation.hasAnswer = true
if (accept === true) { if (accept === true) {
matchingInvitation.isAccepted = true matchingInvitation.isAccepted = true
await user.save()
} else { } else {
// TODO: remove the user from the team if invitation is refused await teamHelper.removeTeamMember(
matchingInvitation.teamId,
user.id,
models.Team,
)
} }
await user.save()
res.status(204).json() res.status(204).json()
return return
} catch (e) { } catch (e) {
......
...@@ -19,7 +19,7 @@ module.exports = models => async (req, res) => { ...@@ -19,7 +19,7 @@ module.exports = models => async (req, res) => {
return require('../controllers/assignCollectionRole')( return require('../controllers/assignCollectionRole')(
email, email,
role, role,
reqUser, req.user,
res, res,
collectionId, collectionId,
models, models,
......
const users = require('./users') const users = require('./users')
const collections = require('./collections')
const { standardCollection } = collections
const { editorInChief, handlingEditor, reviewer } = users const { editorInChief, handlingEditor, reviewer } = users
const teams = { const teams = {
eicTeam: { eicTeam: {
...@@ -26,11 +28,12 @@ const teams = { ...@@ -26,11 +28,12 @@ const teams = {
name: 'HandlingEditor', name: 'HandlingEditor',
object: { object: {
type: 'collection', type: 'collection',
id: '123', id: standardCollection.id,
}, },
members: [handlingEditor.id], members: [handlingEditor.id],
save: jest.fn(() => teams.heTeam), save: jest.fn(() => teams.heTeam),
updateProperties: jest.fn(() => teams.heTeam), updateProperties: jest.fn(() => teams.heTeam),
id: 'he123',
}, },
reviewerTeam: { reviewerTeam: {
teamType: { teamType: {
......
const collections = require('./collections') // const { heInvitation } = require('./invitations')
const { standardCollection } = require('./collections')
const { standardCollection } = collections
const users = { const users = {
admin: { admin: {
...@@ -41,6 +40,7 @@ const users = { ...@@ -41,6 +40,7 @@ const users = {
isAccepted: false, isAccepted: false,
collectionId: standardCollection.id, collectionId: standardCollection.id,
timestamp: Date.now(), timestamp: Date.now(),
teamId: 'he123',
}, },
], ],
save: jest.fn(() => users.handlingEditor), save: jest.fn(() => users.handlingEditor),
......
const fixtures = require('../fixtures/fixtures')
const UserMock = require('../mocks/User')
const TeamMock = require('../mocks/Team')
const build = (collection, findUser, emailUser, team) => {
const models = {
User: {},
Collection: {
find: jest.fn(
() =>
collection instanceof Error
? Promise.reject(collection)
: Promise.resolve(collection),
),
},
Team: {},
}
UserMock.find = jest.fn(user => {
const foundUser = Object.values(fixtures.users).find(
fixUser => fixUser.id === user.id,
)
if (foundUser === undefined) {
return Promise.reject(findUser)
}
return Promise.resolve(findUser)
})
UserMock.findByEmail = jest.fn(
() =>
emailUser instanceof Error
? Promise.reject(emailUser)
: Promise.resolve(emailUser),
)
TeamMock.find = jest.fn(
() =>
team instanceof Error ? Promise.reject(team) : Promise.resolve(team),
)
TeamMock.updateProperties = jest.fn(
() =>
team instanceof Error ? Promise.reject(team) : Promise.resolve(team),
)
TeamMock.all = jest.fn(() => Object.values(fixtures.teams))
models.User = UserMock
models.Team = TeamMock
return models
}
module.exports = { build }
...@@ -3,39 +3,21 @@ process.env.SUPPRESS_NO_CONFIG_WARNING = true ...@@ -3,39 +3,21 @@ process.env.SUPPRESS_NO_CONFIG_WARNING = true
const httpMocks = require('node-mocks-http') const httpMocks = require('node-mocks-http')
const fixtures = require('./fixtures/fixtures') const fixtures = require('./fixtures/fixtures')
const UserMock = require('./mocks/User')
const cloneDeep = require('lodash/cloneDeep') const cloneDeep = require('lodash/cloneDeep')
const Model = require('./helpers/Model')
jest.mock('pubsweet-component-mail-service', () => ({ jest.mock('pubsweet-component-mail-service', () => ({
setupAssignEmail: jest.fn(), setupAssignEmail: jest.fn(),
})) }))
const buildModels = (collection, user) => {
const models = {
User: {},
Collection: {
find: jest.fn(
() =>
collection instanceof Error
? Promise.reject(collection)
: Promise.resolve(collection),
),
},
}
UserMock.find = jest.fn(
() =>
user instanceof Error ? Promise.reject(user) : Promise.resolve(user),
)
models.User = UserMock
return models
}
const notFoundError = new Error() const notFoundError = new Error()
notFoundError.name = 'NotFoundError' notFoundError.name = 'NotFoundError'
notFoundError.status = 404 notFoundError.status = 404
const { handlingEditor } = fixtures.users const { handlingEditor } = fixtures.users
const { standardCollection } = fixtures.collections const { standardCollection } = fixtures.collections
const { heTeam } = fixtures.teams
const postInvitationPath = '../routes/postHandleInvitation' const postInvitationPath = '../routes/postHandleInvitation'
describe('Post handle invitation route handler', () => { describe('Post handle invitation route handler', () => {
it('should return success when the handling editor accepts work on a collection', async () => { it('should return success when the handling editor accepts work on a collection', async () => {
...@@ -50,9 +32,8 @@ describe('Post handle invitation route handler', () => { ...@@ -50,9 +32,8 @@ describe('Post handle invitation route handler', () => {
req.user = acceptingHE req.user = acceptingHE
req.params.collectionId = standardCollection.id req.params.collectionId = standardCollection.id
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(standardCollection, acceptingHE) const models = Model.build(standardCollection, acceptingHE, null, heTeam)
await require(postInvitationPath)(models)(req, res) await require(postInvitationPath)(models)(req, res)
expect(res.statusCode).toBe(204) expect(res.statusCode).toBe(204)
expect(acceptingHE.invitations[0].hasAnswer).toBeTruthy() expect(acceptingHE.invitations[0].hasAnswer).toBeTruthy()
expect(acceptingHE.invitations[0].isAccepted).toBeTruthy() expect(acceptingHE.invitations[0].isAccepted).toBeTruthy()
...@@ -69,7 +50,7 @@ describe('Post handle invitation route handler', () => { ...@@ -69,7 +50,7 @@ describe('Post handle invitation route handler', () => {
req.user = refusingHE req.user = refusingHE
req.params.collectionId = standardCollection.id req.params.collectionId = standardCollection.id
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(standardCollection, refusingHE) const models = Model.build(standardCollection, refusingHE, null, heTeam)
await require(postInvitationPath)(models)(req, res) await require(postInvitationPath)(models)(req, res)
expect(res.statusCode).toBe(204) expect(res.statusCode).toBe(204)
...@@ -86,7 +67,7 @@ describe('Post handle invitation route handler', () => { ...@@ -86,7 +67,7 @@ describe('Post handle invitation route handler', () => {
req.user = handlingEditor req.user = handlingEditor
req.params.collectionId = standardCollection.id req.params.collectionId = standardCollection.id
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(standardCollection, handlingEditor) const models = Model.build(standardCollection, handlingEditor)
await require(postInvitationPath)(models)(req, res) await require(postInvitationPath)(models)(req, res)
expect(res.statusCode).toBe(400) expect(res.statusCode).toBe(400)
...@@ -104,7 +85,7 @@ describe('Post handle invitation route handler', () => { ...@@ -104,7 +85,7 @@ describe('Post handle invitation route handler', () => {
req.user = handlingEditor req.user = handlingEditor
req.params.collectionId = standardCollection.id req.params.collectionId = standardCollection.id
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(notFoundError, handlingEditor) const models = Model.build(notFoundError, handlingEditor)
await require(postInvitationPath)(models)(req, res) await require(postInvitationPath)(models)(req, res)
expect(res.statusCode).toBe(404) expect(res.statusCode).toBe(404)
...@@ -124,7 +105,7 @@ describe('Post handle invitation route handler', () => { ...@@ -124,7 +105,7 @@ describe('Post handle invitation route handler', () => {
req.user = noInvitationEditor req.user = noInvitationEditor
req.params.collectionId = standardCollection.id req.params.collectionId = standardCollection.id
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(standardCollection, noInvitationEditor) const models = Model.build(standardCollection, noInvitationEditor)
await require(postInvitationPath)(models)(req, res) await require(postInvitationPath)(models)(req, res)
expect(res.statusCode).toBe(400) expect(res.statusCode).toBe(400)
...@@ -142,7 +123,7 @@ describe('Post handle invitation route handler', () => { ...@@ -142,7 +123,7 @@ describe('Post handle invitation route handler', () => {
req.user = handlingEditor req.user = handlingEditor
req.params.collectionId = standardCollection.id req.params.collectionId = standardCollection.id
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(standardCollection, handlingEditor) const models = Model.build(standardCollection, handlingEditor)
await require(postInvitationPath)(models)(req, res) await require(postInvitationPath)(models)(req, res)
expect(res.statusCode).toBe(400) expect(res.statusCode).toBe(400)
...@@ -162,7 +143,7 @@ describe('Post handle invitation route handler', () => { ...@@ -162,7 +143,7 @@ describe('Post handle invitation route handler', () => {
req.user = handlingEditor req.user = handlingEditor
req.params.collectionId = '123' req.params.collectionId = '123'
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(standardCollection, handlingEditor) const models = Model.build(standardCollection, handlingEditor)
await require(postInvitationPath)(models)(req, res) await require(postInvitationPath)(models)(req, res)
expect(res.statusCode).toBe(400) expect(res.statusCode).toBe(400)
......
...@@ -4,10 +4,8 @@ process.env.SUPPRESS_NO_CONFIG_WARNING = true ...@@ -4,10 +4,8 @@ process.env.SUPPRESS_NO_CONFIG_WARNING = true
const httpMocks = require('node-mocks-http') const httpMocks = require('node-mocks-http')
const random = require('lodash/random') const random = require('lodash/random')
const fixtures = require('./fixtures/fixtures') const fixtures = require('./fixtures/fixtures')
const UserMock = require('./mocks/User')
const Chance = require('chance') const Chance = require('chance')
const TeamMock = require('./mocks/Team') const Model = require('./helpers/Model')
jest.mock('pubsweet-component-mail-service', () => ({ jest.mock('pubsweet-component-mail-service', () => ({
setupInviteEmail: jest.fn(), setupInviteEmail: jest.fn(),
...@@ -17,49 +15,6 @@ const chance = new Chance() ...@@ -17,49 +15,6 @@ const chance = new Chance()
const globalRoles = ['editorInChief', 'author', 'admin'] const globalRoles = ['editorInChief', 'author', 'admin']
const manuscriptRoles = ['handlingEditor', 'reviewer'] const manuscriptRoles = ['handlingEditor', 'reviewer']
const buildModels = (collection, findUser, emailUser, team) => {
const models = {
User: {},
Collection: {
find: jest.fn(
() =>
collection instanceof Error
? Promise.reject(collection)
: Promise.resolve(collection),
),
},
Team: {},
}
UserMock.find = jest.fn(user => {
const foundUser = Object.values(fixtures.users).find(
fixUser => fixUser.id === user.id,
)
if (foundUser === undefined) {
return Promise.reject(findUser)
}
return Promise.resolve(foundUser)
})
UserMock.findByEmail = jest.fn(
() =>
emailUser instanceof Error
? Promise.reject(emailUser)
: Promise.resolve(emailUser),
)
TeamMock.find = jest.fn(
() =>
team instanceof Error ? Promise.reject(team) : Promise.resolve(team),
)
TeamMock.all = jest.fn(() => Object.values(fixtures.teams))
models.User = UserMock
models.Team = TeamMock
return models
}
const body = { const body = {
email: chance.email(), email: chance.email(),
role: globalRoles[random(0, globalRoles.length - 1)], role: globalRoles[random(0, globalRoles.length - 1)],
...@@ -85,7 +40,7 @@ describe('Post invite route handler', () => { ...@@ -85,7 +40,7 @@ describe('Post invite route handler', () => {
}) })
req.user = admin req.user = admin
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(notFoundError, admin, notFoundError) const models = Model.build(notFoundError, admin, notFoundError)
await require(postInvitePath)(models)(req, res) await require(postInvitePath)(models)(req, res)
expect(res.statusCode).toBe(200) expect(res.statusCode).toBe(200)
...@@ -101,7 +56,7 @@ describe('Post invite route handler', () => { ...@@ -101,7 +56,7 @@ describe('Post invite route handler', () => {
req.user = admin req.user = admin
req.params.collectionId = '123' req.params.collectionId = '123'
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(notFoundError, admin) const models = Model.build(notFoundError, admin)
await require(postInvitePath)(models)(req, res) await require(postInvitePath)(models)(req, res)
expect(res.statusCode).toBe(403) expect(res.statusCode).toBe(403)
const data = JSON.parse(res._getData()) const data = JSON.parse(res._getData())
...@@ -117,7 +72,7 @@ describe('Post invite route handler', () => { ...@@ -117,7 +72,7 @@ describe('Post invite route handler', () => {
}) })
req.user = admin req.user = admin
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(notFoundError, admin) const models = Model.build(notFoundError, admin)
await require(postInvitePath)(models)(req, res) await require(postInvitePath)(models)(req, res)
expect(res.statusCode).toBe(403) expect(res.statusCode).toBe(403)
const data = JSON.parse(res._getData()) const data = JSON.parse(res._getData())
...@@ -132,7 +87,7 @@ describe('Post invite route handler', () => { ...@@ -132,7 +87,7 @@ describe('Post invite route handler', () => {
}) })
req.user = admin req.user = admin
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(notFoundError, admin) const models = Model.build(notFoundError, admin)
await require(postInvitePath)(models)(req, res) await require(postInvitePath)(models)(req, res)
expect(res.statusCode).toBe(400) expect(res.statusCode).toBe(400)
const data = JSON.parse(res._getData()) const data = JSON.parse(res._getData())
...@@ -148,7 +103,7 @@ describe('Post invite route handler', () => { ...@@ -148,7 +103,7 @@ describe('Post invite route handler', () => {
req.user = editorInChief req.user = editorInChief
req.params.collectionId = '123' req.params.collectionId = '123'
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(notFoundError, editorInChief) const models = Model.build(notFoundError, editorInChief)
await require(postInvitePath)(models)(req, res) await require(postInvitePath)(models)(req, res)
expect(res.statusCode).toBe(403) expect(res.statusCode).toBe(403)
const data = JSON.parse(res._getData()) const data = JSON.parse(res._getData())
...@@ -163,7 +118,7 @@ describe('Post invite route handler', () => { ...@@ -163,7 +118,7 @@ describe('Post invite route handler', () => {
req.user = editorInChief req.user = editorInChief
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(notFoundError, editorInChief) const models = Model.build(notFoundError, editorInChief)
await require(postInvitePath)(models)(req, res) await require(postInvitePath)(models)(req, res)
expect(res.statusCode).toBe(403) expect(res.statusCode).toBe(403)
const data = JSON.parse(res._getData()) const data = JSON.parse(res._getData())
...@@ -180,7 +135,7 @@ describe('Post invite route handler', () => { ...@@ -180,7 +135,7 @@ describe('Post invite route handler', () => {
req.user = handlingEditor req.user = handlingEditor
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(notFoundError, handlingEditor) const models = Model.build(notFoundError, handlingEditor)
await require(postInvitePath)(models)(req, res) await require(postInvitePath)(models)(req, res)
expect(res.statusCode).toBe(403) expect(res.statusCode).toBe(403)
const data = JSON.parse(res._getData()) const data = JSON.parse(res._getData())
...@@ -196,7 +151,7 @@ describe('Post invite route handler', () => { ...@@ -196,7 +151,7 @@ describe('Post invite route handler', () => {
}) })
req.user = admin req.user = admin
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(notFoundError, admin, editorInChief) const models = Model.build(notFoundError, admin, editorInChief)
await require(postInvitePath)(models)(req, res) await require(postInvitePath)(models)(req, res)
expect(res.statusCode).toBe(400) expect(res.statusCode).toBe(400)
...@@ -214,7 +169,7 @@ describe('Post invite route handler', () => { ...@@ -214,7 +169,7 @@ describe('Post invite route handler', () => {
req.user = editorInChief req.user = editorInChief
req.params.collectionId = '123' req.params.collectionId = '123'
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(standardCollection, author, author) const models = Model.build(standardCollection, editorInChief, author)
await require(postInvitePath)(models)(req, res) await require(postInvitePath)(models)(req, res)
expect(res.statusCode).toBe(200) expect(res.statusCode).toBe(200)
...@@ -234,7 +189,7 @@ describe('Post invite route handler', () => { ...@@ -234,7 +189,7 @@ describe('Post invite route handler', () => {
req.user = handlingEditor req.user = handlingEditor
req.params.collectionId = '123' req.params.collectionId = '123'
const res = httpMocks.createResponse() const res = httpMocks.createResponse()
const models = buildModels(standardCollection, handlingEditor, author) const models = Model.build(standardCollection, handlingEditor, author)
await require(postInvitePath)(models)(req, res) await require(postInvitePath)(models)(req, res)
expect(res.statusCode).toBe(200) expect(res.statusCode).toBe(200)
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment