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

const { jobs: { connectToJobQueue } } = require('pubsweet-server/src')

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

  const queue = `reviewer-removal-${userId}`

  const jobQueue = await connectToJobQueue()

  // Add job to the queue
  await jobQueue.publishAfter(
    queue,
    {
      days,
      timeUnit,
      invitation,
      fragmentId,
      collectionId,
      executionDate,
    },
    {},
    executionDate,
  )

  // Subscribe to the job queue with an async handler
  await jobQueue.subscribe(queue, jobHandler)

  await jobQueue.onComplete(queue, job => {
    logger.info(job.data.response.value)
  })
}

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)
  user.teams = user.teams.filter(userTeamId => team.id !== userTeamId)
  await user.save()
  await fragment.save()

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