const { services, Collection, Invitation, authsome: authsomeHelper, } = require('pubsweet-component-helper-service') const notifications = require('./emails/notifications') module.exports = models => async (req, res) => { const { collectionId, invitationId, fragmentId } = req.params const { isAccepted, reason } = req.body const UserModel = models.User const user = await UserModel.find(req.user) try { const collection = await models.Collection.find(collectionId) if (!collection.fragments.includes(fragmentId)) return res.status(400).json({ error: `Fragment ${fragmentId} does not match collection ${collectionId}`, }) const fragment = await models.Fragment.find(fragmentId) fragment.invitations = fragment.invitations || [] const invitation = await fragment.invitations.find( invitation => invitation.id === invitationId, ) const invitationHelper = new Invitation({ userId: user.id, role: 'reviewer', invitation, }) const invitationValidation = invitationHelper.validateInvitation() if (invitationValidation.error) return res.status(invitationValidation.status).json({ error: invitationValidation.error, }) const authsome = authsomeHelper.getAuthsome(models) const canPatch = await authsome.can(req.user, 'PATCH', invitation) if (!canPatch) return res.status(403).json({ error: 'Unauthorized.', }) const collectionHelper = new Collection({ collection }) const baseUrl = services.getBaseUrl(req) invitation.respondedOn = Date.now() invitation.hasAnswer = true invitation.isAccepted = isAccepted if (isAccepted) { if (collection.status === 'reviewersInvited') { collectionHelper.updateStatus({ newStatus: 'underReview' }) } fragment.save() } else { if (reason) invitation.reason = reason await fragment.save() collectionHelper.updateStatusByNumberOfReviewers({ invitations: fragment.invitations, }) } notifications.sendNotifications({ baseUrl, fragment, isAccepted, collection, reviewer: user, UserModel: models.User, }) return res.status(200).json(invitation) } catch (e) { const notFoundError = await services.handleNotFoundError(e, 'Item') return res.status(notFoundError.status).json({ error: notFoundError.message, }) } }