Commit graph

8 commits

Author SHA1 Message Date
Sebastian Mayer
634e67c602 Feature: Community-Profil-Fundament (Handle, Bio, Sichtbarkeit) - Backend
Battle.net-Style Handle Username#XXXX als Basis fuer kommende
Community-Features (Stufe 2 der Roadmap). Diese Stufe: Schema, Migration,
Generator und API. Die UI im Profil-Tab folgt in einem eigenen Commit.

Schema (packages/db/src/schema/auth.ts):
- Neue Spalten an der user-Tabelle: username, discriminator, bio (alle
  nullable), profileVisible (notNull, default false = Privacy-by-Default).
- uniqueIndex auf (username, discriminator); NULLs distinct, greift also
  nur bei vollstaendigen Handles. Index user_username_idx auf username
  fuer die Handle-Erstvergabe-Query.
- Migration 0019_community_profile, per drizzle-kit generate erzeugt,
  driftfrei (zweiter generate: keine Aenderung), drizzle-kit check ok.
  Noch nicht gegen die DB angewendet.

Generator (packages/api/src/lib/handle.ts):
- Discriminator aus verwechslungsarmem Alphabet, Kollisions-Retry.
- formatHandle, validateUsername. 17 node:test-Unit-Tests.

API (packages/api/src/trpc/routers/users.ts):
- myProfile um die Felder + abgeleitetes handle erweitert (Feld-Whitelist).
- setMyHandle: Discriminator stabil bei Erst-Vergabe, Kollisionspruefung
  inkl. DB-unique-violation-Fallback (PG 23505).
- updateMyCommunityProfile: bio + Sichtbarkeit, strikt userId-gescoped.

Verifiziert: Typecheck gruen (db/api/admin), 62 API-Tests gruen,
drizzle-kit check ok. Datenmodell-Architekt abgenommen (Index-Auflage
erfuellt).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 11:57:24 +02:00
Sebastian Mayer
7488916a9e Fix: ernährungsfachliche Auflagen aus der Abnahme umgesetzt
Some checks are pending
CI / Lint, Typecheck, Test, Build (push) Waiting to run
Nachbesserungen aus der fachlichen Begutachtung (Skill
ernaehrungswissenschaftler):

- Kalorien-Untergrenze von 800 auf 1.200 kcal angehoben (goalsInput und
  upsertWeeklyCaloriePlan, neue Konstante MIN_CALORIE_GOAL). Im Ziele-Tab
  Sicherheitswarnung bei einem Ziel unter 1.500 kcal.
- Defizit-Banner wird nur noch bei moderatem Defizit (10-25 % unter dem
  Basis-Tagesziel) gefeiert und gegen baseDailyGoal statt inkl. Sportbonus
  gerechnet. Bei einem Defizit über 25 % erscheint stattdessen ein sanfter
  "iss genug"-Hinweis statt Lob.
- Wochenbudget-Verteilung: der am 1.200-Floor gekappte Rest wird iterativ
  auf die übrigen Tage weiterverteilt, sodass das Wochenbudget erhalten
  bleibt, solange es geht. Neue Funktion weeklyExtrasOverflow meldet den
  unvermeidbaren Überschuss; die Wochenbudget-Seite weist ihn ehrlich aus
  statt pauschal "bleibt gleich" zu versprechen.
- Dashboard-Makros: Kohlenhydrate und Fett als geschätzt (~) gekennzeichnet
  inkl. erklärendem Hinweis; Protein bleibt real getrackt.
- 2 neue API-Tests (iterative Floor-Verteilung, weeklyExtrasOverflow).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 11:41:41 +02:00
Sebastian Mayer
70f59cfd40 Feature: Flexibles Wochenbudget mit Blocker-Tagen
Some checks are pending
CI / Lint, Typecheck, Test, Build (push) Waiting to run
Pro-Tag-Mehrbedarf statt fester Tageswerte:

- DB: Spalte extraCalories in weekly_calorie_plans (Migration 0018).
- API: neuer Endpoint setWeeklyExtras nimmt die ganze Woche entgegen
  und verteilt eingeplante Mehrkalorien serverseitig. Reine, getestete
  Verteilungslogik distributeWeeklyExtras haelt das Wochenziel konstant
  (Tage mit Blocker = Tagesziel + Extra; uebrige Tage anteilig reduziert,
  Floor 1200). statsSummary liefert extraCalories pro Tag mit.
