mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-07 04:12:04 +00:00
A full rollup backfill that failed on every boot showed only on the admin page's card of failing background jobs. From the account's side the only symptom was empty dashboard cards, and nothing pointed the operator at the card (#1298). A new hourly evaluation reads the newest terminal runs of every queue whose failure has no account-facing surface (the system audience in subsystem-surface.ts) from pg-boss's own ledger. A failed run adds its attempts, retries included, and the first successful run ends the streak. Three failed attempts in a row send every admin a SYSTEM_ALERT once, a reminder at most once a day while the queue keeps failing, and one notice when it runs successfully again: the decision the backup health notices use, with the same compare-and-set claim, so two workers never send a notice twice. The memory is one row per announced queue in system_job_alert_notices (migration 0490). The notice names the queue, the streak and the last error, and opens the admin status page.
prisma/
The database layer. HealthLog runs on PostgreSQL 18 (the compose default) or 16 via Prisma 7. This directory holds the single schema file and the forward-only migration history; the generated client is emitted elsewhere.
Contents
schema.prisma— 61 models, one file.cuid()primary keys,snake_casecolumns via@map(...), encrypted columns mostly suffixed*Encrypted(search the file; there are 24 encrypted column references). Thegenerator clientblock emits to../src/generated/prisma(imported as@/generated/prisma).migrations/— numbered, forward-only SQL migrations (0001_…upward).migration_lock.tomlpins the provider topostgresql.
Migration workflow
# author a migration from a schema edit
pnpm dlx prisma migrate dev --name <short_snake_case_name>
# regenerate the client after any schema change
pnpm dlx prisma generate
Number a new migration with the next free prefix. The production entrypoint runs prisma migrate deploy on boot, so every migration must apply cleanly forward — there is no down-migration path. Always include the migration file in the same change as the schema edit.
Conventions
- Encryption is fail-closed:
*Encryptedcolumns are written through@/lib/crypto(AES-256-GCM, versioned key ids); never store plaintext in an encrypted column. Key rotation isscripts/rotate-encryption-key.ts+docs/ops/encryption-key-rotation.md. - The generated client under
src/generated/prismais build output — do not edit it. - Schema-touching changes that affect the API surface must regenerate
docs/api/openapi.yaml(see../CLAUDE.md).
Related: ../src/lib/README.md (db.ts, rollups/), ../docs/ops/ (migrations + backup runbooks).