Newer
Older
const moment = require('moment')

Sebastian Mihalache
committed
const { Team, Collection } = require('pubsweet-component-helper-service')
const {
Team: TeamModel,
User: UserModel,
Fragment: FragmentModel,
Collection: CollectionModel,
} = require('pubsweet-server')

Sebastian Mihalache
committed
const Job = require('pubsweet-component-jobs')
const scheduleRemovalJob = async ({
days,
timeUnit,
invitation,
fragmentId,
collectionId,
}) => {
const executionDate = moment()
.add(days, timeUnit)
.toISOString()

Sebastian Mihalache
committed
const queue = `removal-${userId}-${invitation.id}`

Sebastian Mihalache
committed
const params = {
days,
timeUnit,
invitation,
fragmentId,
collectionId,
executionDate,
}

Sebastian Mihalache
committed
await Job.schedule({ queue, executionDate, jobHandler, params })
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
}
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 ${

Sebastian Mihalache
committed
job.name
}: the ${days} ${timeUnit} removal has been executed at ${executionDate} for user ${
user.id
}`
}
module.exports = { scheduleRemovalJob }