UNPKG

@qontrol/express

Version:

Express.js middleware for BullMQ monitoring

84 lines 5.16 kB
"use strict"; 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