]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame_incremental - server/controllers/api/jobs.ts
Merge branch 'release/2.2.0' into develop
[github/Chocobozzz/PeerTube.git] / server / controllers / api / jobs.ts
... / ...
CommitLineData
1import * as express from 'express'
2import { ResultList } from '../../../shared'
3import { Job, JobType, JobState } from '../../../shared/models'
4import { UserRight } from '../../../shared/models/users'
5import { JobQueue } from '../../lib/job-queue'
6import {
7 asyncMiddleware,
8 authenticate,
9 ensureUserHasRight,
10 jobsSortValidator,
11 setDefaultPagination,
12 setDefaultSort
13} from '../../middlewares'
14import { paginationValidator } from '../../middlewares/validators'
15import { listJobsValidator } from '../../middlewares/validators/jobs'
16import { isArray } from '../../helpers/custom-validators/misc'
17
18const jobsRouter = express.Router()
19
20jobsRouter.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
33export {
34 jobsRouter
35}
36
37// ---------------------------------------------------------------------------
38
39async 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)
52
53 const result: ResultList<Job> = {
54 total,
55 data: jobs.map(j => formatJob(j, state))
56 }
57 return res.json(result)
58}
59
60function formatJob (job: any, state: JobState): Job {
61 const error = isArray(job.stacktrace) && job.stacktrace.length !== 0 ? job.stacktrace[0] : null
62
63 return {
64 id: job.id,
65 state: state,
66 type: job.queue.name as JobType,
67 data: job.data,
68 error,
69 createdAt: new Date(job.timestamp),
70 finishedOn: new Date(job.finishedOn),
71 processedOn: new Date(job.processedOn)
72 }
73}