]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/controllers/api/jobs.ts
Fix comment
[github/Chocobozzz/PeerTube.git] / server / controllers / api / jobs.ts
1 import 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 openapiOperationDoc,
13 paginationValidatorBuilder,
14 setDefaultPagination,
15 setDefaultSort
16 } from '../../middlewares'
17 import { listJobsValidator } from '../../middlewares/validators/jobs'
18
19 const jobsRouter = express.Router()
20
21 jobsRouter.get('/:state?',
22 openapiOperationDoc({ operationId: 'getJobs' }),
23 authenticate,
24 ensureUserHasRight(UserRight.MANAGE_JOBS),
25 paginationValidatorBuilder([ 'jobs' ]),
26 jobsSortValidator,
27 setDefaultSort,
28 setDefaultPagination,
29 listJobsValidator,
30 asyncMiddleware(listJobs)
31 )
32
33 // ---------------------------------------------------------------------------
34
35 export {
36 jobsRouter
37 }
38
39 // ---------------------------------------------------------------------------
40
41 async function listJobs (req: express.Request, res: express.Response) {
42 const state = req.params.state as JobState
43 const asc = req.query.sort === 'createdAt'
44 const jobType = req.query.jobType
45
46 const jobs = await JobQueue.Instance.listForApi({
47 state,
48 start: req.query.start,
49 count: req.query.count,
50 asc,
51 jobType
52 })
53 const total = await JobQueue.Instance.count(state, jobType)
54
55 const result: ResultList<Job> = {
56 total,
57 data: await Promise.all(jobs.map(j => formatJob(j, state)))
58 }
59
60 return res.json(result)
61 }
62
63 async function formatJob (job: any, state?: JobState): Promise<Job> {
64 const error = isArray(job.stacktrace) && job.stacktrace.length !== 0
65 ? job.stacktrace[0]
66 : null
67
68 return {
69 id: job.id,
70 state: state || await job.getState(),
71 type: job.queue.name as JobType,
72 data: job.data,
73 progress: await job.progress(),
74 priority: job.opts.priority,
75 error,
76 createdAt: new Date(job.timestamp),
77 finishedOn: new Date(job.finishedOn),
78 processedOn: new Date(job.processedOn)
79 }
80 }