Newer
Older
const logger = require('@pubsweet/logger')
Sebastian Mihalache
committed
Sebastian Mihalache
committed
Team,
services,
Collection,
Invitation,
Sebastian Mihalache
committed
authsome: authsomeHelper,
} = require('pubsweet-component-helper-service')
Sebastian Mihalache
committed
const notifications = require('./emails/notifications')
module.exports = models => async (req, res) => {
const { email, role } = req.body
Sebastian Mihalache
committed
if (!services.checkForUndefinedParams(email, role))
return res.status(400).json({ error: 'Email and role are required' })
if (role !== 'handlingEditor')
return res.status(400).json({
error: `Role ${role} is invalid. Only handlingEditor is allowed.`,
})
Andrei Cioromila
committed
const reqUser = await models.User.find(req.user)
if (email === reqUser.email && !reqUser.admin) {
logger.error(`${reqUser.email} tried to invite his own email`)
Sebastian Mihalache
committed
return res.status(400).json({ error: 'Cannot invite yourself.' })
Sebastian Mihalache
committed
const { collectionId } = req.params
let collection
try {
collection = await models.Collection.find(collectionId)
} catch (e) {
Sebastian Mihalache
committed
const notFoundError = await services.handleNotFoundError(e, 'Collection')
return res.status(notFoundError.status).json({
error: notFoundError.message,
})
}
const authsome = authsomeHelper.getAuthsome(models)
const target = {
collection,
path: req.route.path,
}
const canPost = await authsome.can(req.user, 'POST', target)
if (!canPost)
return res.status(403).json({
error: 'Unauthorized.',
})
if (!['submitted', 'heInvited'].includes(collection.status)) {
return res.status(400).json({
error: `Cannot invite HE while collection is in the status: ${
collection.status
}.`,
})
}
const collectionHelper = new Collection({ collection })
Sebastian Mihalache
committed
const teamHelper = new Team({
TeamModel: models.Team,
collectionId,
})
const invitationHelper = new Invitation({ role })
Andrei Cioromila
committed
const user = await models.User.findByEmail(email)
invitationHelper.userId = user.id
let invitation = invitationHelper.getInvitation({
invitations: collection.invitations,
})
Sebastian Mihalache
committed
if (invitation) {
.json({ error: 'User has already replied to a previous invitation.' })
Sebastian Mihalache
committed
invitation.invitedOn = Date.now()
await collection.save()
} else {
Sebastian Mihalache
committed
invitation = await invitationHelper.createInvitation({
parentObject: collection,
Sebastian Mihalache
committed
invitation.invitedOn = Date.now()
await teamHelper.setupTeam({ user, role, objectType: 'collection' })
Sebastian Mihalache
committed
await collection.save()
await collectionHelper.addHandlingEditor({ user, invitation })
Andrei Cioromila
committed
notifications.sendInvitedHEEmail({
Sebastian Mihalache
committed
models,
collection,
invitedHE: user,
baseUrl: services.getBaseUrl(req),
})
Sebastian Mihalache
committed
return res.status(200).json(invitation)
Sebastian Mihalache
committed
const notFoundError = await services.handleNotFoundError(e, 'User')