@ministryofjustice/hmpps-digital-prison-reporting-frontend
Version:
The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.
97 lines (93 loc) • 3.47 kB
JavaScript
;
var UserReports = require('../types/UserReports.js');
var reportStoreHelper = require('./reportStoreHelper.js');
const STALE_INTERVAL = 14 * 24 * 60 * 60 * 1000; // Two weeks
/**
* Gets the reports that are stale
*
* @param {StoredReportData[]} reports
* @return {*}
*/
const getStaleReports = (reports) => {
const now = Date.now();
return reports.filter(report => {
const timestamp = getTerminalTimestamp(report);
if (!timestamp)
return false;
return now - timestamp > STALE_INTERVAL;
});
};
/**
* Gets the timestamp of potentially stale reports
*
* @param {StoredReportData} report
* @return {*} {(number | null)}
*/
const getTerminalTimestamp = (report) => {
const ts = report.timestamp;
switch (report.status) {
case UserReports.RequestStatus.EXPIRED:
return ts?.expired ? new Date(ts.expired).getTime() : null;
case UserReports.RequestStatus.FAILED:
return ts?.failed ? new Date(ts.failed).getTime() : null;
case UserReports.RequestStatus.ABORTED:
return ts?.aborted ? new Date(ts.aborted).getTime() : null;
default:
return null;
}
};
/**
* Sets a flash message to show to the user
*
* @param {Response} res
* @param {number} count
*/
const flashRemovedReports = (res, count, staleRequested, staleViewed) => {
if (!count)
return;
const removedReports = Array.from(new Set([...staleRequested, ...staleViewed].map(stale => `${stale.reportName} - ${stale.name || stale.variantName}`)));
const message = count === 1 ? '1 report was removed from your list' : `${count} reports were removed from your list`;
res.req?.flash('DPR_REMOVED_REPORTS', JSON.stringify({
message,
details: removedReports,
}));
};
/**
* Checks for stale reports and removes them
*
* @param {Services} services
* @param {string} userId
* @param {StoredReportData[]} requestedReports
* @param {StoredReportData[]} recentlyViewedReports
* @param {Response} res
* @return {*}
*/
const cleanupReports = async (services, userId, requestedReports, recentlyViewedReports, res) => {
if (res.req.session?.reportsCleanupRun) {
return {
requestedReports,
recentlyViewedReports,
};
}
if (res.req.session) {
res.req.session.reportsCleanupRun = true;
}
const staleRequested = getStaleReports(requestedReports);
const staleRecent = getStaleReports(recentlyViewedReports);
const totalRemoved = staleRequested.length + staleRecent.length;
if (totalRemoved === 0) {
return { requestedReports, recentlyViewedReports };
}
await staleRequested.reduce((promise, report) => promise.then(async () => {
return services.requestedReportService.removeReport(report.executionId || '', userId);
}), Promise.resolve());
await staleRecent.reduce((promise, report) => promise.then(() => services.recentlyViewedService.removeReport(userId, report.reportId, report.id, report.tableId)), Promise.resolve());
flashRemovedReports(res, totalRemoved, staleRequested, staleRecent);
const refreshed = await reportStoreHelper.getAllMyReports(res, services, userId);
return {
requestedReports: refreshed.requestedReports,
recentlyViewedReports: refreshed.recentlyViewedReports,
};
};
exports.cleanupReports = cleanupReports;
//# sourceMappingURL=cleanupMyReports.js.map