UNPKG

@ministryofjustice/hmpps-digital-prison-reporting-frontend

Version:

The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.

327 lines (326 loc) 12.2 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = routes; const utils_1 = __importDefault(require("../components/_async/async-polling/utils")); const utils_2 = __importDefault(require("../components/user-reports/requested/utils")); const utils_3 = __importDefault(require("../components/user-reports/utils")); const utils_4 = __importDefault(require("../components/error-summary/utils")); const utils_5 = __importDefault(require("../components/_async/async-request/utils")); const utils_6 = __importDefault(require("../components/_dashboards/dashboard/utils")); const localsHelper_1 = __importDefault(require("../utils/localsHelper")); const asyncReportUtils_1 = __importDefault(require("../utils/report/asyncReportUtils")); const logger_1 = __importDefault(require("../utils/logger")); const UserReports_1 = require("../types/UserReports"); function routes({ router, services, layoutPath, prefix, }) { logger_1.default.info('Initialiasing routes: Async reports'); /** * * * * * * * * * * * * * * * * * * ERROR & AUTH ROUTES * * * ** * * * * * * * * * * * * * * */ /** * Error Handler * * @param {Request} req * @param {Response} res * @param {NextFunction} next */ const asyncErrorHandler = async (req, res) => { logger_1.default.error(`Error: ${JSON.stringify(req.body)}`); res.render(`dpr/views/async-error`, { layoutPath, ...req.body, ...req.params, error: req.body.error, params: req.params, }); }; /** * Authorisation middleware handler * * @param {Request} req * @param {Response} res * @param {NextFunction} next */ const isAuthorisedToViewReport = async (req, res, next) => { const definition = await utils_5.default.getDefintionByType(req, res, next, services); req.body.definition = definition; if ((definition === null || definition === void 0 ? void 0 : definition.authorised) !== undefined && !definition.authorised) { await unauthorisedReportHandler(req, res, next); } else { next(); } }; /** * Unauthorised route handler * * @param {Request} req * @param {Response} res * @param {NextFunction} next */ const unauthorisedReportHandler = async (req, res) => { res.render(`dpr/views/unauthorised-report`, { layoutPath, ...req.body, }); }; /** * * * * * * * * * * * * * * * * * * STAGE 1: REQUEST ROUTES * * * ** * * * * * * * * * * * * * * */ /** * REQUEST: Render request handler * * @param {Request} req * @param {Response} res * @param {NextFunction} next */ const renderRequestHandler = async (req, res, next) => { try { const requestRenderData = await utils_5.default.renderRequest({ req, res, services, next, }); res.render(`dpr/views/async-request`, { layoutPath, postEndpoint: '/dpr/requestReport/', ...requestRenderData, }); } catch (error) { req.body.title = 'Request failed'; req.body.errorDescription = `Your ${req.params.type} has failed to generate.`; req.body.error = utils_4.default.handleError(error, req.params.type); next(); } }; /** * REQUEST: Make request * * @param {Request} req * @param {Response} res * @param {NextFunction} next */ const asyncRequestHandler = async (req, res, next) => { try { const redirectToPollingPage = await utils_5.default.request({ req, res, services, next, }); if (redirectToPollingPage) { res.redirect(redirectToPollingPage); } else { res.end(); } } catch (error) { const dprError = utils_4.default.handleError(error, req.params.type); const filters = utils_5.default.getFiltersFromReqBody(req); req.body = { title: 'Request Failed', errorDescription: `Your ${req.params.type} has failed to generate.`, error: dprError, retry: true, filters, ...req.body, }; next(); } }; /** * REQUEST: Cancel request * * @param {Request} req * @param {Response} res * @param {NextFunction} next */ const cancelRequestHandler = async (req, res, next) => { try { await utils_5.default.cancelRequest({ req, res, services, }); res.end(); } catch (error) { req.body.title = 'Failed to abort request'; req.body.errorDescription = 'We were unable to abort the report request for the following reason:'; req.body.error = utils_4.default.handleError(error); next(); } }; /** * REQUEST: Remove request * * @param {Request} req * @param {Response} res * @param {NextFunction} next */ const removeRequestedItemHandler = async (req, res, next) => { const { userId } = localsHelper_1.default.getValues(res); try { await services.requestedReportService.removeReport(req.body.executionId, userId); res.end(); } catch (error) { req.body.title = 'Failed to abort request'; req.body.errorDescription = 'We were unable to abort the report request for the following reason:'; req.body.error = utils_4.default.handleError(error); next(); } }; /** * * * * * * * * * * * * * * * * * * STAGE 2: POLLING ROUTES * * * ** * * * * * * * * * * * * * * */ /** * POLLING: Render Polling * * @param {Request} req * @param {Response} res * @param {NextFunction} next */ const pollingHandler = async (req, res, next) => { try { const pollingRenderData = await utils_1.default.renderPolling({ req, res, services, next, }); res.render(`dpr/views/async-polling`, { layoutPath, ...pollingRenderData, }); } catch (error) { req.body.title = 'Failed to retrieve report status'; req.body.errorDescription = 'We were unable to retrieve the report status:'; req.body.error = utils_4.default.handleError(error); next(); } }; /** * POLLING: Get Status * * @param {Request} req * @param {Response} res * @param {NextFunction} next */ const getStatusHandler = async (req, res, next) => { try { const response = await utils_2.default.getRequestStatus({ req, res, services }); res.send({ status: response.status }); } catch (error) { res.send({ status: 'FAILED' }); } }; /** * POLLING: Get Expired Status * * @param {Request} req * @param {Response} res * @param {NextFunction} next */ const getExpiredStatus = async (req, res, next) => { try { const response = await utils_3.default.getExpiredStatus({ req, res, services, storeService: services.requestedReportService, }); res.send({ isExpired: response }); } catch (error) { res.send({ status: 'FAILED' }); } }; /** * * * * * * * * * * * * * * * * * * STAGE 3: VIEW REPORT ROUTES * * * ** * * * * * * * * * * * * * * */ /** * VIEW REPORT: Render report * * @param {Request} req * @param {Response} res * @param {NextFunction} next */ const viewReportHandler = async (req, res, next) => { const { type } = req.params; try { let template; let renderData; const params = { req, res, services, next }; if (type === UserReports_1.ReportType.REPORT) { template = 'report'; renderData = await asyncReportUtils_1.default.renderReport(params); } if (type === UserReports_1.ReportType.DASHBOARD) { template = 'dashboard'; renderData = await utils_6.default.renderAsyncDashboard(params); } res.render(`dpr/views/${template}`, { layoutPath, ...renderData, }); } catch (error) { const dprError = utils_4.default.handleError(error, req.params.type); let refreshLink; if (dprError.status === 'EXPIRED') { const { userId } = localsHelper_1.default.getValues(res); refreshLink = await services.recentlyViewedService.asyncSetToExpiredByTableId(req.params.tableId, userId); } req.body.title = `Failed to retrieve ${type}`; req.body.error = dprError; req.body.refreshLink = refreshLink; next(); } }; const listingHandler = async (req, res, next) => { const { requestedReports } = localsHelper_1.default.getValues(res); res.render(`dpr/views/async-reports`, { title: 'Requested reports', layoutPath, ...(await utils_3.default.renderList({ reportsData: requestedReports, filterFunction: utils_2.default.filterReports, res, type: 'requested', })), }); }; // 1 - REQUEST router.get(`${prefix}/async/:type/:reportId/:id/request`, isAuthorisedToViewReport, renderRequestHandler, asyncErrorHandler); router.post('/dpr/requestReport/', asyncRequestHandler, asyncErrorHandler); // 2 - POLLING router.get(`${prefix}/async/:type/:reportId/:id/request/:executionId`, pollingHandler, asyncErrorHandler); router.post('/dpr/getStatus/', getStatusHandler); router.post('/dpr/cancelRequest/', cancelRequestHandler, asyncErrorHandler); // 3 - VIEw REPORT const viewReportPaths = [ `${prefix}/async/:type/:reportId/:id/request/:tableId/report`, `${prefix}/async/:type/:reportId/:id/request/:tableId/report/:download`, ]; router.get(viewReportPaths, isAuthorisedToViewReport, viewReportHandler, asyncErrorHandler); // Homepage widget routes router.post('/dpr/removeRequestedItem/', removeRequestedItemHandler, asyncErrorHandler); router.post('/dpr/getRequestedExpiredStatus/', getExpiredStatus); router.get(`${prefix}/async-reports/requested`, listingHandler); }