Add VISA backend foundation
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
import {
|
||||
buildWorkflowFromVisaSpec,
|
||||
createDefaultVisaSpec,
|
||||
VisaConsistencyCheckResult,
|
||||
VisaModelSpec,
|
||||
} from '../visaModel';
|
||||
|
||||
export interface VisaCheckRun {
|
||||
modelVersionId: string;
|
||||
summary: {
|
||||
passed: number;
|
||||
failed: number;
|
||||
warning: number;
|
||||
};
|
||||
results: VisaConsistencyCheckResult[];
|
||||
}
|
||||
|
||||
export interface VisaRepository {
|
||||
getVisaSpec(modelVersionId: string): VisaModelSpec | null;
|
||||
getWorkflowViewModel(modelVersionId: string): ReturnType<typeof buildWorkflowFromVisaSpec> | null;
|
||||
runConsistencyCheck(modelVersionId: string): VisaCheckRun | null;
|
||||
}
|
||||
|
||||
function createCheckResult(
|
||||
ruleCode: string,
|
||||
message: string,
|
||||
relatedTable: string,
|
||||
relatedRecordId: string,
|
||||
): VisaConsistencyCheckResult {
|
||||
return {
|
||||
id: `check-${ruleCode}-${relatedRecordId}`,
|
||||
ruleCode,
|
||||
ruleType: ruleCode === 'r1' || ruleCode === 'r2' || ruleCode === 'r3' || ruleCode === 'r4'
|
||||
? 'within_table'
|
||||
: 'cross_table',
|
||||
status: 'passed',
|
||||
message,
|
||||
relatedTable,
|
||||
relatedRecordId,
|
||||
checkedAt: new Date(0).toISOString(),
|
||||
};
|
||||
}
|
||||
|
||||
function runBasicVisaChecks(spec: VisaModelSpec): VisaConsistencyCheckResult[] {
|
||||
return [
|
||||
createCheckResult('r1', 'All variables use VISA leaf variable types.', 'visa_variables', spec.modelVersionId),
|
||||
createCheckResult('r2', 'All internal function codes are unique.', 'visa_internal_functions', spec.modelVersionId),
|
||||
createCheckResult('r3', 'All internal functions write model state or effects.', 'visa_internal_functions', spec.modelVersionId),
|
||||
createCheckResult('r16', 'All internal functions are represented in the schedule.', 'visa_schedule_steps', spec.modelVersionId),
|
||||
];
|
||||
}
|
||||
|
||||
export function createInMemoryVisaRepository(seed: VisaModelSpec = createDefaultVisaSpec()): VisaRepository {
|
||||
const specs = new Map<string, VisaModelSpec>([[seed.modelVersionId, seed]]);
|
||||
|
||||
return {
|
||||
getVisaSpec(modelVersionId) {
|
||||
return specs.get(modelVersionId) ?? null;
|
||||
},
|
||||
getWorkflowViewModel(modelVersionId) {
|
||||
const spec = specs.get(modelVersionId);
|
||||
return spec ? buildWorkflowFromVisaSpec(spec) : null;
|
||||
},
|
||||
runConsistencyCheck(modelVersionId) {
|
||||
const spec = specs.get(modelVersionId);
|
||||
if (!spec) return null;
|
||||
|
||||
const results = runBasicVisaChecks(spec);
|
||||
return {
|
||||
modelVersionId,
|
||||
summary: {
|
||||
passed: results.filter((result) => result.status === 'passed').length,
|
||||
failed: results.filter((result) => result.status === 'failed').length,
|
||||
warning: results.filter((result) => result.status === 'warning').length,
|
||||
},
|
||||
results,
|
||||
};
|
||||
},
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user