/** * CLI entry point for the Phase 2 canonical backfill. * * Usage: * npm run backfill:canonical -- [--dry-run | --apply] [--sport=] * * Defaults to --dry-run for safety. No writes will be issued unless * --apply is passed explicitly. */ import { DatabaseContext } from "~/database/context"; import { db } from "../server/db"; import { runBackfill } from "./backfill-canonical-layer"; import type { BackfillOptions } from "./backfill-canonical-layer"; function printHelp(): void { console.log( [ "Usage: backfill-cli [options]", "", "Options:", " --dry-run Run without writing (default).", " --apply Actually write to the database.", " --sport= Only backfill for the given sport id.", " --help Show this message.", ].join("\n"), ); } function parseArgs(): BackfillOptions { const args = process.argv.slice(2); const opts: BackfillOptions = { dryRun: true }; // dry-run by default for safety for (const a of args) { if (a === "--apply") { opts.dryRun = false; } else if (a === "--dry-run") { opts.dryRun = true; } else if (a.startsWith("--sport=")) { opts.sportId = a.slice("--sport=".length); } else if (a === "--help" || a === "-h") { printHelp(); process.exit(0); } else { console.error(`unknown arg: ${a}`); process.exit(1); } } return opts; } async function main() { const opts = parseArgs(); console.log( `Running backfill (dryRun=${opts.dryRun}, sportId=${opts.sportId ?? "all"})`, ); const report = await DatabaseContext.run(db, () => runBackfill(opts)); console.log("---"); console.log(`tournamentsCreated: ${report.tournamentsCreated}`); console.log(`tournamentsLinked: ${report.tournamentsLinked}`); console.log(`participantsCreated: ${report.participantsCreated}`); console.log(`participantsLinked: ${report.participantsLinked}`); console.log(`tournamentResultsCreated: ${report.tournamentResultsCreated}`); console.log(`surfaceElosCreated: ${report.surfaceElosCreated}`); if (report.warnings.length) { console.log("\nWARNINGS:"); for (const w of report.warnings) console.log(` ${w}`); } if (report.errors.length) { console.log("\nERRORS:"); for (const e of report.errors) console.log(` ${e}`); process.exit(2); } } main() .then(() => process.exit(0)) .catch((e) => { console.error(e); process.exit(1); });