/projekte/myfitcoach-pro/Fullstack/Live/12/2023 → 10/2024/Fullstack-Entwickler

MyFitCoach PRO

Coaching-Plattform mit Flutter-App und Next.js-Web auf gemeinsamem Datenmodell.

Die erste Fassung lief 2023/24 gegen ein Strapi-Backend mit Next.js-Web. Die aktuelle Fassung ist eine Flutter-App auf Supabase, ausgelegt auf den deutschsprachigen Raum.

Privates Projekt

Repository ist privat — Code zeige ich auf Nachfrage.

Keine öffentliche Demo — Coach- und Athletenbereiche hängen an echten Betreuungsverhältnissen.

FlutterDartSupabasePostgreSQLRow-Level-SecurityNext.jsStrapiTypeScriptHealth Connect
project dossier

Snapshot

myfitcoach-pro

Fullstack-Entwickler

category

Fullstack

status

LIVE

stack

9 tech

code

27.365 Zeilen
FlutterDartSupabasePostgreSQLRow-Level-SecurityNext.jsStrapi
01

Zahlen zum Projekt

Code27.000Zeilen in 171 Dateien
Fachbereiche14Training, Ernährung, Anamnese …
Migrationen33SQL-Dateien
02

Story

Problem

Trainer verwalteten Pläne, Check-ins und Kommunikation über getrennte Werkzeuge.

Lösung

Plattform mit Flutter-App und Next.js-Web, Strapi als Headless-Backend, Realtime-Chat, Live-Check-ins und getrennten Rollen für Trainer und Kunde.

Learnings

Ein gemeinsames Datenmodell für App und Web spart mehr Aufwand als jede geteilte UI-Komponente.

03

Key Features

features.md
  • →App und Web auf einem gemeinsamen Datenmodell
  • →Strapi als Headless-Backend
  • →Chat und Check-ins in Echtzeit
  • →Getrennte Rollen für Trainer und Kunde
04

Über das Projekt

README.md

Plattform für Trainings- und Ernährungsbetreuung mit Flutter-App und Next.js-Web auf einem gemeinsamen Datenmodell. Strapi als Backend, Chat und Check-ins laufen in Echtzeit, Trainer und Kunde haben getrennte Rollen und Ansichten.

05

Meine Rolle

rolle
rolle:Fullstack-Entwickler
  • Datenmodell für Coach-Athlet-Betreuung mit Row-Level-Security
  • Flutter-App mit rollenabhängigen Ansichten für beide Seiten
  • Umbau vom Strapi-Backend auf Supabase
  • Anbindung von Gesundheitsdaten über Health Connect inklusive Freigabeunterlagen
  • Trainings-Runner, Ernährungsplanung und Fortschrittsauswertung
06

Architektur

architecture.md

Eine App, zwei Sichten auf dieselben Daten: Coach und Athlet arbeiten in derselben Anwendung, sehen aber unterschiedliche Ausschnitte. Der Code ist entsprechend nach Fachbereichen geschnitten, nicht nach Schichten — lib/features/ enthält vierzehn Bereiche von anamnesis über training, nutrition und body bis marketplace, jeder mit eigener Oberfläche, eigenem Zustand und eigenem Datenzugriff.

Die Verbindung zwischen beiden Rollen ist ein eigener Bereich: coach_athlete hält das Betreuungsverhältnis. Daran hängt die Sichtbarkeit — ein Coach sieht die Daten eines Athleten, weil eine Betreuung besteht, nicht weil eine Rolle im Konto steht. Durchgesetzt wird das über Row-Level-Security in PostgreSQL.

Das Backend ist Supabase mit 33 Migrationen. Gesundheitsdaten kommen über Health Connect vom Gerät; die entsprechende Erklärung liegt als Dokument im Repository, weil Google sie für die Veröffentlichung verlangt.

Anamnese

Aufnahme zu Beginn der Betreuung — die Grundlage, auf der Trainings- und Ernährungsplan aufsetzen.

FlutterPostgreSQL

Training

Pläne, Einheiten und ein Runner, der die Einheit während des Trainings führt.

FlutterDart

Ernährung

Ernährungsplanung als eigener Bereich statt als Anhang am Trainingsplan.

Flutter

Fortschritt

Körperwerte, Verlaufsfotos und Auswertung über die Zeit.

SupabaseRow-Level-Security

Coach-Athlet-Beziehung

Das Betreuungsverhältnis als eigenes Modell — daran hängt, wer welche Daten sieht.

PostgreSQLRow-Level-Security

Wohlbefinden

Erfassung von Befinden und Belastung neben den reinen Trainingszahlen.

FlutterHealth Connect

Marktplatz

Bereich, über den Athleten und Coaches zusammenfinden.

FlutterSupabase
07

Herausforderungen

Zwei Rollen, eine App
Problem

Coach und Athlet getrennt zu bauen hätte zwei Anwendungen bedeutet — mit doppelter Pflege und zwei Ständen desselben Trainingsplans. In eine App gepackt stellt sich sofort die Frage, wer was sehen darf.

Lösung

Eine App mit rollenabhängigen Ansichten und dem Betreuungsverhältnis als eigenem Datensatz. Die Sichtbarkeit prüft die Datenbank über Row-Level-Security, nicht die Oberfläche — eine vergessene Prüfung im Client führt zu einer leeren Liste statt zu fremden Daten.

Wechsel des Backends
Problem

Die erste Fassung lief gegen Strapi mit einem Next.js-Web davor. Damit lag die Rechtelogik in der Anwendungsschicht, und jede neue Ansicht musste sie erneut korrekt anwenden.

Lösung

Umbau auf Supabase: PostgreSQL mit Row-Level-Security als verbindliche Grenze, versionierte Migrationen im Repository, die Flutter-App als einzige Oberfläche. Der Aufwand lag im Datenmodell — danach wurde jede weitere Ansicht einfacher.

Gesundheitsdaten sind kein normales Feld
Problem

Trainings- und Körperdaten über Health Connect anzubinden ist technisch überschaubar. Die Veröffentlichung hängt aber an einer Erklärung, welche Daten wofür verwendet werden — und die muss zum Code passen.

Lösung

Die Health-Connect-Erklärung und die Datenschutztexte liegen versioniert im Repository neben dem Code, nicht in einem separaten Dokument. Ändert sich die Nutzung, fällt die veraltete Erklärung im selben Commit auf.

08

Technologie-Entscheidungen

09

Codebasis

codebase
Codezeilen27.365
Dateien171
Sprachen
  • Dart75%
  • SQL21%
  • TypeScript/Swift4%
10

Verwandte Projekte