89 lines
7.2 KiB
JavaScript
89 lines
7.2 KiB
JavaScript
// Read-only reconciliation. Every live request is scoped to the explicitly authorized Dummy project.
|
|
import { createServer } from 'vite';
|
|
|
|
const projectId = 'project-7cbcb7ad';
|
|
const base = 'http://127.0.0.1:4173/api/v1';
|
|
const requests = [];
|
|
async function get(path) {
|
|
requests.push(path);
|
|
const response = await fetch(base + path, { signal: AbortSignal.timeout(60000) });
|
|
if (!response.ok) throw new Error(`Read failed: ${response.status} ${path}`);
|
|
return response.json();
|
|
}
|
|
const project = await get(`/projects/${projectId}`);
|
|
if (project.name !== 'Dummy') throw new Error('Refusing a project other than Dummy');
|
|
const [evaluations, overview, resultRows, observations] = await Promise.all([
|
|
get(`/projects/${projectId}/policy-evaluations`),
|
|
get(`/projects/${projectId}/policy-analysis-overview`),
|
|
get(`/results?projectId=${projectId}&sourceTool=GPOs&limit=10000`),
|
|
get(`/results?projectId=${projectId}&sourceKind=policy-observation&audience=internal-analysis&limit=10000`)
|
|
]);
|
|
if (resultRows.total !== resultRows.items.length || observations.total !== observations.items.length) throw new Error('Incomplete page');
|
|
const counts = (items, key) => Object.fromEntries([...Map.groupBy(items, key)].map(([value, group]) => [value, group.length]));
|
|
const vite = await createServer({ configFile: false, appType: 'custom', server: { middlewareMode: true, hmr: false, watch: null } });
|
|
try {
|
|
const { currentPolicyEvaluationsForWork } = await vite.ssrLoadModule('/src/features/project-import/load-canonical-project-workspace.ts');
|
|
const { appendPolicyObservationsToDataset } = await vite.ssrLoadModule('/src/features/project-import/policy-observations-to-dataset.ts');
|
|
const { createPolicyEvaluationUnifiedResult } = await vite.ssrLoadModule('/src/domain/unified-result.ts');
|
|
const { genericProfile } = await vite.ssrLoadModule('/src/profiles/generic/generic-profile.ts');
|
|
const { filterAndSortRecords } = await vite.ssrLoadModule('/src/features/search-filter/filter-records.ts');
|
|
const workRuns = currentPolicyEvaluationsForWork(evaluations.records,
|
|
new Set(observations.items.map(item => item.sourceResultId)), new Set(overview.current.evaluationRunIds));
|
|
const dataset = appendPolicyObservationsToDataset(null, 'Dummy', observations.items, workRuns);
|
|
const workRecords = dataset.sheets[0].analysis.records;
|
|
const field = (record, label) => record.fields.find(item => item.label === label)?.value ?? '';
|
|
const dbFails = resultRows.items.filter(item => item.isDeviation);
|
|
const workFails = workRecords.filter(item => field(item, 'Status') === 'Fail');
|
|
const filteredWork = filterAndSortRecords(dataset.sheets[0], { activeProfile: genericProfile, dataset,
|
|
search: '', sortColumn: 'all', sortDirection: 'asc', statusFilter: 'deviation', facetFilters: {}, actionOnly: false, reviews: {} });
|
|
const hiddenFails = workFails.filter(item => !filteredWork.includes(item));
|
|
const failsByIdentity = Map.groupBy(dbFails, item => item.policyIdentityKey);
|
|
const workFailIds = new Set(workFails.map(item => field(item, 'Technical Identity')));
|
|
const unique = items => [...new Set(items)];
|
|
const pair = item => JSON.stringify([item.identity?.id ?? item.policyIdentityKey, item.baselineId ?? item.policyBaselineId]);
|
|
const newFails = workRuns.flatMap(record => record.results.filter(item => createPolicyEvaluationUnifiedResult(record.run, item).isDeviation));
|
|
const oldPairs = new Set(dbFails.map(pair));
|
|
const newPairs = new Set(newFails.map(pair));
|
|
const summaryRun = record => ({ id: record.run.id, aggregation: record.run.aggregationRunId,
|
|
engine: record.run.evaluator.version, completedAt: record.run.completedAt, results: record.results.length,
|
|
analysisCount: record.run.baselineAnalysisIds.length,
|
|
packages: unique(record.results.map(item => item.baselineId)).length,
|
|
failComparisons: record.results.filter(item => createPolicyEvaluationUnifiedResult(record.run, item).isDeviation).length });
|
|
console.log(JSON.stringify({ capturedAt: new Date().toISOString(), projectId,
|
|
observationCount: observations.total, observationAssessments: counts(observations.items, item => item.assessmentId),
|
|
resultDb: { total: resultRows.total, classifications: counts(resultRows.items, item => item.policyClassification),
|
|
failRows: dbFails.length, failIdentities: failsByIdentity.size,
|
|
failRuns: counts(dbFails, item => item.evaluationRunId), failAssessments: counts(dbFails, item => item.assessmentId) },
|
|
work: { rows: workRecords.length, statuses: counts(workRecords, item => field(item, 'Status')),
|
|
actualDeviationFilterCount: filteredWork.length,
|
|
actualStatusFilterCounts: Object.fromEntries(['deviation', 'passed', 'not-configured', 'no-baseline-rule', 'not-comparable', 'conflicts', 'duplicates']
|
|
.map(status => [status, workRecords.filter(record => genericProfile.matchesStatus(record, status)).length])),
|
|
conflicts: workRecords.filter(item => field(item, 'Conflict')).length,
|
|
duplicates: workRecords.filter(item => field(item, 'Duplicates')).length,
|
|
selectedRuns: workRuns.map(summaryRun) },
|
|
relevantRuns: evaluations.records.filter(record => workRuns.some(current => current.run.aggregationRunId === record.run.aggregationRunId)).map(summaryRun),
|
|
reconciliation: { missingFromWork: unique(dbFails.filter(item => !workFailIds.has(item.policyIdentityKey)).map(item => item.policyIdentityKey)),
|
|
missingFromResultDb: [...workFailIds].filter(id => !failsByIdentity.has(id)),
|
|
uniqueOldFailPairs: oldPairs.size, uniqueNewFailPairs: newPairs.size,
|
|
excessOldFailComparisons: dbFails.length - oldPairs.size,
|
|
oldOnlyPairs: [...oldPairs].filter(key => !newPairs.has(key)), newOnlyPairs: [...newPairs].filter(key => !oldPairs.has(key)),
|
|
hiddenFailSettings: hiddenFails.map(record => ({ title: record.title, status: field(record, 'Status'), configured: field(record, 'Configured Value'),
|
|
identity: field(record, 'Technical Identity'),
|
|
comparisons: newFails.filter(item => item.identity.id === field(record, 'Technical Identity')).map(item => ({
|
|
baseline: item.baselineLabel, customerState: item.customerState, classification: item.classification,
|
|
baselineValue: item.comparator.baseline, decision: item.baselineVariantAssessment?.decision,
|
|
variants: item.baselineVariantAssessment?.variants.map(variant => ({ expected: variant.comparator.baseline, relation: variant.comparator.relation })) })) })),
|
|
settings: workFails.map(record => {
|
|
const identity = field(record, 'Technical Identity');
|
|
const rows = failsByIdentity.get(identity) ?? [];
|
|
const comparisons = evaluations.records.flatMap(evaluation => evaluation.results
|
|
.filter(item => rows.some(row => row.sourceResultId === item.id)));
|
|
const combinations = Map.groupBy(comparisons, item => item.baselineId);
|
|
return { title: record.title, identity, resultDbRows: rows.length,
|
|
distinctPackages: unique(rows.map(item => item.policyBaselineId)).length,
|
|
repeatedPackages: [...combinations].filter(([, items]) => items.length > 1).map(([, items]) => ({
|
|
baseline: items[0].baselineLabel, comparisons: items.length,
|
|
analysisVersions: unique(items.map(item => item.baselineAnalysisId)).length })) };
|
|
}) }, requests }, null, 2));
|
|
} finally { await vite.close(); }
|