feat(phase-27): add advanced ATT&CK Navigator-style heatmap with layers, filters and export (T-221 to T-223)
This commit is contained in:
98
frontend/src/api/heatmap.ts
Normal file
98
frontend/src/api/heatmap.ts
Normal file
@@ -0,0 +1,98 @@
|
||||
import client from "./client";
|
||||
|
||||
// ── Types ────────────────────────────────────────────────────────────
|
||||
|
||||
export interface HeatmapMetadata {
|
||||
name: string;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export interface HeatmapTechnique {
|
||||
techniqueID: string;
|
||||
tactic: string;
|
||||
color: string;
|
||||
score: number;
|
||||
comment: string;
|
||||
enabled: boolean;
|
||||
metadata: HeatmapMetadata[];
|
||||
}
|
||||
|
||||
export interface HeatmapLayer {
|
||||
name: string;
|
||||
versions: {
|
||||
attack: string;
|
||||
navigator: string;
|
||||
layer: string;
|
||||
};
|
||||
domain: string;
|
||||
description: string;
|
||||
filters: {
|
||||
platforms: string[];
|
||||
};
|
||||
gradient: {
|
||||
colors: string[];
|
||||
minValue: number;
|
||||
maxValue: number;
|
||||
};
|
||||
techniques: HeatmapTechnique[];
|
||||
}
|
||||
|
||||
export interface HeatmapFilters {
|
||||
platforms?: string;
|
||||
tactics?: string;
|
||||
min_score?: number;
|
||||
}
|
||||
|
||||
// ── API Functions ────────────────────────────────────────────────────
|
||||
|
||||
/** Fetch the coverage heatmap layer. */
|
||||
export async function getHeatmapCoverage(filters?: HeatmapFilters): Promise<HeatmapLayer> {
|
||||
const { data } = await client.get<HeatmapLayer>("/heatmap/coverage", { params: filters });
|
||||
return data;
|
||||
}
|
||||
|
||||
/** Fetch the threat actor heatmap layer. */
|
||||
export async function getHeatmapThreatActor(
|
||||
actorId: string,
|
||||
filters?: HeatmapFilters,
|
||||
): Promise<HeatmapLayer> {
|
||||
const { data } = await client.get<HeatmapLayer>(`/heatmap/threat-actor/${actorId}`, {
|
||||
params: filters,
|
||||
});
|
||||
return data;
|
||||
}
|
||||
|
||||
/** Fetch the detection rules heatmap layer. */
|
||||
export async function getHeatmapDetectionRules(filters?: HeatmapFilters): Promise<HeatmapLayer> {
|
||||
const { data } = await client.get<HeatmapLayer>("/heatmap/detection-rules", { params: filters });
|
||||
return data;
|
||||
}
|
||||
|
||||
/** Fetch the campaign heatmap layer. */
|
||||
export async function getHeatmapCampaign(
|
||||
campaignId: string,
|
||||
filters?: HeatmapFilters,
|
||||
): Promise<HeatmapLayer> {
|
||||
const { data } = await client.get<HeatmapLayer>(`/heatmap/campaign/${campaignId}`, {
|
||||
params: filters,
|
||||
});
|
||||
return data;
|
||||
}
|
||||
|
||||
/** Export a heatmap layer as a Navigator JSON file (returns blob URL). */
|
||||
export async function exportNavigatorJSON(
|
||||
layerType: string,
|
||||
layerId?: string,
|
||||
filters?: HeatmapFilters,
|
||||
): Promise<Blob> {
|
||||
const params: Record<string, string | number | undefined> = {
|
||||
layer: layerType,
|
||||
layer_id: layerId,
|
||||
...filters,
|
||||
};
|
||||
const { data } = await client.get("/heatmap/export-navigator", {
|
||||
params,
|
||||
responseType: "blob",
|
||||
});
|
||||
return data;
|
||||
}
|
||||
Reference in New Issue
Block a user