From f00cc7681ff73ae4d78b9dce3115c7a6ed13a2c8 Mon Sep 17 00:00:00 2001 From: StefanMoCoAt Date: Sun, 1 Feb 2026 18:48:00 +0100 Subject: [PATCH] chore(docs): update roadmap and add Sync Fix report, remove desktop-app from compose config - Marked Phase 3 of roadmap as complete and adjusted next steps. - Added detailed report documenting the Sync type mismatch resolution. - Commented out the `desktop-app` service from `dc-gui.yaml`. --- .env.example | 1 - dc-gui.yaml | 46 +++++++++---------- .../01_Architecture/MASTER_ROADMAP_2026_Q1.md | 9 ++-- docs/90_Reports/2026-02-01_Sync_Fix_Report.md | 33 +++++++++++++ .../core/auth/data/AuthTokenManager.kt | 2 +- 5 files changed, 61 insertions(+), 30 deletions(-) create mode 100644 docs/90_Reports/2026-02-01_Sync_Fix_Report.md diff --git a/.env.example b/.env.example index 4f83789b..fbc984c0 100644 --- a/.env.example +++ b/.env.example @@ -44,7 +44,6 @@ PGADMIN_PASSWORD=admin GF_ADMIN_USER=admin GF_ADMIN_PASSWORD=admin - # Docker build versions (optional overrides) DOCKER_GRADLE_VERSION=9.2.1 DOCKER_JAVA_VERSION=25 diff --git a/dc-gui.yaml b/dc-gui.yaml index 4dd639ad..3cdf3ff8 100644 --- a/dc-gui.yaml +++ b/dc-gui.yaml @@ -38,29 +38,29 @@ services: profiles: [ "gui", "all" ] # --- DESKTOP-APP (optional) --- - desktop-app: - build: - context: . - dockerfile: config/docker/nginx/desktop-app/Dockerfile - args: - BUILD_DATE: "${DOCKER_BUILD_DATE}" - labels: - - "org.opencontainers.image.created=${DOCKER_BUILD_DATE}" - container_name: "${PROJECT_NAME:-meldestelle}-desktop-app" - restart: no - environment: - API_BASE_URL: "http://api-gateway:8081" - ports: - - "${DESKTOP_APP_VNC_PORT:-5901:5901}" - - "${DESKTOP_APP_NOVNC_PORT:-6080:6080}" - depends_on: - api-gateway: - condition: "service_started" - networks: - meldestelle-network: - aliases: - - "desktop-app" - profiles: [ "gui", "all" ] +# desktop-app: +# build: +# context: . +# dockerfile: config/docker/nginx/desktop-app/Dockerfile +# args: +# BUILD_DATE: "${DOCKER_BUILD_DATE}" +# labels: +# - "org.opencontainers.image.created=${DOCKER_BUILD_DATE}" +# container_name: "${PROJECT_NAME:-meldestelle}-desktop-app" +# restart: no +# environment: +# API_BASE_URL: "http://api-gateway:8081" +# ports: +# - "${DESKTOP_APP_VNC_PORT:-5901:5901}" +# - "${DESKTOP_APP_NOVNC_PORT:-6080:6080}" +# depends_on: +# api-gateway: +# condition: "service_started" +# networks: +# meldestelle-network: +# aliases: +# - "desktop-app" +# profiles: [ "gui", "all" ] networks: meldestelle-network: diff --git a/docs/01_Architecture/MASTER_ROADMAP_2026_Q1.md b/docs/01_Architecture/MASTER_ROADMAP_2026_Q1.md index dcb2ea1d..ad779618 100644 --- a/docs/01_Architecture/MASTER_ROADMAP_2026_Q1.md +++ b/docs/01_Architecture/MASTER_ROADMAP_2026_Q1.md @@ -45,12 +45,12 @@ Wir validieren die gesamte Architektur-Kette (Frontend -> Gateway -> Service -> --- -### PHASE 3: Offline & Sync (IN PROGRESS) +### PHASE 3: Offline & Sync (ABGESCHLOSSEN) *Ziel: Datenkonsistenz auch bei Netzwerk-Verlust.* #### 🤝 Joint Task Force (Backend & Frontend) * [x] **Sync-Protokoll:** `PingEvent` Contract definiert. -* [ ] **Sync-Fix (CRITICAL):** Typ-Mismatch beheben! Backend erwartet `Long` Timestamp, Frontend muss sicherstellen, dass kein String-Cursor gesendet wird. +* [x] **Sync-Fix (CRITICAL):** Typ-Mismatch behoben! Backend und Frontend nutzen nun konsistent `since: Long`. * [x] **Web-App Sync:** SQLDelight Integration vorbereitet. --- @@ -63,6 +63,5 @@ Wir validieren die gesamte Architektur-Kette (Frontend -> Gateway -> Service -> 5. [x] In Zipkin ist der komplette Request-Trace (Frontend -> Gateway -> Service -> DB) sichtbar. ## 4. Next Steps (Q1/2026) -1. **Sync-Fix:** Typ-Sicherheit zwischen Frontend und Backend herstellen. -2. **Entries Service:** Beginn der Implementierung des ersten echten Fach-Services ("Nennungen"). -3. **System Hardening:** Keycloak Production-Config (kein `start-dev`). +1. **Entries Service:** Beginn der Implementierung des ersten echten Fach-Services ("Nennungen"). +2. **System Hardening:** Keycloak Production-Config (kein `start-dev`). diff --git a/docs/90_Reports/2026-02-01_Sync_Fix_Report.md b/docs/90_Reports/2026-02-01_Sync_Fix_Report.md new file mode 100644 index 00000000..fa1d7a0f --- /dev/null +++ b/docs/90_Reports/2026-02-01_Sync_Fix_Report.md @@ -0,0 +1,33 @@ +--- +type: Report +date: 2026-02-01 +author: Curator +status: FINAL +--- + +# Report: Fix Sync Type Mismatch (String vs Long) + +## 1. Problembeschreibung +Es wurde eine kritische Inkonsistenz im Delta-Sync-Mechanismus zwischen Frontend und Backend festgestellt. +* **Frontend:** Der generische `SyncManager` nutzte einen String-Cursor (UUIDv7), was zu einem Typ-Fehler führte. +* **Backend:** Der `PingController` erwartete strikt einen `Long` (Timestamp) für den Parameter `lastSyncTimestamp`. + +## 2. Durchgeführte Maßnahmen +### 2.1 Backend (`ping-service`) +* **Parameter-Umbenennung:** Der Parameter im `PingController` wurde von `lastSyncTimestamp` zu `since` umbenannt, um der Konvention des Frontend-SyncManagers zu entsprechen. +* **Tests:** Unit- und Integrationstests (`PingControllerTest`) wurden aktualisiert. + +### 2.2 Frontend (`meldestelle-portal`) +* **Repository-Anpassung:** `PingEventRepositoryImpl` holt nun explizit den `last_modified` Timestamp aus der Datenbank (via neuer SQL-Query `selectLatestPingEventTimestamp`). +* **Typ-Konvertierung:** Der Timestamp wird als String an den `SyncManager` übergeben, der ihn als URL-Parameter anhängt. Spring Boot konvertiert diesen String automatisch zurück in einen `Long`. + +### 2.3 Contracts (`ping-api`) +* Das Interface `PingApi` wurde aktualisiert: `syncPings(since: Long)`. + +## 3. Ergebnis +* Die Typ-Sicherheit ist hergestellt. +* Tests im Backend laufen erfolgreich durch. +* Der Sync-Mechanismus ist nun robust und bereit für den produktiven Einsatz. + +## 4. Status +✅ **RESOLVED** diff --git a/frontend/core/auth/src/commonMain/kotlin/at/mocode/frontend/core/auth/data/AuthTokenManager.kt b/frontend/core/auth/src/commonMain/kotlin/at/mocode/frontend/core/auth/data/AuthTokenManager.kt index 2e2ac551..35fcb55c 100644 --- a/frontend/core/auth/src/commonMain/kotlin/at/mocode/frontend/core/auth/data/AuthTokenManager.kt +++ b/frontend/core/auth/src/commonMain/kotlin/at/mocode/frontend/core/auth/data/AuthTokenManager.kt @@ -287,7 +287,7 @@ class AuthTokenManager { private fun extractPermissionsFromJson(jsonString: String): List? { return try { // Simple regex to find a permissions array - val permissionsRegex = """"permissions":\s*\[(.*?)]""".toRegex() + val permissionsRegex = """"permissions":\s*\[(.*?)\]""".toRegex() val match = permissionsRegex.find(jsonString) match?.let { matchResult ->