Assessor_2.0/src/domain/gpo-metadata.ts

63 lines
2.3 KiB
TypeScript

import type { GpoSecretIndicatorStatus } from './gpo-ingestion';
export interface GpoBackupMetadataDocument {
version: 1;
parser: { id: 'gpo-backup-metadata-xml'; version: '1.0.0' | '1.1.0' | '1.2.0' };
sourcePath: string;
sourceSha256: string;
status: 'complete' | 'partial' | 'invalid';
gpoId?: string;
backupId?: string;
domainKey?: string;
backupCreatedAt?: string;
secretIndicatorStatus: GpoSecretIndicatorStatus;
diagnosticCodes: string[];
}
export interface GpoBackupMetadataAggregate {
version: 1;
status: 'complete' | 'partial' | 'invalid';
gpoId?: string;
backupId?: string;
domainKey?: string;
backupCreatedAt?: string;
sourcePaths: string[];
diagnosticCodes: string[];
}
function unique(values: Array<string | undefined>): string[] {
return [...new Set(values.filter((value): value is string => Boolean(value)))].sort();
}
export function aggregateGpoBackupMetadata(documents: GpoBackupMetadataDocument[]): GpoBackupMetadataAggregate {
const diagnostics = new Set(documents.flatMap(document => document.diagnosticCodes));
let invalid = documents.some(document => document.status === 'invalid');
const field = (name: 'gpoId' | 'backupId' | 'domainKey' | 'backupCreatedAt'): string | undefined => {
const values = unique(documents.map(document => document[name]));
if (values.length > 1) {
diagnostics.add(`gpo-metadata-${name}-conflict`);
invalid = true;
}
return values.length === 1 ? values[0] : undefined;
};
const gpoId = field('gpoId');
const backupId = field('backupId');
const domainKey = field('domainKey');
const backupCreatedAt = field('backupCreatedAt');
const complete = Boolean(gpoId && backupId && domainKey && backupCreatedAt);
if (!gpoId) diagnostics.add('gpo-metadata-gpo-id-missing');
if (!backupId) diagnostics.add('gpo-metadata-backup-id-missing');
if (!domainKey) diagnostics.add('gpo-metadata-domain-missing');
if (!backupCreatedAt) diagnostics.add('gpo-metadata-backup-time-missing');
return {
version: 1,
status: invalid ? 'invalid' : complete ? 'complete' : 'partial',
gpoId,
backupId,
domainKey,
backupCreatedAt,
sourcePaths: [...new Set(documents.map(document => document.sourcePath))].sort(),
diagnosticCodes: [...diagnostics].sort()
};
}