jobs.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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: state
  48. ? jobs.map(j => formatJob(j, state))
  49. : await Promise.all(jobs.map(j => formatJobWithUnknownState(j)))
  50. }
  51. return res.json(result)
  52. }
  53. async function formatJobWithUnknownState (job: any) {
  54. return formatJob(job, await job.getState())
  55. }
  56. function formatJob (job: any, state: JobState): Job {
  57. const error = isArray(job.stacktrace) && job.stacktrace.length !== 0
  58. ? job.stacktrace[0]
  59. : null
  60. return {
  61. id: job.id,
  62. state: state,
  63. type: job.queue.name as JobType,
  64. data: job.data,
  65. error,
  66. createdAt: new Date(job.timestamp),
  67. finishedOn: new Date(job.finishedOn),
  68. processedOn: new Date(job.processedOn)
  69. }
  70. }