feat(phase-16): enhanced Tests view, Red/Blue dashboard metrics, and Template admin panel (T-122, T-123, T-124)

This commit is contained in:
2026-02-09 13:00:07 +01:00
parent fd7f855008
commit a95defcee4
12 changed files with 1769 additions and 159 deletions
+47
View File
@@ -95,6 +95,53 @@ export async function createTemplate(
return data;
}
// ── Stats (admin) ──────────────────────────────────────────────────
export interface TemplateStats {
total: number;
active: number;
inactive: number;
by_source: Record<string, number>;
by_platform: Record<string, number>;
}
/** Fetch template catalog statistics. Admin only. */
export async function getTemplateStats(): Promise<TemplateStats> {
const { data } = await client.get<TemplateStats>("/test-templates/stats");
return data;
}
// ── Toggle active (admin) ──────────────────────────────────────────
/** Toggle a template between active/inactive. Admin only. */
export async function toggleTemplateActive(
id: string,
): Promise<TestTemplate> {
const { data } = await client.patch<TestTemplate>(
`/test-templates/${id}/toggle-active`,
);
return data;
}
// ── All templates (include inactive, for admin) ────────────────────
/** Fetch all templates including inactive ones (for admin management). */
export async function getAllTemplates(
filters?: TemplateFilters,
): Promise<TestTemplate[]> {
const params = new URLSearchParams();
if (filters?.source) params.append("source", filters.source);
if (filters?.platform) params.append("platform", filters.platform);
if (filters?.search) params.append("search", filters.search);
if (filters?.offset !== undefined) params.append("offset", String(filters.offset));
if (filters?.limit !== undefined) params.append("limit", String(filters.limit));
const { data } = await client.get<TestTemplate[]>(
`/test-templates${params.toString() ? `?${params}` : ""}`,
);
return data;
}
// ── Import Atomic Red Team ─────────────────────────────────────────
/** Trigger Atomic Red Team import. Admin only. */