Matt
fb4a09e2ec
feat(reminders): Phase 4 partial — schema + service + validators
...
Migration 0072 — reminders/interests expansion:
- interests.reminder_note: optional cadence note for the existing
reminderEnabled+reminderDays flow. Surfaces in notification body
+ inbox row.
- reminders.yacht_id (+ FK + relation): fourth entity link so
yacht-scoped tasks have a typed home alongside client/interest/berth.
- reminders.fired_at: worker idempotency. Partial index
idx_reminders_due_unfired drives the scan.
Service + validator updates:
- createReminderSchema / updateReminderSchema accept yachtId.
- assertReminderFksInPort validates yacht ownership against the
caller's port — defense-in-depth, same shape as other entity FKs.
- createReminder / updateReminder thread yachtId through.
Worker scheduler + CreateReminderDialog yachtId UI deferred. The
existing reminders/reminder-form.tsx already covers the dialog
contract — Phase 4b extends it with yachtId + the per-user
digest_time_of_day picker.
Tests: 1374/1374 passing. tsc clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-18 15:03:12 +02:00
..
2026-05-14 14:53:58 +02:00
2026-05-13 12:27:08 +02:00
2026-05-04 22:57:01 +02:00
2026-05-14 14:56:58 +02:00
2026-05-06 14:57:24 +02:00
2026-05-14 15:19:38 +02:00
2026-05-07 20:58:34 +02:00
2026-05-18 13:28:50 +02:00
2026-05-07 21:02:12 +02:00
2026-05-14 15:47:49 +02:00
2026-05-05 04:07:03 +02:00
2026-05-12 21:13:10 +02:00
2026-05-12 21:32:19 +02:00
2026-05-15 01:18:13 +02:00
2026-05-12 18:29:03 +02:00
2026-05-14 23:55:22 +02:00
2026-05-14 23:55:22 +02:00
2026-05-14 03:38:16 +02:00
2026-05-06 14:58:47 +02:00
2026-05-15 01:18:13 +02:00
2026-05-15 01:18:13 +02:00
2026-05-13 11:50:07 +02:00
2026-05-05 20:48:13 +02:00
2026-05-14 15:19:38 +02:00
2026-05-18 13:28:50 +02:00
2026-05-13 12:27:08 +02:00
2026-05-13 12:27:08 +02:00
2026-05-18 13:28:50 +02:00
2026-05-12 18:16:18 +02:00
2026-05-14 03:39:21 +02:00
2026-05-18 13:28:50 +02:00
2026-05-14 22:49:43 +02:00
2026-05-18 14:57:55 +02:00
2026-05-18 13:28:50 +02:00
2026-05-18 13:28:50 +02:00
2026-05-13 13:47:33 +02:00
2026-05-18 13:28:50 +02:00
2026-05-05 21:19:39 +02:00
2026-05-13 14:03:27 +02:00
2026-05-13 12:34:23 +02:00
2026-05-10 16:53:51 +02:00
2026-05-05 21:19:39 +02:00
2026-05-14 15:27:37 +02:00
2026-05-18 13:28:50 +02:00
2026-05-12 21:11:23 +02:00
2026-05-18 13:28:50 +02:00
2026-05-18 14:22:11 +02:00
2026-05-18 13:28:50 +02:00
2026-05-12 18:35:56 +02:00
2026-05-04 22:57:01 +02:00
2026-05-14 15:24:38 +02:00
2026-05-05 20:18:05 +02:00
2026-05-07 20:59:28 +02:00
2026-05-04 22:57:01 +02:00
2026-05-18 13:28:50 +02:00
2026-05-13 11:50:07 +02:00
2026-05-06 14:57:24 +02:00
2026-05-13 12:07:57 +02:00
2026-05-04 22:57:01 +02:00
2026-05-12 21:34:39 +02:00
2026-05-13 13:02:38 +02:00
2026-05-06 22:11:00 +02:00
2026-05-14 15:42:21 +02:00
2026-05-13 12:58:58 +02:00
2026-05-05 20:48:13 +02:00
2026-05-13 11:50:07 +02:00
2026-05-14 22:39:16 +02:00
2026-05-13 12:58:58 +02:00
2026-05-13 13:02:38 +02:00
2026-05-18 13:28:50 +02:00
2026-05-14 03:39:21 +02:00
2026-05-05 20:41:23 +02:00
2026-05-18 13:28:50 +02:00
2026-05-18 13:28:50 +02:00
2026-05-12 20:51:49 +02:00
2026-05-12 16:52:35 +02:00
2026-05-18 13:28:50 +02:00
2026-05-18 13:28:50 +02:00
2026-05-13 13:02:38 +02:00
2026-05-13 12:27:08 +02:00
2026-05-05 20:18:05 +02:00
2026-05-18 13:28:50 +02:00
2026-05-18 14:57:55 +02:00
2026-05-18 13:28:50 +02:00
2026-05-18 13:28:50 +02:00
2026-05-13 12:15:46 +02:00
2026-05-09 04:16:42 +02:00
2026-05-18 13:28:50 +02:00
2026-05-07 20:58:34 +02:00
2026-05-04 22:57:01 +02:00
2026-05-13 12:07:57 +02:00
2026-05-18 15:03:12 +02:00
2026-05-18 13:28:50 +02:00
2026-05-13 12:07:57 +02:00
2026-04-28 19:00:57 +02:00
2026-05-08 02:20:27 +02:00
2026-05-05 20:48:13 +02:00
2026-04-29 01:58:42 +02:00
2026-05-18 13:28:50 +02:00
2026-05-11 13:01:47 +02:00
2026-05-14 03:39:21 +02:00
2026-05-18 13:28:50 +02:00
2026-05-18 13:28:50 +02:00
2026-05-13 12:58:58 +02:00
2026-05-14 03:36:56 +02:00
2026-05-07 21:02:12 +02:00
2026-04-29 01:58:42 +02:00
2026-05-18 13:28:50 +02:00
2026-05-13 12:54:29 +02:00
2026-05-13 13:02:38 +02:00
2026-05-05 04:20:38 +02:00
2026-05-18 13:28:50 +02:00
2026-05-13 12:27:08 +02:00