- 3 neue API-Tests (Verteilung konstant, Floor, Endpoint).
- Wochenbudget-UI: je Tag ein "+kcal"- und ein "Anlass"-Feld plus ein
  einziger "kcal neu verteilen"-Button. Blocker-Tage werden hervorgehoben.
  Das fehleranfaellige Einzel-Datumsformular entfaellt.
- Dashboard nimmt den verteilten Plan-Wert des Tages als Basis-Tagesziel
  (z. B. 1.740 nach Ausgleich, 2.800 an einem Blocker-Tag) und zeigt einen
  Hinweis. Behebt zugleich den Sync: Wochenbudget-Aenderungen invalidieren
  jetzt alle statsSummary-Varianten, sodass das Dashboard sofort mitzieht.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 11:30:29 +02:00
Sebastian Mayer
e264765876 Feature: Ziele in Einstellungen-Tab, Sportbonus-Anzeige, Profil-Fix
Health-/Ernährungslogik überarbeitet:

- Fix: upsertProfile speichert fehlende Größe/Gewicht als null statt 0
  (Round-Trip-Bug: gespeicherte 0 scheiterte beim erneuten Speichern an
  z.number().positive()). Frontend clampt zudem mealsPerDay/cooksPerDay
  auf die Zod-Grenzen. 3 neue API-Tests.
- Ziele-Bearbeitung vom Standalone /ziele in den Einstellungen-Tab
  ?tab=ziele gezogen; /ziele-Seite + Sidebar-Eintrag entfernt. Liest/
  schreibt jetzt aus der DB (vorher las der Tab veraltetes localStorage).
- Wochenziel wird automatisch als Tagesziel × 7 berechnet (Feld entfällt).
- Sportbonus klar dargestellt: Tagesansicht addiert den heutigen Sport
  aufs Budget (nur wenn sportAddsCalories aktiv) mit Bolt-Badge; Wochen-
  Box mit Icon und Info "ganze Woche". Dashboard invalidiert alle
  statsSummary-Varianten.
- Belohnende Banner bei Sport heute und bei Kaloriendefizit.
- Doku: rules.md-Verweis auf docs/projektreferenz.md korrigiert.
- Neuer Skill: ernaehrungswissenschaftler (fachliche Abnahme der
  Health-Logik).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 11:12:34 +02:00
Sebastian Mayer
e42a8109bf Feature: Settings-Tabs, Login-Redesign und Security-Tests
Some checks are pending
CI / Lint, Typecheck, Test, Build (push) Waiting to run
- Einstellungen-Seite in fokussierte Komponenten aufgeteilt
  (settings-tabs, status-banner, section-card)
- Login-Seite ueberarbeitet
- Neue security.test.ts fuer 2FA-Verlust-/Recovery-Logik
- health.test.ts erweitert
- next-env.d.ts auf Next.js dev-types-Pfad aktualisiert

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 10:07:27 +02:00
Sebastian Mayer
8ed7c083c4 Refactor: God-Router + Frontend-Lib in Domain-Module aufgeteilt
Some checks failed
CI / Lint, Typecheck, Test, Build (push) Has been cancelled
Router-Split (packages/api/src/trpc/routers/health/):
- health.ts (2061 Zeilen Monolith) entfernt und in 6 Sub-Router aufgeteilt:
  - dashboard.ts (overview, profile, goals, point settings)
  - foods.ts (foods, nutrition, OpenFoodFacts, food preferences)
  - recipes.ts (recipes, submissions, reviews, activity feed)
  - stores.ts (stores, change-requests, shopping lists)
  - tracking.ts (meals, drinks, weight, mealPlans, activities, leaderboard)
  - community.ts (club, wearables, coach, stats)
- index.ts mergt alle Sub-Router via mergeRouters, sodass Frontend-Aufrufe
  (trpc.health.listFoods etc.) unveraendert weiterfunktionieren.
- t.mergeRouters in init.ts exportiert.

Frontend-Lib-Split (apps/admin/lib/hellth/):
- hellth-data.ts (1149 Zeilen Monolith) in 5 Domain-Module aufgeteilt:
  - types.ts (alle TypeScript-Types)
  - constants.ts (Seeds, Defaults, todayKey, uid)
  - nutrition.ts (calcRecipe, classifyRecipe, parseNutritionLabel, ...)
  - storage.ts (load/save HellthData, ClubData, hasCompletedHealthProfile)
  - stats.ts (Budget, Stats, Coach, Shopping, Weight-Projection)
