42 lines
1.9 KiB
JavaScript
42 lines
1.9 KiB
JavaScript
// Offline operator entry point. No SMS, detection, notification or history overwrite is performed.
|
|
import { createRequire } from 'node:module';
|
|
import assert from 'node:assert/strict';
|
|
const args = Object.fromEntries(process.argv.slice(2).map((a) => a.replace(/^--/, '').split('=')));
|
|
const url = new URL(process.env.DATABASE_URL || '');
|
|
assert(
|
|
args.host && args.host === url.hostname,
|
|
'Supply --host matching DATABASE_URL and an explicitly authorized target',
|
|
);
|
|
assert(args.dates, 'Supply --dates=YYYY-MM-DD,YYYY-MM-DD; no implicit historical range');
|
|
const dates = [...new Set(args.dates.split(','))];
|
|
assert(dates.length <= 366, 'At most 366 explicitly selected days per invocation');
|
|
process.env.NODE_ENV = 'test'; // Disable all automatic schedulers; this script only creates the report writer.
|
|
const require = createRequire(new URL('../../api/package.json', import.meta.url));
|
|
require('reflect-metadata');
|
|
const { PrismaService } = require('./dist/prisma/prisma.service');
|
|
const { SignatureAnalyticsService } = require('./dist/signature-analytics/signature-analytics.service');
|
|
const { analyticsDate, databaseDay, todayKey } = require('./dist/signature-analytics/analytics-date');
|
|
const db = new PrismaService();
|
|
try {
|
|
for (const day of dates) {
|
|
analyticsDate(day);
|
|
assert(day < todayKey(), 'Only complete natural days may be backfilled');
|
|
const current = await db.signatureAnalyticsDay.findUnique({ where: { businessDate: databaseDay(day) } });
|
|
assert(!current?.publishedGenerationId, `${day}: published report exists; overwriting is forbidden`);
|
|
}
|
|
console.log(
|
|
JSON.stringify({
|
|
host: url.hostname,
|
|
dates,
|
|
execute: args.execute === 'yes',
|
|
provenance: 'backfill-current-source',
|
|
}),
|
|
);
|
|
if (args.execute === 'yes') {
|
|
const writer = new SignatureAnalyticsService(db);
|
|
for (const day of dates) console.log(JSON.stringify(await writer.generate(day, true)));
|
|
}
|
|
} finally {
|
|
await db.onModuleDestroy();
|
|
}
|