mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-07 04:12:04 +00:00
Shipped iOS builds multiply oxygen saturation and body fat by 100 before upload. The importer scaled them again, so 0.97 was stored as 9700, the plausibility guard rejected the row as out of range inside an HTTP 200, and the client treats that skip as final and moves its HealthKit anchor past the sample. Every reading of those two types was lost, silently, on every install that syncs them. The contract says values travel raw and the server scales, and that is what the OpenAPI description publishes. One comment in the schema said the opposite, that the client must multiply by 100 first, and that is the line the app was built against. It is corrected here. The five percent-shaped HealthKit identifiers now take either spelling: a value above the fraction ceiling is already a percent and passes through, anything at or below it is scaled. The domains do not overlap, and the per-type range guard still rejects what is impossible either way. Current app builds stop losing readings without an app release. The tests pin both spellings, the range after conversion, and that the tolerant converter covers the percent class and nothing else: waist circumference uses the same factor to turn metres into centimetres, and a blanket change made a 1.02 m waist into 1.02 cm. Refs MBombeck/healthlog-iOS#7
prisma/
The database layer. HealthLog runs PostgreSQL 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).