@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
JavaScript
;
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);
}