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` 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 => { console.log(job.data.response.value) 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 }