@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
JavaScript
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