20 lines
1.1 KiB
TypeScript
20 lines
1.1 KiB
TypeScript
import type { FindingRecord } from '../../domain/finding';
|
|
import { policyBackupImpactKey, type PolicyWorkResult } from '../../evaluation/policy-work-results';
|
|
import { policySourceReference } from '../../profiles/group-policy/source-presentation';
|
|
|
|
/** All evidence sources of a Fail comparison, not a new per-backup verdict. */
|
|
export function policyBackupImpactSources(result: PolicyWorkResult): NonNullable<FindingRecord['policyFailingBackupSources']> {
|
|
if (result.status !== 'Fail') return [];
|
|
const sources = new Map<string, { id: string; label: string }>();
|
|
for (const source of result.sources) {
|
|
const id = policyBackupImpactKey(source);
|
|
if (!id || sources.has(id)) continue;
|
|
const reference = policySourceReference(source.sourceLocator?.objectPath);
|
|
const nativeBackup = /^(\{[0-9a-f-]+\})\//i.exec(reference)?.[1];
|
|
// Include the retained internal identity so equal names/references never hide distinct backups.
|
|
const label = [nativeBackup, source.policyBackupInstanceId, source.importedAt].filter(Boolean).join(' · ');
|
|
sources.set(id, { id, label });
|
|
}
|
|
return [...sources.values()];
|
|
}
|