1 import * as express from 'express'
2 import { ResultList } from '../../../shared'
3 import { Job, JobState, JobType } from '../../../shared/models'
4 import { UserRight } from '../../../shared/models/users'
5 import { isArray } from '../../helpers/custom-validators/misc'
6 import { JobQueue } from '../../lib/job-queue'
14 } from '../../middlewares'
15 import { paginationValidator } from '../../middlewares/validators'
16 import { listJobsValidator } from '../../middlewares/validators/jobs'
18 const jobsRouter = express.Router()
20 jobsRouter.get('/:state?',
22 ensureUserHasRight(UserRight.MANAGE_JOBS),
28 asyncMiddleware(listJobs)
31 // ---------------------------------------------------------------------------
37 // ---------------------------------------------------------------------------
39 async function listJobs (req: express.Request, res: express.Response) {
40 const state = req.params.state as JobState
41 const asc = req.query.sort === 'createdAt'
42 const jobType = req.query.jobType
44 const jobs = await JobQueue.Instance.listForApi({
46 start: req.query.start,
47 count: req.query.count,
51 const total = await JobQueue.Instance.count(state, jobType)
53 const result: ResultList<Job> = {
55 data: await Promise.all(jobs.map(j => formatJob(j, state)))
58 return res.json(result)
61 async function formatJob (job: any, state?: JobState): Promise<Job> {
62 const error = isArray(job.stacktrace) && job.stacktrace.length !== 0
68 state: state || await job.getState(),
69 type: job.queue.name as JobType,
71 progress: await job.progress(),
72 priority: job.opts.priority,
74 createdAt: new Date(job.timestamp),
75 finishedOn: new Date(job.finishedOn),
76 processedOn: new Date(job.processedOn)