1 import * as express from 'express'
2 import { ResultList } from '../../../shared'
3 import { Job, JobType, JobState } from '../../../shared/models'
4 import { UserRight } from '../../../shared/models/users'
5 import { JobQueue } from '../../lib/job-queue'
13 } from '../../middlewares'
14 import { paginationValidator } from '../../middlewares/validators'
15 import { listJobsStateValidator, listJobsValidator } from '../../middlewares/validators/jobs'
16 import { isArray } from '../../helpers/custom-validators/misc'
17 import { jobStates } from '@server/helpers/custom-validators/jobs'
19 const jobsRouter = express.Router()
23 ensureUserHasRight(UserRight.MANAGE_JOBS),
29 asyncMiddleware(listJobs)
32 jobsRouter.get('/:state',
34 ensureUserHasRight(UserRight.MANAGE_JOBS),
40 listJobsStateValidator,
41 asyncMiddleware(listJobs)
44 // ---------------------------------------------------------------------------
50 // ---------------------------------------------------------------------------
52 async function listJobs (req: express.Request, res: express.Response) {
53 const state = req.params.state as JobState || jobStates
54 const asc = req.query.sort === 'createdAt'
55 const jobType = req.query.jobType
57 const jobs = await JobQueue.Instance.listForApi({
59 start: req.query.start,
60 count: req.query.count,
64 const total = await JobQueue.Instance.count(state, jobType)
66 const result: ResultList<Job> = {
68 data: Array.isArray(state)
70 jobs.map(async j => formatJob(j, await j.getState() as JobState))
72 : jobs.map(j => formatJob(j, state))
74 return res.json(result)
77 function formatJob (job: any, state: JobState): Job {
78 const error = isArray(job.stacktrace) && job.stacktrace.length !== 0 ? job.stacktrace[0] : null
83 type: job.queue.name as JobType,
86 createdAt: new Date(job.timestamp),
87 finishedOn: new Date(job.finishedOn),
88 processedOn: new Date(job.processedOn)