10 KiB
Entwicklungsplan DB/API-Anbindung
Version: 0.0.1
Status: Konzept und Umsetzungsplan fuer die Anbindung der Quasar-App an das Laravel-Backend mit MySQL.
Zielbild
Die App soll nicht mehr primaer auf browserlokaler Persistenz basieren. Laravel mit MySQL wird die fuehrende Datenquelle fuer User, Settings, Events, Presets und Medien. IndexedDB und localStorage duerfen spaeter weiter als Cache und Offline-Schicht genutzt werden, aber nicht als alleinige Wahrheit.
Das System geht konsequent vom eingeloggten User aus:
- Jeder User besitzt eigene Settings.
- Jeder User besitzt eigene Timeline-Daten.
- Jeder User besitzt eigene Events.
- Jeder User besitzt eigene Medien, Images, Presets und spaeter Videos, Audios und Texte.
- Kein User darf Medien, Events oder Settings eines anderen Users direkt oder indirekt lesen.
- Teilen und Veröffentlichen wird spaeter bewusst als eigener Rechte- und Freigabeprozess umgesetzt.
Versionsregel
Die aktuelle App-Version ist 0.0.1.
Bei jeder weiteren Entwicklungsrunde muessen folgende Stellen mitgefuehrt werden:
frontend/package.jsonfrontend/src/config/appVersion.jsfrontend/README.md- dieses Planungsdokument, sofern sich Architektur, Datenmodell oder API-Verhalten aendern
- spaetere Release Notes oder Migrationsdokumente
Versionen in der 0.x-Phase duerfen Breaking Changes enthalten. Jede Aenderung am Datenmodell oder an API-Kontrakten muss trotzdem dokumentiert werden.
Grundentscheidung
Wir verwenden direkt MySQL im Laravel-Backend. SQLite wird nicht als Zielsystem genutzt, weil die Anwendung mehrere Benutzer, geschuetzte Medien, Sync und spaetere Sharing-/Invite-Funktionen benoetigt. MySQL passt besser zu dauerhaftem Betrieb, Indizes, Relationen und wachsendem Medien-Metadatenbestand.
Sicherheitsprinzip
Die Datenhoheit liegt beim User. Alle API-Abfragen muessen serverseitig ueber den authentifizierten User eingeschraenkt werden. Das Frontend darf keine fremden IDs als Vertrauensbasis liefern.
Regeln:
- Jede userbezogene Tabelle enthaelt
user_id. - API-Controller filtern immer ueber
$request->user(). - Policies pruefen Zugriff auf Events, Medien, Presets und Settings.
- Storage-Pfade enthalten keine erratbaren oeffentlichen URLs.
- Originalmedien werden nicht aus einem public disk ausgeliefert.
- Medien werden ueber autorisierte Backend-Routen oder signierte, kurzlebige URLs bereitgestellt.
- Thumbnails duerfen ebenfalls nur nach Berechtigungspruefung ausgeliefert werden.
Datenmodell
Bestehende Basis:
usersexistiert bereits.eventsexistiert bereits und hat bereitsuser_id.
Geplante Erweiterungen:
-
user_settingsuser_idsettingsals JSONtimeline_zoomtimeline_scroll_leftactive_preset_id- Timestamps
-
setting_presetsuser_idnamesettingsals JSONis_publicfuer spaeteres Veröffentlichen von reinen Timeline-/Visual-Presets- Timestamps
-
events- weiterhin strikt usergebunden
- Erweiterung um Felder aus dem aktuellen Frontend, z. B. Key-Image-Titel, Farbdaten, Notizen und spaetere Event-Metadaten
client_idbleibt wichtig fuer Offline-/Sync-Kompatibilitaet
-
event_mediauser_idevent_idtype: image, video, audio, texttitleoriginal_paththumbnail_pathmime_typesizewidthheightdurationsort_ordermetadataals JSON- Timestamps
-
event_media_variants- optional spaeter, wenn mehrere Bildgroessen benoetigt werden
- z. B. thumbnail, preview, original
-
timeline_shares- spaeter
- Einladung oder Share-Link fuer eine komplette Timeline
- getrennt von Preset-Sharing
- eigene Berechtigungen und Ablaufdaten
Medienkonzept
Medien werden nicht als Data-URL in der Datenbank gespeichert. Die Datenbank speichert nur Metadaten und Storage-Pfade.
Upload-Ablauf:
- Frontend laedt Datei an Laravel hoch.
- Backend validiert User, Dateityp und Groesse.
- Backend speichert Originaldatei in einem geschuetzten Storage-Bereich.
- Backend erzeugt Thumbnail oder Preview.
- Backend speichert Metadaten in
event_media. - API gibt Media-Objekt mit Thumbnail-Endpunkt zurueck.
Performance-Regel:
- Timeline und Event-Panel laden zuerst nur Thumbnails.
- Originaldateien werden erst bei grosser Betrachtung oder Download geladen.
- Videos und Audios bekommen spaeter eigene Preview-/Poster-Strategien.
- Texte werden spaeter als eigener Media-Typ behandelt, nicht als Bilderspezialfall.
API-Konzept
Geplante API-Gruppen unter /api:
-
Auth
- Login
- Logout
- aktueller User
-
Settings
GET /settingsPUT /settings
-
Presets
GET /setting-presetsPOST /setting-presetsPUT /setting-presets/{preset}DELETE /setting-presets/{preset}- spaeter:
POST /setting-presets/{preset}/publish
-
Events
GET /eventsPOST /eventsGET /events/{event}PUT /events/{event}DELETE /events/{event}POST /events/sync
-
Event-Medien
GET /events/{event}/mediaPOST /events/{event}/mediaPUT /events/{event}/media/{media}DELETE /events/{event}/media/{media}GET /media/{media}/thumbnailGET /media/{media}/original
Alle Endpunkte muessen authentifiziert sein. Jeder Zugriff auf {event}, {media} oder {preset} muss serverseitig gegen user_id abgesichert werden.
Frontend-Migration
Aktueller Zustand:
- Auth liegt in
localStorage. - Zusaetzlich angelegte lokale Test-User liegen in
localStorageunterthatsme-users. - Settings liegen in
localStorage. - Events, SyncQueue und Medien liegen in IndexedDB.
Zwischenstand in Version 0.0.1:
- Die urspruenglichen Demo-User
user1bisuser5behalten ihre bestehenden lokalen Daten. - Neue lokale User koennen auf der Login-Seite ueber den Plus-Button angelegt werden.
- Neue lokale User starten mit leerer Timeline und bekommen keine automatisch generierten Test-Events.
- Diese lokale User-Verwaltung ist nur eine Uebergangsloesung bis zur Laravel/MySQL-Auth.
Zielzustand:
- Auth laeuft ueber Laravel API.
- Settings werden nach Login vom Backend geladen.
- Events werden vom Backend geladen und im Store gehalten.
- IndexedDB bleibt als Cache und optionale Offline-Queue.
- Medien werden als Backend-URLs/IDs verwaltet, nicht mehr als Data-URLs im Event.
Schrittweise Migration:
- API-Client im Frontend anlegen.
- Auth-Store auf Backend-Login vorbereiten.
- Settings-Store mit Backend-Laden/Speichern erweitern.
- Events-Store auf Backend-CRUD umstellen.
- Media-Upload ueber Backend einbauen.
- IndexedDB als Cache neu definieren und nicht mehr als Primaerspeicher behandeln.
- SyncQueue mit Server-Status und Konfliktregeln ueberarbeiten.
Konflikt- und Sync-Regeln
Da spaeter Offline-Faehigkeit weiter sinnvoll ist, bleibt client_id wichtig.
Regeln:
- Jeder lokal erzeugte Datensatz bekommt eine stabile
client_id. - Backend antwortet mit Server-ID und
updated_at. - Bei Updates wird
updated_atfuer Konflikterkennung genutzt. - Bei Medien wird Upload nicht stillschweigend ueberschrieben.
- Konflikte werden spaeter sichtbar gemacht, nicht automatisch fremd geloest.
Sharing spaeter
Preset-Sharing und Timeline-Sharing werden getrennt.
Preset-Sharing:
- Nur visuelle Timeline-/LifeWave-Einstellungen.
- Keine Events.
- Keine Medien.
- Keine personenbezogenen Inhalte.
Timeline-Sharing:
- Spaeter ueber Einladung, Token oder freigegebene Empfaenger.
- Enthält Settings, Events und Medien nur im explizit freigegebenen Umfang.
- Zugriff muss widerrufbar sein.
- Keine oeffentlichen, erratbaren Medienlinks.
Umsetzungsphasen
Phase 1: Backend-Datenmodell
- Bestehende
events-Tabelle mit aktuellem Frontend-Modell abgleichen. - Migrationen fuer
user_settings,setting_presetsundevent_mediaerstellen. - Models, Relationships, Factories und Policies anlegen.
- Tests fuer User-Isolation erstellen.
Phase 2: API-Basis
- API Resources und Form Requests erstellen.
- Settings- und Preset-Endpunkte implementieren.
- Event-Endpunkte usergesichert vervollstaendigen.
- Tests fuer CRUD und Fremdzugriff schreiben.
Phase 3: Media Storage
- Geschuetzten Storage-Disk konfigurieren.
- Upload-Endpunkte implementieren.
- Thumbnail-Erzeugung vorbereiten.
- Autorisierte Auslieferung fuer Thumbnail und Original bauen.
- Tests fuer Zugriffsschutz und Dateitypen schreiben.
Phase 4: Frontend-Anbindung
- API-Service im Frontend erstellen.
- Auth-Store an Backend anbinden.
- Settings-Store vom Backend laden und speichern.
- Events-Store CRUD und Sync an Backend anbinden.
- EventPanel-Medienupload auf Server umstellen.
Phase 5: Migration aus Browserdaten
- Einmalige Importstrategie fuer lokale Demo-Daten definieren.
- Pro User lokale Settings und Events optional zum Backend hochladen.
- Danach lokale Daten nur noch als Cache nutzen.
Phase 6: Dokumentation und Stabilisierung
- API-Kontrakte dokumentieren.
- Datenmodell dokumentieren.
- Version aktualisieren.
- Manuelle QA-Schritte dokumentieren.
- Bekannte Grenzen und Folgeaufgaben festhalten.
Dokumentationspflicht pro Schritt
Jede Umsetzung in diesem Bereich muss dokumentiert werden.
Pflicht je Schritt:
- Was wurde geaendert?
- Welche Version betrifft es?
- Welche Tabellen/API-Endpunkte sind betroffen?
- Welche Sicherheitsregel wurde umgesetzt oder geprueft?
- Welche Tests wurden ausgefuehrt?
- Welche offenen Punkte bleiben?
Empfohlene Struktur fuer neue Dokumente in diesem Ordner:
README.md: Gesamtplan und aktueller Standdata-model.md: finale Tabellen und Beziehungenapi-contract.md: Request-/Response-Strukturenmigration-log.md: chronologische Umsetzungsschrittesecurity-checklist.md: Zugriffsschutz und Storage-Regeln
Offene Entscheidungen
- Welche Laravel-Auth-Variante wird fuer die App final verwendet: vorhandenes Passport-Setup oder eine gezielte API-Token-Strategie?
- Welche maximale Upload-Groesse gilt pro Datei und pro User?
- Wo werden Originaldateien langfristig gespeichert: lokaler Storage, S3-kompatibel oder Synology C2?
- Wann wird echte Offline-Synchronisation wieder aktiviert?
- Wie detailliert soll spaeteres Timeline-Sharing steuerbar sein?