jobs.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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'
  7. import {
  8. asyncMiddleware,
  9. authenticate,
  10. ensureUserHasRight,
  11. jobsSortValidator,
  12. setDefaultPagination,
  13. setDefaultSort
  14. } from '../../middlewares'
  15. import { paginationValidator } from '../../middlewares/validators'
  16. import { listJobsValidator } from '../../middlewares/validators/jobs'
  17. const jobsRouter = express.Router()
  18. jobsRouter.get('/:state?',
  19. authenticate,
  20. ensureUserHasRight(UserRight.MANAGE_JOBS),
  21. paginationValidator,
  22. jobsSortValidator,
  23. setDefaultSort,
  24. setDefaultPagination,
  25. listJobsValidator,
  26. asyncMiddleware(listJobs)
  27. )
  28. // ---------------------------------------------------------------------------
  29. export {
  30. jobsRouter
  31. }
  32. // ---------------------------------------------------------------------------
  33. async function listJobs (req: express.Request, res: express.Response) {
  34. const state = req.params.state as JobState
  35. const asc = req.query.sort === 'createdAt'
  36. const jobType = req.query.jobType
  37. const jobs = await JobQueue.Instance.listForApi({
  38. state,
  39. start: req.query.start,
  40. count: req.query.count,
  41. asc,
  42. jobType
  43. })
  44. const total = await JobQueue.Instance.count(state, jobType)
  45. const result: ResultList<Job> = {
  46. total,
  47. data: await Promise.all(jobs.map(j => formatJob(j, state)))
  48. }
  49. return res.json(result)
  50. }
  51. async function formatJob (job: any, state?: JobState): Promise<Job> {
  52. const error = isArray(job.stacktrace) && job.stacktrace.length !== 0
  53. ? job.stacktrace[0]
  54. : null
  55. return {
  56. id: job.id,
  57. state: state || await job.getState(),
  58. type: job.queue.name as JobType,
  59. data: job.data,
  60. progress: await job.progress(),
  61. error,
  62. createdAt: new Date(job.timestamp),
  63. finishedOn: new Date(job.finishedOn),
  64. processedOn: new Date(job.processedOn)
  65. }
  66. }