Newer
Older
Sebastian Mihalache
committed
Invitation,
} = require('pubsweet-component-helper-service')
Sebastian Mihalache
committed
const notifications = require('./emails/notifications')

Sebastian Mihalache
committed
const Job = require('pubsweet-component-jobs')
Sebastian Mihalache
committed
module.exports = models => async (req, res) => {
Sebastian Mihalache
committed
const { collectionId, invitationId, fragmentId } = req.params
const { invitationToken } = req.body
if (!services.checkForUndefinedParams(invitationToken))
return res.status(400).json({ error: 'Token is required' })
const UserModel = models.User
const users = await UserModel.all()
const user = users.find(
user => user.accessTokens.invitation === invitationToken,
)
if (!user) {
return res.status(404).json({
error: `User not found.`,
})
}
let collection = {}
let fragment = {}
collection = await models.Collection.find(collectionId)
Sebastian Mihalache
committed
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 (err) {
const notFoundError = await services.handleNotFoundError(err, 'Item')
return res.status(notFoundError.status).json({
error: notFoundError.message,
Sebastian Mihalache
committed
})
fragment.invitations = fragment.invitations || []
const invitation = await fragment.invitations.find(
invitation => invitation.id === invitationId,
)
Sebastian Mihalache
committed
const invitationHelper = new Invitation({
userId: user.id,
role: 'reviewer',
invitation,
})
Sebastian Mihalache
committed
const invitationValidation = invitationHelper.validateInvitation()
if (invitationValidation.error)
return res.status(invitationValidation.status).json({
error: invitationValidation.error,
Sebastian Mihalache
committed
const authsome = authsomeHelper.getAuthsome(models)
const canPatch = await authsome.can(req.user, 'PATCH', invitation)
if (!canPatch)
return res.status(403).json({
error: 'Unauthorized.',

Sebastian Mihalache
committed
await Job.cancelQueue(`reminders-${user.id}-${invitation.id}`)
await Job.cancelQueue(`removal-${user.id}-${invitation.id}`)
invitation.respondedOn = Date.now()
invitation.hasAnswer = true
invitation.isAccepted = false
await fragment.save()
const baseUrl = services.getBaseUrl(req)
const teamHelper = new Team({
fragmentId,
collectionId,
TeamModel: models.Team,
})
const reviewerTeam = await teamHelper.getTeam({
role: 'reviewer',
objectType: 'fragment',
})
await teamHelper.removeTeamMember({
teamId: reviewerTeam.id,
userId: user.id,
})
user.teams = user.teams.filter(userTeamId => reviewerTeam.id !== userTeamId)
await user.save()
notifications.sendHandlingEditorEmail({
baseUrl,
fragment,
collection,
reviewer: user,
UserModel: models.User,
emailType: 'reviewer-declined',
})
return res.status(200).json({})