19 KiB
Migration Log
2026-06-05 - Live-Deployment API-Login
Status: Live-Login gegen https://api.thats-me.app erfolgreich hergestellt.
Problem
- Das Live-Frontend lief zuerst gegen eine falsche API-Basisadresse.
- Korrekte API-Basis ist
https://api.thats-me.app/api. - Danach blockierte CORS Requests von
https://thats-me.app. - Nach dem CORS-Fix kam der Request bis Laravel durch, scheiterte aber mit
Invalid key suppliedbeim Passport-Token.
Ursache
frontend/src/services/apiClient.jsnormalisierte bisher nurhttps://api.thats-me.testautomatisch auf/api.backend/config/cors.phperlaubte nur lokale.test- und localhost-Origins.- Auf dem Live-Server fehlten bzw. griffen keine gueltigen Laravel-Passport-Keys fuer
createToken().
Umsetzung
frontend/src/services/apiClient.jsnutzt fuer Live-Hosts unterthats-me.appautomatischhttps://api.thats-me.app/api.VITE_API_BASE=https://api.thats-me.appwird automatisch zuhttps://api.thats-me.app/apinormalisiert.backend/config/cors.phperlaubt zusaetzlich:https://thats-me.apphttps://www.thats-me.apphttps://app.thats-me.app
- Auf dem Live-Server wurden Passport-Keys/Config korrigiert, danach war der Login erfolgreich.
Live-Kommandos
php artisan passport:keys --force
php artisan db:seed --class=DatabaseSeeder --no-interaction
php artisan optimize:clear
php artisan config:cache
Pruefung
- Browser-Login im Live-Frontend gegen
https://api.thats-me.app/api/loginfunktioniert. - CORS-Fehler fuer
https://thats-me.appist behoben. - Passport-Fehler
Invalid key suppliedist behoben.
2026-06-03 - Phase 3 Hybrid-Auth Demo-Modus
Version: 0.2.1
Status: Abgeschlossen fuer festen lokalen Demo-User ohne API-Sync.
Geaenderte Dateien
frontend/src/pages/LoginPage.vuefrontend/src/stores/auth.jsfrontend/src/stores/events.jsfrontend/dev/db-api-connect/migration-log.md
Umsetzung
- Es gibt jetzt einen festen lokalen User
Demomitmode: local. - Die Login-Auswahl zeigt
Demozusaetzlich zu den sechs API-Usern. - Fuer
Demoist kein Passwort noetig; der Login-Button zeigtDemo lokal starten. - Lokale User-Erstellung und lokale
userN@thats-me.app-Custom-User wurden aus der Auth-Liste entfernt. Demostartet leer und seeded keine Beispiel-Events mehr.- Lokale Demo-Events bleiben in IndexedDB, werden aber nicht mehr in die lokale SyncQueue geschrieben.
- Remote-User
user1bisuser6bleiben unveraendert API-basiert.
Sicherheitsregel
Der Demo-Modus verwendet keinen API-Login und keinen Bearer Token. Events im Demo-Modus bleiben browserlokal in IndexedDB und werden nicht als API-Sync-Auftrag vorgemerkt.
Ausgefuehrte Kommandos
npm run lint
Testergebnis
npm run lint: erfolgreich.
Manuelle QA
- Noch nicht im Browser durchgeklickt.
- Erwartete QA:
Demoauswaehlen, ohne Passwort starten, leere Timeline sehen, Event anlegen, Reload pruefen. Danach mituser1@thats-me.appeinloggen und sicherstellen, dass keine Demo-Events sichtbar sind.
2026-06-03 - Nachtrag Settings-Hintergrundbilder
Status: Abgeschlossen fuer serverseitige Settings-Hintergrundbilder bei Remote-Usern.
Geaenderte Dateien
backend/app/Http/Controllers/Api/SettingsMediaController.phpbackend/app/Http/Requests/StoreSettingsMediaRequest.phpbackend/routes/api.phpbackend/tests/Feature/Api/SettingsTest.phpfrontend/src/components/LifeWaveSettings.vuefrontend/src/composables/useImageCache.jsfrontend/src/layouts/LifeWaveLayout.vuefrontend/src/stores/settings.jsfrontend/dev/db-api-connect/migration-log.md
Betroffene API-Endpunkte
POST /api/settings/media/backgroundGET /api/settings/media/backgroundDELETE /api/settings/media/background
Umsetzung
- Remote-User laden eigene LifeWave-Hintergrundbilder nicht mehr als Data-URL in das Settings-JSON.
- Der Backend-Endpunkt speichert pro User ein optimiertes JPEG unter dem privaten
localDisk. - Hintergrundbilder werden auf maximal 1600px laengste Kante und JPEG-Qualitaet 86 reduziert.
- Die Settings speichern nur den geschuetzten Pfad
/settings/media/background. - Das Frontend laedt geschuetzte Settings-Bilder wie Event-Medien per Bearer Token als Blob und verwendet die Blob-URL als CSS-Hintergrund.
- Der lokale Demo-/Browser-Modus nutzt weiterhin die bestehende Data-URL-Komprimierung im Browser.
Sicherheitsregel
Alle Settings-Medienrouten liegen hinter auth:api. Dateien werden usergebunden unter settings-media/{userId}/background.jpg gespeichert und nur fuer den authentifizierten User ausgeliefert.
Ausgefuehrte Kommandos
vendor/bin/pint --dirty --format agent
php artisan test --compact tests/Feature/Api/SettingsTest.php
npm run lint
Testergebnis
tests/Feature/Api/SettingsTest.php: 8 Tests, 32 Assertions, erfolgreich.npm run lint: erfolgreich.
2026-06-03 - Phase 6 Serverseitige Bilder Fuer Remote-User
Version: 0.4.0
Status: Abgeschlossen fuer serverseitige Remote-Eventbilder, Thumbnail-Erzeugung und geschuetzte Auslieferung.
Geaenderte Dateien
backend/app/Http/Controllers/Api/EventController.phpbackend/app/Http/Controllers/Api/EventMediaController.phpbackend/app/Http/Requests/StoreEventMediaRequest.phpbackend/app/Http/Resources/EventMediaResource.phpbackend/app/Http/Resources/EventResource.phpbackend/app/Models/Event.phpbackend/app/Models/EventMedia.phpbackend/app/Services/EventMediaImageProcessor.phpbackend/config/cors.phpbackend/database/factories/EventMediaFactory.phpbackend/database/migrations/2026_06_03_131801_create_event_media_table.phpbackend/database/migrations/2026_06_03_133403_add_preview_paths_to_event_media_table.phpbackend/routes/api.phpbackend/tests/Feature/Api/EventMediaTest.phpfrontend/src/components/EventPanel.vuefrontend/src/composables/useImageCache.jsfrontend/src/stores/events.jsfrontend/dev/db-api-connect/migration-log.md
Betroffene Tabellen
event_mediaeventsusers
Betroffene API-Endpunkte
GET /api/events/{event}/mediaPOST /api/events/{event}/mediaDELETE /api/events/{event}/media/{media}GET /api/event-media/{media}/thumbGET /api/event-media/{media}/previewGET /api/event-media/{media}/originalGET /api/events
Umsetzung
- Remote-Bilder werden auf dem Laravel-Server unter dem privaten
localDisk gespeichert. - Uploads werden user- und eventgebunden in
event_mediaabgelegt. - Server erzeugt drei JPEG-Varianten: 320px Thumbnail fuer Timeline/Dots, 900px Preview fuer Event-Panel/Galerie und ein Original mit maximal 3508px laengster Kante fuer A4 bei 300 DPI.
- Key Images verwenden die Collection
key_image; weitere Bilder verwendengallery. - Beim Ersetzen eines Key Images wird das alte Key Image inklusive Dateien entfernt.
- Geschuetzte Bildauslieferung prueft den authentifizierten User gegen
event_media.user_id. - Event-API liefert Medien-Metadaten mit
thumbnailUrlundoriginalUrl. - Frontend-Remote-Uploads gehen direkt an
/api/events/{id}/media. - Frontend laedt geschuetzte Bildpfade mit Bearer Token als Blob und verwendet lokale Blob-URLs fuer
<img>. - Timeline/Dots nutzen
thumbnailUrl, Event-Panel und Galerie nutzenpreviewUrl, ein spaeterer Download kannoriginalUrlverwenden. - Fuer Medien, die vor der Preview-Variante hochgeladen wurden, faellt
/previewauf das vorhandene Thumbnail zurueck. - Leere Medienpfade werden beim Loeschen ignoriert, damit Altbestaende ohne Preview-Datei keine 500er ausloesen.
- CORS ist fuer
https://app.thats-me.testund lokale App-Dev-Origins explizit konfiguriert. - Lokale Demo-/Browser-Bilder bleiben unveraendert als lokale Data-URLs.
Sicherheitsregel
Alle Medienrouten liegen hinter auth:api. Event-Medien werden nur ueber Events des authentifizierten Users angelegt, gelesen oder geloescht. Direkter Zugriff auf fremde event_media IDs liefert 404.
Ausgefuehrte Kommandos
vendor/bin/pint --dirty --format agent
php artisan optimize:clear
php artisan test --compact tests/Feature/Api/EventMediaTest.php
php artisan migrate --no-interaction
npm run lint
php artisan test --compact tests/Feature/Api/EventMediaTest.php tests/Feature/Api/EventTest.php tests/Feature/Api/AuthTest.php tests/Feature/Api/SettingsTest.php
php artisan migrate:status
Testergebnis
tests/Feature/Api/EventMediaTest.php: 9 Tests, erfolgreich.- API-Feature-Tests: 33 Tests, 133 Assertions, erfolgreich.
npm run lint: erfolgreich.php artisan migrate:status:2026_06_03_131801_create_event_media_tableist in Batch 2 ausgefuehrt.
Manuelle QA
- Noch nicht im Browser vollstaendig durchgeklickt.
- Erwartete QA: Remote-User einloggen, Key Image hochladen, Galerie-Bild hochladen, Seite neu laden, zweiten Browser mit gleichem User oeffnen, Thumbnail und Original in Galerie pruefen, Bild loeschen und DB/Storage pruefen.
Offene Punkte
- Thumbnail-Groesse und JPEG-Qualitaet sind aktuell feste MVP-Werte.
- Originalbilder werden aktuell mit JPEG-Qualitaet 90 gespeichert.
- Previewbilder werden aktuell mit maximal 900px laengster Kante und JPEG-Qualitaet 84 gespeichert.
- Spaeter koennen Queue-Jobs fuer groessere Medienverarbeitung und weitere Varianten ergaenzt werden.
- Upload-Limit ist aktuell 10 MB pro Bild.
2026-06-03 - Phase 5 Timeline-Settings Remote Speichern
Version: 0.3.0
Status: Abgeschlossen fuer Remote-Settings von API-Usern.
Geaenderte Dateien
backend/app/Http/Controllers/Api/SettingsController.phpbackend/app/Http/Requests/UpdateSettingsRequest.phpbackend/app/Models/User.phpbackend/app/Models/UserSetting.phpbackend/database/factories/UserSettingFactory.phpbackend/database/migrations/2026_06_03_130123_create_user_settings_table.phpbackend/routes/api.phpbackend/tests/Feature/Api/SettingsTest.phpfrontend/src/stores/settings.jsfrontend/dev/db-api-connect/migration-log.md
Betroffene Tabellen
user_settingsusers
Betroffene API-Endpunkte
GET /api/settingsPUT /api/settings
Umsetzung
- Pro User wird ein JSON-Dokument in
user_settings.settingsgespeichert. GET /api/settingsliefert die Settings des authentifizierten Users odernull.PUT /api/settingserstellt oder aktualisiert die Settings des authentifizierten Users.- Frontend-Remote-User laden Settings beim Userwechsel/Login aus der API.
- Frontend-Remote-User speichern Settings per API und halten
localStoragenur als lokalen Cache. - Lokale Demo-/Browser-User bleiben auf
localStorage. - Gespeichert werden unter anderem Appearance, Accent Color, Sprache, Floating-Lines, Emotion-Gradient, Timeline-Zoom, Timeline-Scroll, Presets, aktives Preset und
showFps.
Sicherheitsregel
Die Settings-Routen liegen hinter auth:api. Der Controller greift ausschliesslich ueber $request->user()->settings() auf Daten zu, dadurch sind Settings anderer User weder lesbar noch ueberschreibbar.
Ausgefuehrte Kommandos
vendor/bin/pint --dirty --format agent
php artisan optimize:clear
php artisan test --compact tests/Feature/Api/SettingsTest.php
php artisan migrate --no-interaction
php artisan migrate:status
npm run lint
php artisan test --compact tests/Feature/Api/SettingsTest.php tests/Feature/Api/AuthTest.php tests/Feature/Api/EventTest.php
Testergebnis
tests/Feature/Api/SettingsTest.php: 5 Tests, 19 Assertions, erfolgreich.tests/Feature/Api/SettingsTest.php tests/Feature/Api/AuthTest.php tests/Feature/Api/EventTest.php: 24 Tests, 97 Assertions, erfolgreich.npm run lint: erfolgreich.php artisan migrate:status:2026_06_03_130123_create_user_settings_tableist ausgefuehrt.
Manuelle QA
- Noch nicht im Browser gegen zwei Browserprofile durchgeklickt.
- Erwartete QA: mit API-User einloggen, Appearance/Accent/Floating-Lines/Timeline-Zoom aendern, in zweitem Browser mit gleichem User einloggen und Settings pruefen.
Offene Punkte
- Serverseitige Bilder fuer Remote-User folgen in Phase 6.
- Der lokale
Demo-User als sauber getrennter Browser-only Modus bleibt fuer Phase 3 noch offen.
2026-06-03 - Phase 2 API-Login Fuer Quasar
Version: 0.2.0
Status: Abgeschlossen fuer Backend-Login, Logout, Token-Ablage im Frontend und Remote-User-Auswahl im Login.
Geaenderte Dateien
backend/app/Http/Controllers/Api/AuthController.phpbackend/app/Http/Requests/LoginRequest.phpbackend/database/seeders/DatabaseSeeder.phpbackend/routes/api.phpbackend/tests/Feature/Api/AuthTest.phpfrontend/src/pages/LoginPage.vuefrontend/package.jsonfrontend/src/router/index.jsfrontend/src/services/apiClient.jsfrontend/src/services/syncService.jsfrontend/src/stores/auth.jsfrontend/dev/db-api-connect/migration-log.md
Betroffene Tabellen
usersoauth_clientsoauth_access_tokens
Betroffene API-Endpunkte
POST /api/loginPOST /api/logoutGET /api/user
Umsetzung
POST /api/loginvalidiert E-Mail und Passwort gegen Laravel-User.- Erfolgreicher Login erzeugt einen Passport Personal Access Token fuer die Quasar-App.
- Login-Response liefert Token, Token-Typ und Userdaten mit
mode: remote. POST /api/logoutwiderruft den aktuellen Token.DatabaseSeederlegt zusaetzlich einen Passport Personal-Access-Client fuer denusersProvider an, falls noch keiner existiert.- Frontend hat mit
src/services/apiClient.jseinen zentralen API-Client inklusive Token-Ablage in IndexedDBmeta.accessToken. syncServicenutzt denselben API-Client und vermeidet dadurch doppelte Token-Logik.authStore fuehrtuser1@thats-me.appbisuser6@thats-me.appals Remote-User.- Login-Seite nutzt async API-Login, zeigt die sechs API-Accounts und entfernt den sichtbaren User-Anlegen-Button.
- Router erkennt gespeicherte Remote-Auth nach Reload ueber die persistierte Auth-Struktur.
- Frontend-Lint-Script nutzt den funktionierenden
src/**/*.{js,cjs,mjs,vue}Glob.
Sicherheitsregel
Falsche Zugangsdaten liefern Validierungsfehler ohne Token. Geschuetzte Endpunkte bleiben hinter auth:api; Logout widerruft den Bearer Token serverseitig.
Ausgefuehrte Kommandos
vendor/bin/pint --dirty --format agent
php artisan test --compact tests/Feature/Api/AuthTest.php
php artisan test --compact tests/Feature/Api/AuthTest.php tests/Feature/Api/EventTest.php
php artisan db:seed --class=DatabaseSeeder --no-interaction
npm run lint
Testergebnis
tests/Feature/Api/AuthTest.php: 7 Tests, 43 Assertions, erfolgreich.tests/Feature/Api/AuthTest.php tests/Feature/Api/EventTest.php: 19 Tests, 78 Assertions, erfolgreich.npm run lint: erfolgreich.
Manuelle QA
- Browser-Login wurde noch nicht manuell durchgeklickt.
- Der Backend-Seed wurde gegen die lokale Datenbank erneut ausgefuehrt.
Offene Punkte
- Phase 3 fuehrt den lokalen
Demo-User sauber als getrennten Browser-only Modus ein. - Phase 4 stellt die Event-Persistenz fuer Remote-User von lokaler Dexie-Fuehrung auf API-Fuehrung um.
Nachtrag 2026-06-03
frontend/src/services/apiClient.jsnutzt beiapp.thats-me.testohne explizitesVITE_API_BASEautomatischhttps://api.thats-me.test/api.frontend/src/services/apiClient.jsnutzt bei Live-Hosts unterthats-me.appautomatischhttps://api.thats-me.app/api.- Damit laufen Login-Requests nicht mehr versehentlich gegen den Quasar-Devserver-Pfad
/api. VITE_API_BASE=https://api.thats-me.testundVITE_API_BASE=https://api.thats-me.appwerden automatisch um/apiergaenzt.backend/config/cors.phperlaubt fuer Live zusaetzlichhttps://thats-me.app,https://www.thats-me.appundhttps://app.thats-me.app.- Im Dev-Modus wird die vollstaendige API-Request-URL mit
API request: ...in die Browser-Konsole geschrieben. frontend/src/stores/auth.jsloggt Remote-Login-Fehler zusaetzlich in der Browser-Konsole.- Geprueft mit
npm run lintundphp artisan test --compact tests/Feature/Api/AuthTest.php.
Nachtrag Remote-Events 2026-06-03
frontend/src/stores/events.jslaedt Events fuer Remote-User beim Login direkt ueberGET /api/events.- Remote-Create, Remote-Update und Remote-Delete laufen fuer API-User jetzt direkt ueber
POST /api/events,PUT /api/events/{id}undDELETE /api/events/{id}. - IndexedDB bleibt fuer Remote-User nur Cache; fuehrend ist die API.
- Neue Browser laden vorhandene Remote-Events direkt aus der Datenbank.
- Geprueft mit
npm run lintundphp artisan test --compact tests/Feature/Api/EventTest.php tests/Feature/Api/AuthTest.php.
2026-06-03 - Phase 1 Backend-Basis
Version: 0.1.0
Status: Abgeschlossen fuer Backend-Basis, Demo-API-User und geschuetzte API-Pruefungen.
Geaenderte Dateien
backend/database/seeders/DatabaseSeeder.phpbackend/tests/Feature/Api/AuthTest.phpfrontend/dev/db-api-connect/migration-log.md
Betroffene Tabellen
userseventsoauth_auth_codesoauth_access_tokensoauth_refresh_tokensoauth_clientsoauth_device_codescachejobssessionspassword_reset_tokens
Betroffene API-Endpunkte
GET /api/userGET /api/events
Umsetzung
- Lokale MySQL-Datenbank
thats-mewurde angelegt, falls sie noch nicht vorhanden war. - Alle vorhandenen Backend-Migrationen wurden ausgefuehrt.
DatabaseSeederwurde idempotent gemacht.user1@thats-me.appbisuser6@thats-me.appwerden mit Passwortpassangelegt oder aktualisiert.- Der bestehende
test@example.combleibt als separater Test-User erhalten und wird nicht als Praesentationsuser verwendet. - Feature-Tests pruefen geschuetzten API-Zugriff ohne Token, Rueckgabe des authentifizierten Users und die Seeder-User inklusive Passwort.
Sicherheitsregel
Die geschuetzten API-Routen liegen weiterhin hinter auth:api. Ohne Token liefern GET /api/user und GET /api/events einen unauthorisierten Status. Mit Passport-Testauthentifizierung liefert GET /api/user nur den authentifizierten User.
Ausgefuehrte Kommandos
vendor/bin/pint --dirty --format agent
php artisan test --compact tests/Feature/Api/AuthTest.php
php artisan test --compact tests/Feature/Api
php artisan migrate --no-interaction
php artisan db:seed --class=DatabaseSeeder --no-interaction
php artisan migrate:status
Testergebnis
tests/Feature/Api/AuthTest.php: 4 Tests, 24 Assertions, erfolgreich.tests/Feature/Api: 16 Tests, 59 Assertions, erfolgreich.php artisan migrate:status: alle vorhandenen Migrationen in Batch 1 ausgefuehrt.
Manuelle QA
- Nicht im Browser geprueft, da Phase 1 noch keine Frontend-Anbindung enthaelt.
- CORS/API-Erreichbarkeit von
app.thats-me.testnachapi.thats-me.testbleibt fuer Phase 2/3 offen, sobald die Login-Route und der Frontend-Client angebunden werden.
Offene Punkte
- Echte Login-/Logout-Endpunkte fuer Quasar folgen in Phase 2.
- Token-Erzeugung fuer das Frontend wird in Phase 2 finalisiert.
- Frontend-Demo-Modus und Remote-User-Auswahl folgen in Phase 3.