forked from boos/BoosAPI
2f774e204c
The usage aggregation projector was written with SQLite/Postgres conflict builders, but Render can switch the runtime DB to MySQL from saved settings. That made the startup scheduler throw before the service stayed healthy. This change branches the projector's checkpoint and aggregate writes to MySQL-safe onDuplicateKeyUpdate calls while preserving the existing SQLite/Postgres onConflict behavior. A mocked MySQL regression test now omits the onConflict builders entirely so future regressions fail fast. Constraint: Drizzle conflict APIs are dialect-specific and the projector starts during boot Rejected: Disable the projector on MySQL | would keep admin analytics stale and hide the real incompatibility Confidence: high Scope-risk: narrow Reversibility: clean Directive: New usage-aggregation writes must branch on runtimeDbDialect before using conflict helpers Tested: npx vitest run --root . src/server/services/usageAggregationService.test.ts src/server/services/usageAggregationService.mysql.test.ts Tested: npm run typecheck:server Tested: npm run repo:drift-check Tested: npm run build:server Not-tested: Live MySQL projector pass against a deployed runtime database