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