Newer
Older
Sebastian Mihalache
committed
const logger = require('@pubsweet/logger')
Sebastian Mihalache
committed
const {
Sebastian Mihalache
committed
Team,
User,
Sebastian Mihalache
committed
services,
Collection,
Invitation,
Sebastian Mihalache
committed
authsome: authsomeHelper,
Sebastian Mihalache
committed
} = require('pubsweet-component-helper-service')
Sebastian Mihalache
committed
const emailInvitations = require('./emails/invitations')
Sebastian Mihalache
committed
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
module.exports = models => async (req, res) => {
const { email, role } = req.body
if (!services.checkForUndefinedParams(email, role)) {
res.status(400).json({ error: 'Email and role are required.' })
logger.error('User ID and role are missing')
return
}
if (role !== 'reviewer')
return res
.status(400)
.json({ error: `Role ${role} is invalid. Only reviewer is accepted.` })
const UserModel = models.User
const reqUser = await UserModel.find(req.user)
if (email === reqUser.email && !reqUser.admin)
return res.status(400).json({ error: 'Cannot invite yourself.' })
const { collectionId, fragmentId } = req.params
let collection, fragment
try {
collection = await models.Collection.find(collectionId)
if (!collection.fragments.includes(fragmentId))
return res.status(400).json({
error: `Fragment ${fragmentId} does not match collection ${collectionId}.`,
})
fragment = await models.Fragment.find(fragmentId)
} catch (e) {
const notFoundError = await services.handleNotFoundError(e, 'item')
return res.status(notFoundError.status).json({
error: notFoundError.message,
})
}
Sebastian Mihalache
committed
const authsome = authsomeHelper.getAuthsome(models)
const target = {
collection,
Sebastian Mihalache
committed
}
const canPost = await authsome.can(req.user, 'POST', target)
if (!canPost)
return res.status(403).json({
error: 'Unauthorized.',
})
const collectionHelper = new Collection({ collection })
Sebastian Mihalache
committed
Sebastian Mihalache
committed
const baseUrl = services.getBaseUrl(req)
Sebastian Mihalache
committed
Sebastian Mihalache
committed
const teamHelper = new Team({
TeamModel: models.Team,
collectionId,
fragmentId,
})
const invitationHelper = new Invitation({ role })
try {
const user = await UserModel.findByEmail(email)
const canInvite = await authsome.can(req.user, '', {
targetUser: user,
})
if (!canInvite) {
return res.status(400).json({ error: 'Invited user is inactive.' })
}
Sebastian Mihalache
committed
await teamHelper.setupTeam({ user, role, objectType: 'fragment' })
invitationHelper.userId = user.id
let invitation = invitationHelper.getInvitation({
invitations: fragment.invitations,
})
let resend = false
if (invitation) {
Sebastian Mihalache
committed
if (invitation.hasAnswer) {
Sebastian Mihalache
committed
return res
.status(400)
.json({ error: 'User has already replied to a previous invitation.' })
Sebastian Mihalache
committed
}
Sebastian Mihalache
committed
invitation.invitedOn = Date.now()
await fragment.save()
resend = true
} else {
invitation = await invitationHelper.createInvitation({
parentObject: fragment,
})
}
Sebastian Mihalache
committed
if (collection.status === 'heAssigned') {
collectionHelper.updateStatus({ newStatus: 'reviewersInvited' })
}
Sebastian Mihalache
committed
Sebastian Mihalache
committed
emailInvitations.sendInvitations({
Sebastian Mihalache
committed
resend,
Sebastian Mihalache
committed
baseUrl,
fragment,
collection,
invitation,
invitedUser: user,
UserModel: models.User,
timestamp: invitation.invitedOn,
Sebastian Mihalache
committed
})
return res.status(200).json(invitation)
} catch (e) {
const userHelper = new User({ UserModel })
const userData = req.body
const { firstName, lastName, isPublons } = userData
if (!services.checkForUndefinedParams(firstName, lastName)) {
return res
.status(400)
.json({ error: 'First name and last name are required.' })
}
if (isPublons && process.env.PUBLONS_MOCK_EMAIL) {
const mockEmail = process.env.PUBLONS_MOCK_EMAIL
userData.email = mockEmail.replace('__NAME__', `${firstName}.${lastName}`)
const newUser = await userHelper.createUser({
Sebastian Mihalache
committed
role,
body: userData,
Sebastian Mihalache
committed
})
if (collection.status === 'heAssigned')
await collectionHelper.updateStatus({ newStatus: 'reviewersInvited' })
await teamHelper.setupTeam({ user: newUser, role, objectType: 'fragment' })
invitationHelper.userId = newUser.id
const invitation = await invitationHelper.createInvitation({
parentObject: fragment,
})
Sebastian Mihalache
committed
emailInvitations.sendInvitations({
baseUrl,
fragment,
collection,
invitation,
invitedUser: newUser,
UserModel: models.User,
Sebastian Mihalache
committed
timestamp: invitation.invitedOn,
})
return res.status(200).json(invitation)
}
}