Skip to content
Snippets Groups Projects
removal.js 1.92 KiB
Newer Older
const moment = require('moment')
const { Team, Collection } = require('pubsweet-component-helper-service')
const {
  Team: TeamModel,
  User: UserModel,
  Fragment: FragmentModel,
  Collection: CollectionModel,
} = require('pubsweet-server')


const scheduleRemovalJob = async ({
  days,
  timeUnit,
  invitation,
  fragmentId,
  collectionId,
}) => {
  const executionDate = moment()
    .add(days, timeUnit)
    .toISOString()

  const queue = `removal-${userId}-${invitation.id}`
  const params = {
    days,
    timeUnit,
    invitation,
    fragmentId,
    collectionId,
    executionDate,
  }
  await Job.schedule({ queue, executionDate, jobHandler, params })
}

const jobHandler = async job => {
  const {
    days,
    timeUnit,
    invitation,
    fragmentId,
    collectionId,
    executionDate,
  } = job.data

  const collection = await CollectionModel.find(collectionId)
  const fragment = await FragmentModel.find(fragmentId)

  const collectionHelper = new Collection({ collection })
  const teamHelper = new Team({
    TeamModel,
    collectionId,
    fragmentId,
  })

  const team = await teamHelper.getTeam({
    role: invitation.role,
    objectType: 'fragment',
  })

  fragment.invitations = fragment.invitations.filter(
    inv => inv.id !== invitation.id,
  )

  await collectionHelper.updateStatusByNumberOfReviewers({
    invitations: fragment.invitations,
  })

  await teamHelper.removeTeamMember({
    teamId: team.id,
    userId: invitation.userId,
  })

  const user = await UserModel.find(invitation.userId)
  if (!user.isConfirmed) {
    await user.delete()
  } else {
    user.teams = user.teams.filter(userTeamId => team.id !== userTeamId)
    await user.save()
  }

  await fragment.save()

  return `Job ${
  }: the ${days} ${timeUnit} removal has been executed at ${executionDate} for user ${
    user.id
  }`
}
module.exports = { scheduleRemovalJob }