X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Fapi%2Fjobs.ts;h=6a53e308363e522f4b4aed3da9b4d3b1faa629db;hb=09f3d81e0c8edebbe8f5698811ecfb165f942378;hp=aa58a9144ea4472db750337219939cdb7f78b5ae;hpb=2c29ad4f3b736912ae769a288c4795dce40e388d;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/api/jobs.ts b/server/controllers/api/jobs.ts index aa58a9144..6a53e3083 100644 --- a/server/controllers/api/jobs.ts +++ b/server/controllers/api/jobs.ts @@ -1,29 +1,43 @@ -import * as express from 'express' -import { ResultList } from '../../../shared' -import { Job, JobType, JobState } from '../../../shared/models' -import { UserRight } from '../../../shared/models/users' +import { Job as BullJob } from 'bullmq' +import express from 'express' +import { HttpStatusCode, Job, JobState, JobType, ResultList, UserRight } from '@shared/models' +import { isArray } from '../../helpers/custom-validators/misc' import { JobQueue } from '../../lib/job-queue' import { asyncMiddleware, authenticate, ensureUserHasRight, jobsSortValidator, + openapiOperationDoc, + paginationValidatorBuilder, setDefaultPagination, setDefaultSort } from '../../middlewares' -import { paginationValidator } from '../../middlewares/validators' import { listJobsValidator } from '../../middlewares/validators/jobs' const jobsRouter = express.Router() -jobsRouter.get('/:state', +jobsRouter.post('/pause', authenticate, ensureUserHasRight(UserRight.MANAGE_JOBS), - paginationValidator, + asyncMiddleware(pauseJobQueue) +) + +jobsRouter.post('/resume', + authenticate, + ensureUserHasRight(UserRight.MANAGE_JOBS), + resumeJobQueue +) + +jobsRouter.get('/:state?', + openapiOperationDoc({ operationId: 'getJobs' }), + authenticate, + ensureUserHasRight(UserRight.MANAGE_JOBS), + paginationValidatorBuilder([ 'jobs' ]), jobsSortValidator, setDefaultSort, setDefaultPagination, - asyncMiddleware(listJobsValidator), + listJobsValidator, asyncMiddleware(listJobs) ) @@ -35,27 +49,55 @@ export { // --------------------------------------------------------------------------- -async function listJobs (req: express.Request, res: express.Response, next: express.NextFunction) { - const sort = req.query.sort === 'createdAt' ? 'ASC' : 'DESC' +async function pauseJobQueue (req: express.Request, res: express.Response) { + await JobQueue.Instance.pause() - const jobs = await JobQueue.Instance.listForApi(req.params.state, req.query.start, req.query.count, sort) - const total = await JobQueue.Instance.count(req.params.state) + return res.sendStatus(HttpStatusCode.NO_CONTENT_204) +} + +function resumeJobQueue (req: express.Request, res: express.Response) { + JobQueue.Instance.resume() + + return res.sendStatus(HttpStatusCode.NO_CONTENT_204) +} - const result: ResultList = { +async function listJobs (req: express.Request, res: express.Response) { + const state = req.params.state as JobState + const asc = req.query.sort === 'createdAt' + const jobType = req.query.jobType + + const jobs = await JobQueue.Instance.listForApi({ + state, + start: req.query.start, + count: req.query.count, + asc, + jobType + }) + const total = await JobQueue.Instance.count(state, jobType) + + const result: ResultList = { total, - data: jobs.map(j => formatJob(j.toJSON())) + data: await Promise.all(jobs.map(j => formatJob(j, state))) } + return res.json(result) } -function formatJob (job: any): Job { +async function formatJob (job: BullJob, state?: JobState): Promise { + const error = isArray(job.stacktrace) && job.stacktrace.length !== 0 + ? job.stacktrace[0] + : null + return { id: job.id, - state: job.state as JobState, - type: job.type as JobType, + state: state || await job.getState(), + type: job.queueName as JobType, data: job.data, - error: job.error, - createdAt: new Date(parseInt(job.created_at, 10)), - updatedAt: new Date(parseInt(job.updated_at, 10)) + progress: job.progress as number, + priority: job.opts.priority, + error, + createdAt: new Date(job.timestamp), + finishedOn: new Date(job.finishedOn), + processedOn: new Date(job.processedOn) } }