]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/controllers/api/jobs.ts
Fix shared imports
[github/Chocobozzz/PeerTube.git] / server / controllers / api / jobs.ts
CommitLineData
41fb13c3 1import express from 'express'
d17c7b4e 2import { Job, JobState, JobType, ResultList, UserRight } from '@shared/models'
402145b8 3import { isArray } from '../../helpers/custom-validators/misc'
94a5ff8a 4import { JobQueue } from '../../lib/job-queue'
f05a1c30 5import {
94a5ff8a
C
6 asyncMiddleware,
7 authenticate,
8 ensureUserHasRight,
9 jobsSortValidator,
1333ab1f 10 openapiOperationDoc,
18b24b2d 11 paginationValidatorBuilder,
94a5ff8a 12 setDefaultPagination,
f05a1c30
C
13 setDefaultSort
14} from '../../middlewares'
402145b8 15import { listJobsValidator } from '../../middlewares/validators/jobs'
5cd80545
C
16
17const jobsRouter = express.Router()
18
402145b8 19jobsRouter.get('/:state?',
1333ab1f 20 openapiOperationDoc({ operationId: 'getJobs' }),
040d6896
RK
21 authenticate,
22 ensureUserHasRight(UserRight.MANAGE_JOBS),
18b24b2d 23 paginationValidatorBuilder([ 'jobs' ]),
040d6896
RK
24 jobsSortValidator,
25 setDefaultSort,
26 setDefaultPagination,
27 listJobsValidator,
28 asyncMiddleware(listJobs)
29)
30
5cd80545
C
31// ---------------------------------------------------------------------------
32
33export {
34 jobsRouter
35}
36
37// ---------------------------------------------------------------------------
38
d5d9b6d7 39async function listJobs (req: express.Request, res: express.Response) {
402145b8 40 const state = req.params.state as JobState
94831479 41 const asc = req.query.sort === 'createdAt'
1061c73f 42 const jobType = req.query.jobType
94a5ff8a 43
1061c73f
C
44 const jobs = await JobQueue.Instance.listForApi({
45 state,
46 start: req.query.start,
47 count: req.query.count,
48 asc,
49 jobType
50 })
439d68e5 51 const total = await JobQueue.Instance.count(state, jobType)
94a5ff8a 52
a1587156 53 const result: ResultList<Job> = {
94a5ff8a 54 total,
3b01f4c0 55 data: await Promise.all(jobs.map(j => formatJob(j, state)))
94a5ff8a 56 }
402145b8 57
94a5ff8a
C
58 return res.json(result)
59}
5cd80545 60
3b01f4c0 61async function formatJob (job: any, state?: JobState): Promise<Job> {
402145b8
C
62 const error = isArray(job.stacktrace) && job.stacktrace.length !== 0
63 ? job.stacktrace[0]
64 : null
94831479 65
94a5ff8a
C
66 return {
67 id: job.id,
3b01f4c0 68 state: state || await job.getState(),
94831479 69 type: job.queue.name as JobType,
94a5ff8a 70 data: job.data,
3b01f4c0 71 progress: await job.progress(),
77d7e851 72 priority: job.opts.priority,
94831479
C
73 error,
74 createdAt: new Date(job.timestamp),
75 finishedOn: new Date(job.finishedOn),
76 processedOn: new Date(job.processedOn)
94a5ff8a 77 }
5cd80545 78}