mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-01-25 02:08:11 +00:00
feat: enhance getScans API to support fields and include parameters; … (#8140)
This commit is contained in:
@@ -16,6 +16,8 @@ export const getScans = async ({
|
|||||||
sort = "",
|
sort = "",
|
||||||
filters = {},
|
filters = {},
|
||||||
pageSize = 10,
|
pageSize = 10,
|
||||||
|
fields = {},
|
||||||
|
include = "",
|
||||||
}) => {
|
}) => {
|
||||||
const headers = await getAuthHeaders({ contentType: false });
|
const headers = await getAuthHeaders({ contentType: false });
|
||||||
|
|
||||||
@@ -27,6 +29,12 @@ export const getScans = async ({
|
|||||||
if (pageSize) url.searchParams.append("page[size]", pageSize.toString());
|
if (pageSize) url.searchParams.append("page[size]", pageSize.toString());
|
||||||
if (query) url.searchParams.append("filter[search]", query);
|
if (query) url.searchParams.append("filter[search]", query);
|
||||||
if (sort) url.searchParams.append("sort", sort);
|
if (sort) url.searchParams.append("sort", sort);
|
||||||
|
if (include) url.searchParams.append("include", include);
|
||||||
|
|
||||||
|
// Handle fields parameters
|
||||||
|
Object.entries(fields).forEach(([key, value]) => {
|
||||||
|
url.searchParams.append(`fields[${key}]`, String(value));
|
||||||
|
});
|
||||||
|
|
||||||
// Handle multiple filters
|
// Handle multiple filters
|
||||||
Object.entries(filters).forEach(([key, value]) => {
|
Object.entries(filters).forEach(([key, value]) => {
|
||||||
|
|||||||
@@ -115,7 +115,9 @@ export default async function ComplianceDetail({
|
|||||||
>
|
>
|
||||||
{selectedScanId && selectedScan && (
|
{selectedScanId && selectedScan && (
|
||||||
<div className="flex max-w-[328px] flex-col items-start">
|
<div className="flex max-w-[328px] flex-col items-start">
|
||||||
<ComplianceScanInfo scan={selectedScan} />
|
<div className="rounded-lg bg-gray-50 p-2 dark:bg-gray-800">
|
||||||
|
<ComplianceScanInfo scan={selectedScan} />
|
||||||
|
</div>
|
||||||
<Spacer y={8} />
|
<Spacer y={8} />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { Suspense } from "react";
|
|||||||
|
|
||||||
import { getCompliancesOverview } from "@/actions/compliances";
|
import { getCompliancesOverview } from "@/actions/compliances";
|
||||||
import { getComplianceOverviewMetadataInfo } from "@/actions/compliances";
|
import { getComplianceOverviewMetadataInfo } from "@/actions/compliances";
|
||||||
import { getProvider } from "@/actions/providers";
|
|
||||||
import { getScans } from "@/actions/scans";
|
import { getScans } from "@/actions/scans";
|
||||||
import {
|
import {
|
||||||
ComplianceCard,
|
ComplianceCard,
|
||||||
@@ -36,34 +35,41 @@ export default async function Compliance({
|
|||||||
"filter[state]": "completed",
|
"filter[state]": "completed",
|
||||||
},
|
},
|
||||||
pageSize: 50,
|
pageSize: 50,
|
||||||
|
fields: {
|
||||||
|
scans: "name,completed_at,provider",
|
||||||
|
},
|
||||||
|
include: "provider",
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!scansData?.data) {
|
if (!scansData?.data) {
|
||||||
return <NoScansAvailable />;
|
return <NoScansAvailable />;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expand scans with provider information - only include scans with valid provider
|
// Process scans with provider information from included data
|
||||||
const expandedScansData: ExpandedScanData[] = await Promise.all(
|
const expandedScansData: ExpandedScanData[] = scansData.data
|
||||||
scansData.data
|
.filter((scan: ScanProps) => scan.relationships?.provider?.data?.id)
|
||||||
.filter((scan: ScanProps) => scan.relationships?.provider?.data?.id)
|
.map((scan: ScanProps) => {
|
||||||
.map(async (scan: ScanProps) => {
|
const providerId = scan.relationships!.provider!.data!.id;
|
||||||
const providerId = scan.relationships!.provider!.data!.id;
|
|
||||||
|
|
||||||
const formData = new FormData();
|
// Find the provider data in the included array
|
||||||
formData.append("id", providerId);
|
const providerData = scansData.included?.find(
|
||||||
|
(item: any) => item.type === "providers" && item.id === providerId,
|
||||||
|
);
|
||||||
|
|
||||||
const providerData = await getProvider(formData);
|
if (!providerData) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...scan,
|
...scan,
|
||||||
providerInfo: {
|
providerInfo: {
|
||||||
provider: providerData.data.attributes.provider,
|
provider: providerData.attributes.provider,
|
||||||
uid: providerData.data.attributes.uid,
|
uid: providerData.attributes.uid,
|
||||||
alias: providerData.data.attributes.alias,
|
alias: providerData.attributes.alias,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}),
|
})
|
||||||
);
|
.filter(Boolean) as ExpandedScanData[];
|
||||||
|
|
||||||
const selectedScanId =
|
const selectedScanId =
|
||||||
searchParams.scanId || expandedScansData[0]?.id || null;
|
searchParams.scanId || expandedScansData[0]?.id || null;
|
||||||
@@ -140,7 +146,7 @@ const SSRComplianceGrid = async ({
|
|||||||
query,
|
query,
|
||||||
});
|
});
|
||||||
|
|
||||||
const type = compliancesData?.data?.[0]?.type;
|
const type = compliancesData?.data?.type;
|
||||||
|
|
||||||
// Check if the response contains no data
|
// Check if the response contains no data
|
||||||
if (
|
if (
|
||||||
|
|||||||
@@ -67,3 +67,27 @@ export interface ExpandedScanData extends ScanProps {
|
|||||||
alias: string;
|
alias: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ScansApiResponse {
|
||||||
|
links: {
|
||||||
|
first: string;
|
||||||
|
last: string;
|
||||||
|
next: string | null;
|
||||||
|
prev: string | null;
|
||||||
|
};
|
||||||
|
data: ScanProps[];
|
||||||
|
included?: Array<{
|
||||||
|
type: string;
|
||||||
|
id: string;
|
||||||
|
attributes: any;
|
||||||
|
relationships?: any;
|
||||||
|
}>;
|
||||||
|
meta: {
|
||||||
|
pagination: {
|
||||||
|
page: number;
|
||||||
|
pages: number;
|
||||||
|
count: number;
|
||||||
|
};
|
||||||
|
version: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user