Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
patch.js 1.84 KiB
const {
  Team,
  services,
  Collection,
  Invitation,
} = require('pubsweet-component-helper-service')
const notifications = require('./emails/notifications')

module.exports = models => async (req, res) => {
  const { collectionId, invitationId } = req.params
  const { isAccepted, reason } = req.body

  const user = await models.User.find(req.user)

  try {
    const collection = await models.Collection.find(collectionId)
    collection.invitations = collection.invitations || []
    const invitation = collection.invitations.find(
      invitation => invitation.id === invitationId,
    )

    const invitationHelper = new Invitation({
      userId: user.id,
      role: 'handlingEditor',
      invitation,
    })

    const invitationValidation = invitationHelper.validateInvitation()
    if (invitationValidation.error)
      return res.status(invitationValidation.status).json({
        error: invitationValidation.error,
      })

    const collectionHelper = new Collection({ collection })

    const teamHelper = new Team({ TeamModel: models.Team, collectionId })

    await collectionHelper.updateHandlingEditor({ isAccepted })
    invitation.respondedOn = Date.now()
    invitation.hasAnswer = true
    invitation.isAccepted = isAccepted

    if (!isAccepted) {
      await teamHelper.deleteHandlingEditor({
        collection,
        role: invitation.role,
        user,
      })

      if (reason) invitation.reason = reason
    }

    await collection.save()

    notifications.sendEiCEmail({
      models,
      reason,
      collection,
      isAccepted,
      invitedHE: user,
      baseUrl: services.getBaseUrl(req),
    })

    return res.status(200).json(invitation)
  } catch (e) {
    const notFoundError = await services.handleNotFoundError(e, 'collection')
    return res.status(notFoundError.status).json({
      error: notFoundError.message,
    })
  }
}