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.

95 lines (92 loc) 3.39 kB
import { RequestStatus } from '../types/UserReports.js'; import { getAllMyReports } from './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 RequestStatus.EXPIRED: return ts?.expired ? new Date(ts.expired).getTime() : null; case RequestStatus.FAILED: return ts?.failed ? new Date(ts.failed).getTime() : null; case 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 getAllMyReports(res, services, userId); return { requestedReports: refreshed.requestedReports, recentlyViewedReports: refreshed.recentlyViewedReports, }; }; export { cleanupReports }; //# sourceMappingURL=cleanupMyReports.js.map