- hellth-data.ts wird zum reinen Re-Export-Index, damit bestehende
  Imports `from "@/lib/hellth-data"` unveraendert weiterfunktionieren.

Funktional identisch zum Original - reine Code-Reorganisation.
Verifiziert: 28 API-Tests + 10 Admin-Tests gruen, Typecheck (3 Packages)
gruen, Admin-Build (26 Pages) gruen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 01:09:53 +02:00
Sebastian Mayer
0031268416 Refactor: CI, Schema-Split, 2FA-Optimierung und Code-Hygiene
Some checks are pending
CI / Lint, Typecheck, Test, Build (push) Waiting to run
CI-Pipeline (Forgejo Actions):
- .forgejo/workflows/ci.yml: lint + typecheck + test + admin build
- typecheck-Scripts in packages/api, packages/db, apps/admin ergaenzt
- ESLint FlatConfig (eslint-config-next 16) in apps/admin angelegt
- React-19-Hook-Findings im bestehenden Code als Warnings markiert
  (set-state-in-effect, preserve-manual-memoization, no-unused-vars)

DB-Schema-Split:
- packages/db/src/schema/health.ts (636 Zeilen, Monolith) entfernt und auf
  7 Domain-Module aufgeteilt: profiles, foods, stores, recipes, tracking,
  shopping, community. index.ts re-exportiert alles.

API-Refactoring:
- 2FA-Middleware: 2 DB-Queries pro Admin-Call sind jetzt lazy + per-Request
  gecached. Bei tRPC-Batch-Requests mit mehreren protected Procedures wird
  der 2FA-State nur einmal geladen (siehe context.ts getTwoFactorState).
- any-Typen in trpc/init.ts und trpc/routers/health.ts entfernt; Drizzle
  inferiert Closure-Typen automatisch.
- packages/api/src/trpc/routers/health/_shared.ts: alle Helper-Funktionen
  und Zod-Input-Schemas aus health.ts extrahiert. health.ts: 2419 -> 2061
  Zeilen. Vorbereitung fuer Procedure-Split in Folge-Session.

Konfiguration:
- .env.example um alle in turbo.json deklarierten Env-Vars erweitert,
  jeweils mit Kontext-Kommentar.
- turbo.json um real genutzte Env-Vars erweitert: NEXT_PUBLIC_HELP_URL,
  ENABLE_DB_MIGRATIONS, ADMIN_INITIAL_PASSWORD, DEMO_RECIPE_OWNER_EMAIL.
- .gitignore: *.tsbuildinfo (TypeScript-Build-Cache).
- apps/admin/lib/hellth-data.test.ts: fehlendes Recipe.minutes Feld in Mocks.

Offene Folge-Sessions:
- Vollstaendiger Procedure-Split von routers/health.ts in Sub-Files
- Aufteilung von apps/admin/lib/hellth-data.ts (1149 Zeilen) in Domain-Module

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 23:34:39 +02:00
Sebastian Mayer
2436dd9cac Initial commit: Hellth Hub monorepo
Mobile-first Web-App fuer persoenliches Health-, Ernaehrungs-,
Aktivitaets- und Einkaufs-Tracking im Home-Lab-Betrieb.

Stack: pnpm Monorepo - Next.js 16 + React 19 + Tailwind (apps/admin) -
Hono + tRPC + Better Auth mit 2FA und Passkeys (packages/api) -
PostgreSQL + Drizzle ORM (packages/db) - Docker fuer Postgres und pgAdmin.

Module:
- Auth mit Login, 2FA (TOTP + Backup-Codes), Passkeys und Admin-Recovery
- Tagesansicht mit Essen, Trinken, Gewicht, Aktivitaeten und Coach-Hinweisen
- Lebensmittelkatalog mit Naehrwerten, Portionen, OCR/Barcode/Open Food Facts
- Rezepte mit Live-Naehrwertberechnung und Community-Vorschlaegen
- Essensplanung und Wochenbudget mit Sportbonus
- Einkaufslisten mit Maerkten und Laufweg-Sortierung
- Hellfireclub mit Aktivitaetspunkten und gemeinsamer Aktivitaetsplanung
- Wearables-Vorbereitung (Fitbit / Google Fit / Health Connect)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 22:15:16 +02:00