Files
lislgosms/tools/testing/backfill-signature-analytics.mjs
T

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();
}