Initial commit: digital reception monorepo (M1-M11 + demo extensions)
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
import 'dotenv/config';
|
||||
import { readFileSync, existsSync, readdirSync } from 'node:fs';
|
||||
import { dirname, join, resolve } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { PrismaClient } from '@reception/db';
|
||||
import { runScenario } from './runner.js';
|
||||
import type { Scenario } from './types.js';
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const SCENARIOS_DIR = resolve(__dirname, '..', 'scenarios');
|
||||
|
||||
function parseArgs(argv: string[]): { scenario?: string; mode: 'realtime' | 'fast'; list: boolean } {
|
||||
let scenario: string | undefined;
|
||||
let mode: 'realtime' | 'fast' = 'fast';
|
||||
let list = false;
|
||||
for (let i = 0; i < argv.length; i++) {
|
||||
const arg = argv[i];
|
||||
if (arg === '--list') list = true;
|
||||
else if (arg?.startsWith('--scenario=')) scenario = arg.slice('--scenario='.length);
|
||||
else if (arg === '--scenario') scenario = argv[++i];
|
||||
else if (arg?.startsWith('--mode=')) mode = arg.slice('--mode='.length) as 'realtime' | 'fast';
|
||||
else if (arg === '--mode') mode = argv[++i] as 'realtime' | 'fast';
|
||||
}
|
||||
return { scenario, mode, list };
|
||||
}
|
||||
|
||||
function loadScenario(name: string): Scenario {
|
||||
const path = join(SCENARIOS_DIR, `${name}.json`);
|
||||
if (!existsSync(path)) {
|
||||
throw new Error(`Сценарий "${name}" не найден в ${SCENARIOS_DIR}`);
|
||||
}
|
||||
return JSON.parse(readFileSync(path, 'utf-8')) as Scenario;
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const { scenario, mode, list } = parseArgs(process.argv.slice(2));
|
||||
|
||||
if (list || !scenario) {
|
||||
const files = readdirSync(SCENARIOS_DIR).filter((f) => f.endsWith('.json'));
|
||||
console.log('Доступные сценарии:');
|
||||
for (const f of files) {
|
||||
const s = JSON.parse(readFileSync(join(SCENARIOS_DIR, f), 'utf-8')) as Scenario;
|
||||
console.log(` ${s.name.padEnd(24)} — ${s.description}`);
|
||||
}
|
||||
if (!scenario) {
|
||||
console.log('\nИспользование: pnpm fixtures:run --scenario=new-patient [--mode=realtime|fast]');
|
||||
// --list — нормальный код выхода 0. Если просто отсутствует --scenario, тоже 0.
|
||||
return;
|
||||
}
|
||||
if (list) return; // --list + --scenario — показать список и продолжить выполнение? нет, выйти.
|
||||
}
|
||||
|
||||
const apiBaseUrl = process.env.API_BASE_URL ?? 'http://localhost:4000';
|
||||
const faceServiceUrl = process.env.FACE_SERVICE_URL ?? 'http://localhost:8001';
|
||||
|
||||
console.log(`Загружаю сценарий ${scenario}, mode=${mode}, api=${apiBaseUrl}, face=${faceServiceUrl}`);
|
||||
const s = loadScenario(scenario);
|
||||
const prisma = new PrismaClient();
|
||||
try {
|
||||
const result = await runScenario({
|
||||
scenario: s,
|
||||
apiBaseUrl,
|
||||
faceServiceUrl,
|
||||
prisma,
|
||||
realtime: mode === 'realtime',
|
||||
});
|
||||
console.log('\nИтог:', JSON.stringify(result, null, 2));
|
||||
} finally {
|
||||
await prisma.$disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
main().catch((err) => {
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
});
|
||||
Reference in New Issue
Block a user