diff --git a/actions/compliances/compliances.ts b/actions/compliances/compliances.ts new file mode 100644 index 0000000000..6b254acff0 --- /dev/null +++ b/actions/compliances/compliances.ts @@ -0,0 +1,34 @@ +"use server"; +import { revalidatePath } from "next/cache"; + +import { auth } from "@/auth.config"; +import { parseStringify } from "@/lib"; + +export const getCompliancesOverview = async ({ + scanId, +}: { + scanId: string; +}) => { + const session = await auth(); + + const keyServer = process.env.API_BASE_URL; + const url = new URL( + `${keyServer}/compliance-overviews?filter[scan_id]=${scanId}`, + ); + try { + const compliances = await fetch(url.toString(), { + headers: { + Accept: "application/vnd.api+json", + Authorization: `Bearer ${session?.accessToken}`, + }, + }); + const data = await compliances.json(); + const parsedData = parseStringify(data); + revalidatePath("/compliance"); + return parsedData; + } catch (error) { + // eslint-disable-next-line no-console + console.error("Error fetching providers:", error); + return undefined; + } +}; diff --git a/actions/compliances/index.ts b/actions/compliances/index.ts new file mode 100644 index 0000000000..ba9df7e860 --- /dev/null +++ b/actions/compliances/index.ts @@ -0,0 +1 @@ +export * from "./compliances"; diff --git a/actions/invitations/index.ts b/actions/invitations/index.ts new file mode 100644 index 0000000000..addd041884 --- /dev/null +++ b/actions/invitations/index.ts @@ -0,0 +1 @@ +export * from "./invitation"; diff --git a/actions/invitations/invitation.ts b/actions/invitations/invitation.ts index 654d9fd982..56aefc74e1 100644 --- a/actions/invitations/invitation.ts +++ b/actions/invitations/invitation.ts @@ -42,6 +42,7 @@ export const getInvitations = async ({ revalidatePath("/invitations"); return parsedData; } catch (error) { + // eslint-disable-next-line no-console console.error("Error fetching invitations:", error); return undefined; } @@ -117,6 +118,7 @@ export const updateInvite = async (formData: FormData) => { revalidatePath("/invitations"); return parseStringify(data); } catch (error) { + // eslint-disable-next-line no-console console.error("Error updating invitation:", error); return { error: getErrorMessage(error), diff --git a/app/(prowler)/compliance/page.tsx b/app/(prowler)/compliance/page.tsx index 6cc1c5c11e..7e47723441 100644 --- a/app/(prowler)/compliance/page.tsx +++ b/app/(prowler)/compliance/page.tsx @@ -1,15 +1,14 @@ import { Spacer } from "@nextui-org/react"; -import { redirect } from "next/navigation"; import { Suspense } from "react"; -import { getCompliance } from "@/actions/compliance"; +import { getCompliancesOverview } from "@/actions/compliances"; import { ComplianceCard, ComplianceSkeletonGrid, } from "@/components/compliance"; import { FilterControls } from "@/components/filters"; import { Header } from "@/components/ui"; -import { SearchParamsProps } from "@/types"; +import { ComplianceOverviewData, SearchParamsProps } from "@/types"; export default async function Compliance({ searchParams, @@ -23,41 +22,48 @@ export default async function Compliance({
- + }> - + ); } -const SSRComplianceGrid = async ({ - searchParams, -}: { - searchParams: SearchParamsProps; -}) => { - const page = parseInt(searchParams.page?.toString() || "1", 10); - const compliancesData = await getCompliance({ page }); - const [compliances] = await Promise.all([compliancesData]); +const SSRComplianceGrid = async () => { + // const scanId = "01929f57-c0ee-7553-be0b-cbde006fb6f7"; + const scanId = "0193358c-bd7f-7eec-b13a-2d4a648b8df"; + const compliancesData = await getCompliancesOverview({ scanId }); + console.log(compliancesData, "compliancesData"); - if (compliances?.errors) redirect("/compliance"); + if (compliancesData?.errors?.length > 0) { + return ( +
+
There is no compliance data.
+
+ ); + } return ( -
- {compliances.compliance?.data.map((compliance: any) => ( - - ))} +
+ {compliancesData?.data?.map((compliance: ComplianceOverviewData) => { + const { attributes } = compliance; + const { + framework, + requirements_status: { passed, total }, + } = attributes; + + return ( + + ); + })}
); }; diff --git a/types/components.ts b/types/components.ts index 52b553cce0..7ec383d408 100644 --- a/types/components.ts +++ b/types/components.ts @@ -100,6 +100,53 @@ export interface ApiError { }; code: string; } +export interface CompliancesOverview { + links: { + first: string; + last: string; + next: string | null; + prev: string | null; + }; + data: ComplianceOverviewData[]; + meta: { + pagination: { + page: number; + pages: number; + count: number; + }; + version: string; + }; +} + +export interface ComplianceOverviewData { + type: "compliance-overviews"; + id: string; + attributes: { + inserted_at: string; + compliance_id: string; + framework: string; + version: string; + requirements_status: { + passed: number; + failed: number; + manual: number; + total: number; + }; + region: string; + provider_type: string; + }; + relationships: { + scan: { + data: { + type: "scans"; + id: string; + }; + }; + }; + links: { + self: string; + }; +} export interface InvitationProps { type: "invitations";