Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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 }