"use server"; import { redirect } from "next/navigation"; import { apiBaseUrl, getAuthHeaders } from "@/lib"; import { appendSanitizedProviderFilters } from "@/lib/provider-filters"; import { handleApiResponse } from "@/lib/server-actions-helper"; /** * Maps filter[search] to filter[check_title__icontains] for finding-groups. * The finding-groups endpoint supports check_title__icontains for substring * matching on the human-readable check title displayed in the table. */ function mapSearchFilter( filters: Record, ): Record { const mapped = { ...filters }; const searchValue = mapped["filter[search]"]; if (searchValue) { mapped["filter[check_title__icontains]"] = searchValue; delete mapped["filter[search]"]; } return mapped; } export const getFindingGroups = async ({ page = 1, pageSize = 10, sort = "", filters = {}, }) => { const headers = await getAuthHeaders({ contentType: false }); if (isNaN(Number(page)) || page < 1) redirect("/findings"); const url = new URL(`${apiBaseUrl}/finding-groups`); if (page) url.searchParams.append("page[number]", page.toString()); if (pageSize) url.searchParams.append("page[size]", pageSize.toString()); if (sort) url.searchParams.append("sort", sort); appendSanitizedProviderFilters(url, mapSearchFilter(filters)); try { const response = await fetch(url.toString(), { headers }); return handleApiResponse(response); } catch (error) { console.error("Error fetching finding groups:", error); return undefined; } }; export const getLatestFindingGroups = async ({ page = 1, pageSize = 10, sort = "", filters = {}, }) => { const headers = await getAuthHeaders({ contentType: false }); if (isNaN(Number(page)) || page < 1) redirect("/findings"); const url = new URL(`${apiBaseUrl}/finding-groups/latest`); if (page) url.searchParams.append("page[number]", page.toString()); if (pageSize) url.searchParams.append("page[size]", pageSize.toString()); if (sort) url.searchParams.append("sort", sort); appendSanitizedProviderFilters(url, mapSearchFilter(filters)); try { const response = await fetch(url.toString(), { headers }); return handleApiResponse(response); } catch (error) { console.error("Error fetching latest finding groups:", error); return undefined; } }; export const getFindingGroupResources = async ({ checkId, page = 1, pageSize = 20, filters = {}, }: { checkId: string; page?: number; pageSize?: number; filters?: Record; }) => { const headers = await getAuthHeaders({ contentType: false }); const url = new URL(`${apiBaseUrl}/finding-groups/${checkId}/resources`); if (page) url.searchParams.append("page[number]", page.toString()); if (pageSize) url.searchParams.append("page[size]", pageSize.toString()); appendSanitizedProviderFilters(url, filters); try { const response = await fetch(url.toString(), { headers, }); return handleApiResponse(response); } catch (error) { console.error("Error fetching finding group resources:", error); return undefined; } }; export const getLatestFindingGroupResources = async ({ checkId, page = 1, pageSize = 20, filters = {}, }: { checkId: string; page?: number; pageSize?: number; filters?: Record; }) => { const headers = await getAuthHeaders({ contentType: false }); const url = new URL( `${apiBaseUrl}/finding-groups/latest/${checkId}/resources`, ); if (page) url.searchParams.append("page[number]", page.toString()); if (pageSize) url.searchParams.append("page[size]", pageSize.toString()); appendSanitizedProviderFilters(url, filters); try { const response = await fetch(url.toString(), { headers, }); return handleApiResponse(response); } catch (error) { console.error("Error fetching latest finding group resources:", error); return undefined; } };