const express = require('express') const statusCodes = require('http-status-codes').StatusCodes const calcQueueSvc = require('../src/services/calc-queue') const CalcQueueExceptions = require('../src/services/calc-queue/exceptions.js') const router = express.Router() // Return busy/not busy flag router.get('/busy', function(req, res) { res.send({ busy: calcQueueSvc.isBusy() }) }) // Get the current queue of tasks router.get('/queue', function(req, res) { res.send({ 'queue': calcQueueSvc.getQueue() }) }) // Add a calc task to the queue router.put('/queue/:id/:calcFn', function(req, res) { try { calcQueueSvc.enqueue(req.params.id, req.params.calcFn) res.send({ success: true }) } catch(ex) { if (ex instanceof CalcQueueExceptions.AlreadyQueued || ex instanceof CalcQueueExceptions.AlreadyInProgress || ex instanceof CalcQueueExceptions.CalculationUnknown) { res.status( statusCodes.BAD_REQUEST ).send( { success: false, error: ex.message } ) } else { throw ex } } }) // Remove a task or collection of tasks from the queue router.delete('/queue/:id', function(req, res) { calcQueueSvc.dequeue(req.params.id, null) res.send({ success: true }) }) // Remove a task from the queue router.delete('/queue/:id/:calcFn', function(req, res) { calcQueueSvc.dequeue(req.params.id, req.params.calcFn) res.send({ success: true }) }) // Poll the status of a task as a text string const processStatus = function(id, calcFn) { if (calcQueueSvc.isInProgress(id, calcFn)) { return 'in_progress' } else if (calcQueueSvc.isQueued(id, calcFn)) { return 'queued' } else if (calcQueueSvc.isFinished(id, calcFn)) { return 'finished' } else { return 'not_queued' } } // Poll the status of an individual task router.get('/poll/:id', function(req, res) { const status = processStatus(req.params.id, null) if (status == 'finished') { res.status(statusCodes.OK).send({ id: req.params.id, status: status, retCode: calcQueueSvc.retCode(req.params.id, null) }) } else { res.status(statusCodes.OK).send({ id: req.params.id, status: status }) } }) // Poll the status of an individual task router.get('/poll/:id/:calcFn', function(req, res) { const status = processStatus(req.params.id, req.params.calcFn) if (status == 'finished') { res.status(statusCodes.OK).send({ id: req.params.id, calcFn: req.params.calcFn, status: status, retCode: calcQueueSvc.retCode(req.params.id, req.params.calcFn) }) } else { res.status(statusCodes.OK).send({ id: req.params.id, calcFn: req.params.calcFn, status: status }) } }) // Get the status of the queue and all tasks router.get('/status', function(req, res) { res.status(statusCodes.OK).send({ 'queued': calcQueueSvc.getQueue(), 'in_progress': calcQueueSvc.getInProgress(), 'finished': calcQueueSvc.getFinished() }) }) // Get the status of all tasks with by id router.get('/status/:id', function(req, res) { const status = calcQueueSvc.getStatus(req.params.id, null) if (status.length == 0) { res.status(statusCodes.BAD_REQUEST).send() } else { res.status(statusCodes.OK).send(status) } }) // Get the status of an individual task router.get('/status/:id/:calcFn', function(req, res) { const status = calcQueueSvc.getStatus(req.params.id, req.params.calcFn) if (status.length == 0) { res.status(statusCodes.BAD_REQUEST).send() } else { res.status(statusCodes.OK).send(status) } }) module.exports = router