Merge branch 'chore/demo-seed-v1424' into release/v1.43.0

This commit is contained in:
Marc-André Bombeck committed 2026-10-15 20:18:02 +02:00
commit b4dc0d5927
1 file changed
+22 -19
+22 -19
View File
@@ -31,7 +31,8 @@
* - 90 days of mood entries
* - Six mental-wellbeing screeners (WHO-5, PHQ-9, GAD-7) spread over the
* window, item answers encrypted the way the check-in route writes them
* - Vorsorge (preventive-care) reminders — upcoming dental + annual physical
* - Vorsorge (preventive-care) reminders — a dental check-up due today and
* an annual physical in three months
* - Two lab panels of biomarkers across two dates (quantitative with
* reference ranges + qualitative "negativ" rows)
* - Two illness episodes — a resolved acute cold with a day-by-day symptom
@@ -492,24 +493,25 @@ async function seed() {
);
// ── Dashboard showcase layout ─────────────
// The demo seeds rich sleep / steps / glucose / VO2max / vorsorge data,
// so persist an explicit dashboard layout that surfaces those tiles plus
// the daily-verdict hero. The v1.20.0 defaults already turn the data
// tiles on, but writing the layout verbatim keeps the public demo's home
// page stable regardless of future default tweaks. Derived from
// DEFAULT_DASHBOARD_LAYOUT with the seeded-rich strip tiles forced on.
// One row of six tiles (weight, the two blood-pressure values, resting
// heart rate, HRV and mood) and the weight chart right below it, so the
// first screen of the public demo shows the summary, the tiles and the
// start of a chart together. Every other tile stays one switch away in
// the layout settings; its data is seeded either way. Writing the layout
// verbatim keeps the demo's home page stable across default tweaks.
const SHOWCASE_TILE_IDS = new Set([
"sleep",
"steps",
"glucose",
"vo2Max",
"recentWorkouts",
"weight",
"bp",
"pulse",
"hrv",
"mood",
]);
const demoDashboardLayout = serializeDashboardLayout({
...DEFAULT_DASHBOARD_LAYOUT,
widgets: DEFAULT_DASHBOARD_LAYOUT.widgets.map((w) =>
SHOWCASE_TILE_IDS.has(w.id) ? { ...w, tileVisible: true } : w,
),
widgets: DEFAULT_DASHBOARD_LAYOUT.widgets.map((w) => ({
...w,
tileVisible: SHOWCASE_TILE_IDS.has(w.id),
})),
});
await client.query(
`UPDATE users SET dashboard_widgets_json = $1 WHERE id = $2`,
@@ -1511,14 +1513,15 @@ async function seed() {
// ── Vorsorge reminders (preventive care) ──
// User-created (origin VORSORGE) checklist reminders with no auto-resolve
// measurement target. Both anchored to fire comfortably in the future so
// the Vorsorge surface shows sensible upcoming items, not overdue ones.
// measurement target. The dental check-up falls due this morning, so the
// dashboard's "worth a look" carries it beside tomorrow's appointment; the
// annual physical sits comfortably in the future.
console.log("Creating Vorsorge reminders...");
const dentalNextDue = daysAgo(-45); // ~6 weeks out
const dentalNextDue = berlinHmAsUtc(9, 0); // due today, 09:00 local
await client.query(
`INSERT INTO measurement_reminders (id, user_id, label, interval_days, anchor_date, origin, notify_hour, location, next_due_at, created_at, updated_at)
VALUES ($1, $2, 'Dental check-up', 365, $3, 'VORSORGE', 9, 'Dentist', $4, NOW(), NOW())`,
[cuid(), userId, daysAgo(320), dentalNextDue],
[cuid(), userId, daysAgo(365), dentalNextDue],
);
const physicalNextDue = daysAgo(-90); // ~3 months out
await client.query(