UNPKG

bull-arena

Version:

An interactive UI dashboard for Bee Queue

119 lines (106 loc) 3.63 kB
const _ = require('lodash'); const JobHelpers = require('../helpers/jobHelpers'); async function handler(req, res) { const {queueName, queueHost, id} = req.params; const {json} = req.query; const basePath = req.baseUrl; const {Queues, Flows} = req.app.locals; const queue = await Queues.get(queueName, queueHost); if (!queue) return res.status(404).render('dashboard/templates/queueNotFound', { basePath, queueName, queueHost, }); const job = await queue.getJob(id); if (!job) return res.status(404).render('dashboard/templates/jobNotFound', { basePath, id, queueName, queueHost, hasFlows: Flows.hasFlows(), }); if (json === 'true') { // Omit these private and non-stringifyable properties to avoid circular // references parsing errors. return res.json( _.omit(job, 'domain', 'queue', 'scripts', '_events', '_eventsCount') ); } const jobState = queue.IS_BEE ? job.status : await job.getState(); job.showRetryButton = !queue.IS_BEE || jobState === 'failed'; job.retryButtonText = jobState === 'failed' ? 'Retry' : 'Trigger'; job.showPromoteButton = !queue.IS_BEE && jobState === 'delayed'; job.showDeleteRepeatableButton = queue.IS_BULL && job.opts.repeat; const stacktraces = queue.IS_BEE ? job.options.stacktraces : job.stacktrace; if (!queue.IS_BEE) { const logs = await queue.getJobLogs(job.id); job.logs = logs.logs || 'No Logs'; } if (queue.IS_BULLMQ) { job.parent = JobHelpers.getKeyProperties(job.parentKey); const processedCursor = parseInt(req.query.processedCursor, 10) || 0; const processedCount = parseInt(req.query.processedCount, 10) || 25; const ignoredCursor = parseInt(req.query.ignoredCursor, 10) || 0; const ignoredCount = parseInt(req.query.ignoredCount, 10) || 25; const unprocessedCursor = parseInt(req.query.unprocessedCursor, 10) || 0; const unprocessedCount = parseInt(req.query.unprocessedCount, 10) || 25; job.processedCount = processedCount; job.unprocessedCount = unprocessedCount; job.ignoredCount = ignoredCount; const { processed = {}, ignored = {}, unprocessed = [], nextProcessedCursor, nextIgnoredCursor, nextUnprocessedCursor, } = await job.getDependencies({ processed: { cursor: processedCursor, count: processedCount, }, ignored: { cursor: ignoredCursor, count: ignoredCount, }, unprocessed: { cursor: unprocessedCursor, count: unprocessedCount, }, }); const count = await job.getDependenciesCount(); job.countDependencies = count; job.processedCursor = nextProcessedCursor; job.ignoredCursor = nextIgnoredCursor; job.unprocessedCursor = nextUnprocessedCursor; if (unprocessed && unprocessed.length) { job.unprocessedChildren = unprocessed.map((child) => { return JobHelpers.getKeyProperties(child); }); } const processedKeys = Object.keys(processed); if (processedKeys.length) { job.processedChildren = processedKeys.map((child) => { return JobHelpers.getKeyProperties(child); }); } const ignoredKeys = Object.keys(ignored); if (ignoredKeys.length) { job.ignoredChildren = ignoredKeys.map((child) => { return JobHelpers.getKeyProperties(child); }); } } return res.render('dashboard/templates/jobDetails', { basePath, queueName, queueHost, jobState, job, stacktraces, hasFlows: Flows.hasFlows(), }); } module.exports = handler;