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.

119 lines (116 loc) 4.09 kB
import { ReportType } from '../../../../types/UserReports.js'; import { StoreItemBuilder } from '../builder.js'; import { RequestStatus } from '../../../../utils/ReportStatus/types.js'; class RequestedReportBuilder extends StoreItemBuilder { req; filters; sort; constructor(req, res) { super(res); this.req = req; } buildReportData = () => { const requestFormData = this.req.body; this.reportType = requestFormData.type; return this.buildReportMetaData(requestFormData); }; buildFilters = () => { if (!this.queryData || !this.queryData.filterData) return undefined; const { filterData } = this.queryData; return { data: filterData, queryString: new URLSearchParams(filterData).toString(), }; }; buildSortData = () => { if (!this.queryData || !this.queryData?.sortData) return undefined; const { sortData } = this.queryData; return { data: sortData ?? {}, queryString: new URLSearchParams(sortData).toString(), }; }; buildRequestUrls = () => { const url = new URL(this.req.originalUrl, `${this.req.protocol}://${this.req.get('host')}`); const { pathname, search, origin } = url; const pollingUrlData = this.setPollingUrlData(origin); const requestUrlData = { fullUrl: `${origin}${this.req.originalUrl}`, pathname, search, }; return { origin, request: requestUrlData, polling: pollingUrlData, }; }; setPollingUrlData = (origin) => { const { definitionsPath, dpdPathFromQuery } = this.res.locals; const { executionId } = this.executionData; let pollingPath = this.req.baseUrl.replace('/filters', `/${executionId}/status`); if (dpdPathFromQuery) { pollingPath = `${pollingPath}?dataProductDefinitionsPath=${definitionsPath}`; } const pollingFullUrl = `${origin}${pollingPath}`; return { fullUrl: pollingFullUrl, pathname: pollingPath, }; }; buildStatus = () => { return RequestStatus.SUBMITTED; }; buildTimestamp = () => { return { requested: new Date(), }; }; buildQuery = () => { if (!this.queryData?.query || !this.queryData.querySummary) return undefined; const { query: data, querySummary: summary } = this.queryData; return { data, summary, }; }; buildSections = () => { if (!this.reportType && this.reportType !== ReportType.DASHBOARD) return undefined; const bodySections = this.req.body.sections; const sections = bodySections ? JSON.parse(this.req.body.sections) : []; return sections.filter(section => section.display).map(section => ({ name: section.display || '' })); }; build = () => { const reportData = this.buildReportData(); const filters = this.buildFilters(); const sortBy = this.buildSortData(); const url = this.buildRequestUrls(); const status = this.buildStatus(); const timestamp = this.buildTimestamp(); const definitionsPath = this.buidDefinitionsPath(); const query = this.buildQuery(); const metrics = this.buildSections(); const requestedReportData = { ...reportData, ...this.executionData, ...(this.childExecutionData && { childExecutionData: this.childExecutionData }), ...(filters && { filters }), ...(sortBy && { sortBy }), ...(query && { query }), ...(metrics && { metrics }), ...(definitionsPath && definitionsPath), url, status, timestamp, }; return requestedReportData; }; } export { RequestedReportBuilder }; //# sourceMappingURL=builder.js.map