Add ability to forbid followers
[oweals/peertube.git] / server / controllers / api / jobs.ts
1 import * as express from 'express'
2 import { ResultList } from '../../../shared'
3 import { Job, JobType, JobState } from '../../../shared/models'
4 import { UserRight } from '../../../shared/models/users'
5 import { JobQueue } from '../../lib/job-queue'
6 import {
7   asyncMiddleware,
8   authenticate,
9   ensureUserHasRight,
10   jobsSortValidator,
11   setDefaultPagination,
12   setDefaultSort
13 } from '../../middlewares'
14 import { paginationValidator } from '../../middlewares/validators'
15 import { listJobsValidator } from '../../middlewares/validators/jobs'
16 import { isArray } from '../../helpers/custom-validators/misc'
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   asyncMiddleware(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, next: express.NextFunction) {
40   const state: JobState = req.params.state
41   const asc = req.query.sort === 'createdAt'
42
43   const jobs = await JobQueue.Instance.listForApi(state, req.query.start, req.query.count, asc)
44   const total = await JobQueue.Instance.count(state)
45
46   const result: ResultList<any> = {
47     total,
48     data: jobs.map(j => formatJob(j, state))
49   }
50   return res.json(result)
51 }
52
53 function formatJob (job: any, state: JobState): Job {
54   const error = isArray(job.stacktrace) && job.stacktrace.length !== 0 ? job.stacktrace[0] : null
55
56   return {
57     id: job.id,
58     state: state,
59     type: job.queue.name as JobType,
60     data: job.data,
61     error,
62     createdAt: new Date(job.timestamp),
63     finishedOn: new Date(job.finishedOn),
64     processedOn: new Date(job.processedOn)
65   }
66 }