@ministryofjustice/hmpps-digital-prison-reporting-frontend
Version:
The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.
56 lines (50 loc) • 1.77 kB
text/typescript
import type RecentlyViewedStoreService from '../services/recentlyViewedService'
import type RequestedReportService from '../services/requestedReportService'
import { UserReportData } from '../types/UserReports'
export const removeDuplicates = async ({
storeService,
userId,
id,
search,
}: {
storeService: RequestedReportService | RecentlyViewedStoreService
userId: string
id: string
search: string
}) => {
const reports = await storeService.getAllReportsById(id, userId)
const duplicateIds = getDuplicateRequestIds(search, reports)
if (duplicateIds.length) {
await Promise.all(
duplicateIds.map(async (duplicateId: string) => {
await await storeService.removeReport(duplicateId, userId)
}),
)
}
}
/**
* Gets the execution IDs of duplicate requests
* - Checks whether the request query are the same
*
* @param {string} newReportSearchParams
* @param {UserReportData[]} existingReports
* @return {string[]} ids of the duplicate requests
*/
export const getDuplicateRequestIds = (newReportSearchParams: string, existingReports: UserReportData[]) => {
const duplicates: string[] = []
const newQueryParams = new URLSearchParams(newReportSearchParams)
existingReports.forEach((existingReportData: UserReportData) => {
const matches: boolean[] = []
const existingQueryParams = new URLSearchParams(existingReportData.url.request.search)
if (existingQueryParams.entries.length === newQueryParams.entries.length) {
newQueryParams.forEach((newValue, newKey) => {
const match = existingQueryParams.has(newKey, newValue)
matches.push(match)
})
}
if (matches.every(Boolean)) {
duplicates.push(existingReportData.executionId)
}
})
return duplicates
}