Files
prowler/ui/actions/attack-paths/scans.adapter.ts
Pablo Fernandez Guerra (PFE) 3554859a5c fix(ui): load every Attack Paths scan before displaying the selector (#10864)
Co-authored-by: Pablo F.G <pablo.fernandez@prowler.com>
Co-authored-by: Alejandro Bailo <59607668+alejandrobailo@users.noreply.github.com>
Co-authored-by: Pepe Fagoaga <pepe@prowler.com>
2026-04-24 09:41:47 +02:00

76 lines
2.3 KiB
TypeScript

import { formatDuration } from "@/lib/date-utils";
import { MetaDataProps } from "@/types";
import { AttackPathScan, AttackPathScansResponse } from "@/types/attack-paths";
/**
* Adapts raw scan API responses to enriched domain models
* - Transforms raw scan data with computed properties
* - Co-locates related data for better performance
* - Preserves pagination metadata for list operations
*
* Uses plugin architecture for extensibility:
* - Handles scan-specific response transformation
* - Can be composed with backend service plugins
* - Maintains separation of concerns between API layer and business logic
*/
/**
* Adapt attack path scans response with enriched data
*
* @param response - Raw API response from attack-paths-scans endpoint
* @returns Enriched scans data with metadata and computed properties
*/
export function adaptAttackPathScansResponse(
response: AttackPathScansResponse | undefined,
): {
data: AttackPathScan[];
metadata?: MetaDataProps;
} {
if (!response?.data) {
return { data: [] };
}
// Enrich scan data with computed properties
const enrichedData = response.data.map((scan) => ({
...scan,
attributes: {
...scan.attributes,
// Format duration for display
durationLabel: scan.attributes.duration
? formatDuration(scan.attributes.duration)
: null,
// Check if scan is recent (completed within last 24 hours)
isRecent: isRecentScan(scan.attributes.completed_at),
},
}));
const metadata: MetaDataProps | undefined = response.meta?.pagination
? {
pagination: {
page: response.meta.pagination.page,
pages: response.meta.pagination.pages,
count: response.meta.pagination.count,
itemsPerPage: [5, 10, 25, 50, 100],
},
version: response.meta.version ?? "1.0",
}
: undefined;
return { data: enrichedData, metadata };
}
/**
* Check if a scan is recent (completed within last 24 hours)
*
* @param completedAt - Completion timestamp
* @returns true if scan completed within last 24 hours
*/
function isRecentScan(completedAt: string | null): boolean {
if (!completedAt) return false;
const completionTime = new Date(completedAt).getTime();
const oneDayAgo = Date.now() - 24 * 60 * 60 * 1000;
return completionTime > oneDayAgo;
}