mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-08 12:32:43 +00:00
Adds the columns the v1.5 cadence work needs without breaking any v1.4-era reader. Pre-existing `windowStart` / `windowEnd` / `daysOfWeek` stay live; v1.5.x writes both legacy + new; the read flip lands in v1.5.1 once production traffic has validated the new fields. ### Medication - `startsOn DATE?` — course start; anchors RRULE BYDAY / BYMONTHDAY patterns and the rolling-interval countdown's first window. NULL preserves the legacy implicit "from creation" anchor. - `endsOn DATE?` — course end; reminder worker stops minting slots past this date. NULL = chronic. - `oneShot BOOLEAN NOT NULL DEFAULT FALSE` — single-administration flag (flu shots, vaccines, post-op final doses). Auto-deactivates the medication after the single intake is logged. ### MedicationSchedule - `timesOfDay TEXT[]` — first-class HH:mm entries. Patients think in points-in-time, not in windows; the legacy single-window primitive misframed the mental model. Migration backfills `[windowStart]` for every pre-v1.5 row. - `reminderGraceMinutes INT?` — replaces the implicit `windowEnd - windowStart` span for late-classification. NULL falls back to the legacy math. - `rrule TEXT?` — RFC 5545 RRULE string for calendar-anchored cadences (every N weeks, monthly, quarterly, yearly, etc.). - `rolling_interval_days INT?` — flexible-rolling interval counted from the latest intake. Mutually exclusive with `rrule` via the `medication_schedules_rrule_xor_rolling` CHECK constraint. ### Backfill The migration walks every existing `medication_schedules` row and derives an `rrule` + a single-entry `timesOfDay` from the legacy encoding. Three branches: - `days_of_week IS NULL / ""` → `FREQ=DAILY` - `days_of_week = "1,3,5"` → `FREQ=WEEKLY;BYDAY=MO,WE,FR` - `days_of_week = "i2;1,3,5"` → `FREQ=WEEKLY;INTERVAL=2;BYDAY=MO,WE,FR` A `pg_temp` helper handles the HealthLog-weekday → RFC-5545-BYDAY conversion. Anything unexpected stays NULL so the v1.5.1 reader falls back to the legacy decoder. Indexes: - Partial index `medication_schedules_rolling_idx` on `rolling_interval_days IS NOT NULL` so the reminder worker can fan in over rolling schedules cheaply on every intake event. Column comments document the legacy → v1.5 → v1.6 migration plan so a future reader doesn't accidentally drop the legacy columns before the read-flip lands. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>