@qontrol/express
Version:
Express.js middleware for BullMQ monitoring
84 lines • 5.16 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createQontrolRouter = createQontrolRouter;
const express_1 = __importDefault(require("express"));
const path_1 = __importDefault(require("path"));
const core_1 = require("@qontrol/core");
const validation_1 = require("./validation");
const health_controller_1 = require("./health.controller");
const redis_controller_1 = require("./redis.controller");
const queue_controller_1 = require("./queue.controller");
const jobs_controller_1 = require("./jobs.controller");
function createQontrolRouter(qontrol, options = {}) {
const router = express_1.default.Router();
// Initialize controllers
const healthController = new health_controller_1.HealthController(qontrol);
const redisController = new redis_controller_1.RedisController(qontrol);
const queueController = new queue_controller_1.QueueController(qontrol);
const jobsController = new jobs_controller_1.JobsController(qontrol);
// Serve UI assets from @qontrol/ui package
try {
const uiPackagePath = path_1.default.dirname(require.resolve('@qontrol/ui/package.json'));
const uiDistPath = path_1.default.join(uiPackagePath, 'dist');
// Serve static assets (JS, CSS, images) from /assets route
router.use('/assets', express_1.default.static(path_1.default.join(uiDistPath, 'assets')));
// Serve the main dashboard HTML at root with corrected asset paths
router.get(['/', '/queue/:name', '/settings'], (req, res) => {
const indexPath = path_1.default.join(uiDistPath, 'index.html');
// Read and modify the HTML to use absolute paths for assets
const fs = require('fs');
let html = fs.readFileSync(indexPath, 'utf8');
// Get the base path from the request URL
const basePath = req.baseUrl || '';
// Replace relative asset paths with absolute paths relative to the router mount point
html = html.replace(/src="\.\/assets\//g, `src="${basePath}/assets/`);
html = html.replace(/href="\.\/assets\//g, `href="${basePath}/assets/`);
res.send(html);
});
core_1.Logger.getInstance().info(`✅ Serving qontrol UI from: ${uiDistPath}`);
}
catch (error) {
core_1.Logger.getInstance().error('❌ Could not locate @qontrol/ui package:', error.message);
// Fallback: serve a simple error page
const fallbackHtml = `
<div style="padding: 20px; font-family: sans-serif;">
<h1>Dashboard Not Available</h1>
<p>Could not load the dashboard UI. Please ensure @qontrol/ui is installed:</p>
<pre>npm install @qontrol/ui</pre>
<p>Error: ${error.message}</p>
</div>
`;
router.get('/', (req, res) => {
res.status(500).send(fallbackHtml);
});
}
// Health check routes
router.get('/api/healthz', (req, res) => healthController.heathCheck(req, res));
// Redis routes
router.get('/api/redis/stats', (req, res) => redisController.getStats(req, res));
// Queue routes
router.get('/api/queues', (req, res) => queueController.getQueues(req, res));
router.get('/api/queues/:queue', (req, res) => queueController.getQueue(req, res));
router.post('/api/queues/:queue/pause', (req, res) => queueController.pauseQueue(req, res));
router.post('/api/queues/:queue/resume', (req, res) => queueController.resumeQueue(req, res));
router.post('/api/queues/:queue/clean', (req, res) => queueController.cleanQueue(req, res));
router.delete('/api/queues/:queue/obliterate', (req, res) => queueController.removeQueue(req, res));
// Job routes
router.get('/api/queues/:queue/jobs', validation_1.validateGetJobs, (req, res) => jobsController.getJobs(req, res));
router.get('/api/queues/:queue/job-by-id/:id', (req, res) => jobsController.getJobById(req, res));
router.get('/api/queues/:queue/jobs/:id', (req, res) => jobsController.getJobDetail(req, res));
router.get('/api/queues/:queue/jobs/:id/logs', (req, res) => jobsController.getJobLogs(req, res));
router.post('/api/queues/:queue/jobs', (req, res) => jobsController.addJob(req, res));
router.delete('/api/queues/:queue/jobs/:id', (req, res) => jobsController.removeJob(req, res));
router.post('/api/queues/:queue/jobs/:id/retry', (req, res) => jobsController.retryJob(req, res));
router.post('/api/queues/:queue/jobs/:id/discard', (req, res) => jobsController.discardJob(req, res));
router.post('/api/queues/:queue/jobs/:id/promote', (req, res) => jobsController.promoteJob(req, res));
router.post('/api/queues/:queue/jobs/bulk-remove', (req, res) => jobsController.bulkRemoveJobs(req, res));
router.post('/api/queues/:queue/jobs/bulk-retry', (req, res) => jobsController.bulkRetryJobs(req, res));
router.post('/api/queues/:queue/jobs/bulk-export', (req, res) => jobsController.bulkExportJobs(req, res));
return router;
}
//# sourceMappingURL=index.js.map
;