Marc-André Bombeck
6e6bc61800
feat(api): lock the daily-stats externalId shape for cumulative HealthKit types
...
R-A Option A handoff prep. Adds dailyStatsExternalId() helper alongside
the v1.4.29 CUMULATIVE_HK_TYPES set; the helper mints
"stats:<HKQuantityTypeIdentifier>:<YYYY-MM-DD>" so iOS can UPSERT one
row per day per cumulative type via the existing batch endpoint, the
unique index collapses re-syncs idempotently, and a future PATCH-on-
divergence call updates a late-watch-sync revision without inserting a
second row. Handoff docs (06 + 08) lock the shape for the iOS client.
Cumulative-type set unchanged from v1.4.29; spot metrics keep the
per-sample uuid externalId. Server tolerates both shapes during the
cutover window — the drain script (next commit) collapses pre-existing
per-sample rows post-cutover.
Tests cover the helper round-trip, the cumulative-type identifier wall,
and the iOS-trusted date-string passthrough.
2026-05-16 11:51:25 +02:00
..
2026-05-16 11:11:22 +02:00
2026-05-16 11:51:25 +02:00
2026-05-11 02:44:12 +02:00
2026-05-12 22:45:42 +02:00
2026-05-16 11:48:08 +02:00
2026-05-10 12:51:33 +02:00
2026-05-09 16:06:52 +02:00
2026-05-09 16:08:20 +02:00
2026-05-09 18:08:25 +02:00
2026-05-09 18:08:25 +02:00
2026-05-09 17:02:59 +02:00
2026-05-09 18:08:25 +02:00
2026-05-09 18:08:25 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 13:02:39 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 13:12:11 +02:00
2026-05-10 13:15:14 +02:00
2026-05-11 08:27:51 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 13:00:11 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-10 13:16:19 +02:00
2026-05-10 11:09:41 +02:00
2026-05-11 08:27:51 +02:00
2026-05-10 14:01:38 +02:00
2026-05-10 11:09:41 +02:00
2026-05-11 08:27:51 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-10 17:24:59 +02:00
2026-05-11 08:27:51 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 00:29:22 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-11 08:27:51 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-10 11:09:41 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-10 11:09:41 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-10 18:17:55 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-10 14:55:27 +02:00
2026-05-10 15:17:03 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-14 23:12:05 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 19:40:49 +02:00
2026-05-11 08:27:51 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 19:31:20 +02:00
2026-05-11 08:28:02 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:28:02 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-14 14:19:08 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 14:19:08 +02:00
2026-05-14 14:19:08 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-14 14:19:08 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 14:19:08 +02:00
2026-05-11 08:28:02 +02:00
2026-05-11 08:28:02 +02:00
2026-05-11 08:28:02 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:28:02 +02:00
2026-05-11 08:28:02 +02:00
2026-05-11 08:28:02 +02:00
2026-05-11 08:27:51 +02:00
2026-05-14 14:19:08 +02:00
2026-05-14 19:28:52 +02:00
2026-05-11 08:28:02 +02:00
2026-05-11 08:28:02 +02:00
2026-05-11 08:28:02 +02:00
2026-05-12 22:33:35 +02:00
2026-05-11 08:28:02 +02:00
2026-05-11 08:28:02 +02:00
2026-05-11 08:28:02 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 14:19:08 +02:00
2026-05-14 14:19:08 +02:00
2026-05-14 14:19:08 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 16:07:50 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 14:19:08 +02:00
2026-05-14 15:55:42 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 20:09:46 +02:00
2026-05-14 19:46:26 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 21:51:04 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 17:46:25 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 21:53:23 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 19:56:36 +02:00
2026-05-14 20:32:28 +02:00
2026-05-14 20:46:52 +02:00
2026-05-14 21:02:52 +02:00
2026-05-14 21:16:21 +02:00
2026-05-14 21:28:27 +02:00
2026-05-14 21:46:41 +02:00
2026-05-14 19:28:52 +02:00
2026-05-14 22:20:35 +02:00
2026-05-14 23:20:18 +02:00
2026-05-10 11:09:41 +02:00
2026-05-09 01:22:09 +02:00
2026-05-14 14:19:08 +02:00
2026-05-15 16:49:03 +02:00
2026-05-15 16:32:56 +02:00
2026-05-15 17:00:28 +02:00
2026-05-15 17:00:28 +02:00
2026-05-15 17:00:28 +02:00
2026-05-15 17:24:52 +02:00
2026-05-15 17:55:01 +02:00
2026-05-15 16:30:02 +02:00
2026-05-16 03:25:02 +02:00
2026-05-16 03:25:02 +02:00
2026-05-16 03:25:02 +02:00
2026-05-15 18:37:13 +02:00
2026-05-15 18:51:12 +02:00
2026-05-15 18:46:02 +02:00
2026-05-15 19:08:48 +02:00
2026-05-15 19:26:20 +02:00
2026-05-15 19:10:54 +02:00
2026-05-15 19:25:07 +02:00
2026-05-16 03:25:02 +02:00
2026-05-16 03:25:02 +02:00
2026-05-16 03:25:02 +02:00
2026-05-15 21:22:34 +02:00
2026-05-15 21:20:26 +02:00
2026-05-15 21:20:27 +02:00
2026-05-15 21:45:58 +02:00
2026-05-15 22:13:26 +02:00
2026-05-16 09:03:22 +02:00
2026-05-16 03:25:02 +02:00
2026-05-16 09:16:32 +02:00
2026-05-16 09:40:12 +02:00
2026-05-16 11:39:46 +02:00
2026-05-14 11:32:28 +02:00
2026-05-15 07:27:20 +02:00
2026-05-12 22:45:42 +02:00
2026-05-16 11:42:34 +02:00
2026-05-09 17:57:30 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 11:09:41 +02:00
2026-05-10 13:12:11 +02:00
2026-05-10 11:10:59 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-11 08:27:51 +02:00
2026-05-12 22:33:35 +02:00
2026-05-14 23:57:30 +02:00
2026-05-14 19:21:08 +02:00
2026-05-14 14:22:17 +02:00
2026-05-15 07:32:56 +02:00
2026-05-15 17:24:52 +02:00
2026-05-15 17:24:52 +02:00
2026-05-15 17:24:52 +02:00
2026-05-15 17:24:52 +02:00
2026-05-15 16:16:00 +02:00
2026-05-15 16:18:57 +02:00
2026-05-15 18:15:22 +02:00
2026-05-15 17:00:28 +02:00
2026-05-15 16:00:49 +02:00
2026-05-15 21:09:09 +02:00
2026-05-15 23:34:03 +02:00
2026-05-15 23:36:27 +02:00
2026-05-16 03:25:02 +02:00