X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Fapi%2Fjobs.ts;h=9e333322b2a479a9c4ffd632c23d35fa0462b09f;hb=12edc1495a36b2199f1bf1ba37f50c7b694be382;hp=f6fbff36962955700801c70ed3d9cf1b10c70ee6;hpb=5cd80545422bba855cc9a730a2e13cc9d982c34b;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/api/jobs.ts b/server/controllers/api/jobs.ts index f6fbff369..9e333322b 100644 --- a/server/controllers/api/jobs.ts +++ b/server/controllers/api/jobs.ts @@ -1,21 +1,32 @@ import * as express from 'express' -import { asyncMiddleware, jobsSortValidator, setJobsSort, setPagination } from '../../middlewares' -import { paginationValidator } from '../../middlewares/validators/pagination' -import { database as db } from '../../initializers' -import { getFormattedObjects } from '../../helpers/utils' -import { authenticate } from '../../middlewares/oauth' -import { ensureUserHasRight } from '../../middlewares/user-right' -import { UserRight } from '../../../shared/models/users/user-right.enum' +import { ResultList } from '../../../shared' +import { Job, JobState, JobType } from '../../../shared/models' +import { UserRight } from '../../../shared/models/users' +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 { listJobsValidator } from '../../middlewares/validators/jobs' const jobsRouter = express.Router() -jobsRouter.get('/', +jobsRouter.get('/:state?', + openapiOperationDoc({ operationId: 'getJobs' }), authenticate, ensureUserHasRight(UserRight.MANAGE_JOBS), - paginationValidator, + paginationValidatorBuilder([ 'jobs' ]), jobsSortValidator, - setJobsSort, - setPagination, + setDefaultSort, + setDefaultPagination, + listJobsValidator, asyncMiddleware(listJobs) ) @@ -27,8 +38,43 @@ export { // --------------------------------------------------------------------------- -async function listJobs (req: express.Request, res: express.Response, next: express.NextFunction) { - const resultList = await db.Job.listForApi(req.query.start, req.query.count, req.query.sort) +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: await Promise.all(jobs.map(j => formatJob(j, state))) + } + + return res.json(result) +} + +async function formatJob (job: any, state?: JobState): Promise { + const error = isArray(job.stacktrace) && job.stacktrace.length !== 0 + ? job.stacktrace[0] + : null - return res.json(getFormattedObjects(resultList.data, resultList.total)) + return { + id: job.id, + state: state || await job.getState(), + type: job.queue.name as JobType, + data: job.data, + progress: await job.progress(), + priority: job.opts.priority, + error, + createdAt: new Date(job.timestamp), + finishedOn: new Date(job.finishedOn), + processedOn: new Date(job.processedOn) + } }