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`.
This commit is contained in:
Stefan Mogeritsch 2026-02-01 18:48:00 +01:00
parent aa0c07904f
commit f00cc7681f
5 changed files with 61 additions and 30 deletions

View File

@ -44,7 +44,6 @@ PGADMIN_PASSWORD=admin
GF_ADMIN_USER=admin GF_ADMIN_USER=admin
GF_ADMIN_PASSWORD=admin GF_ADMIN_PASSWORD=admin
# Docker build versions (optional overrides) # Docker build versions (optional overrides)
DOCKER_GRADLE_VERSION=9.2.1 DOCKER_GRADLE_VERSION=9.2.1
DOCKER_JAVA_VERSION=25 DOCKER_JAVA_VERSION=25

View File

@ -38,29 +38,29 @@ services:
profiles: [ "gui", "all" ] profiles: [ "gui", "all" ]
# --- DESKTOP-APP (optional) --- # --- DESKTOP-APP (optional) ---
desktop-app: # desktop-app:
build: # build:
context: . # context: .
dockerfile: config/docker/nginx/desktop-app/Dockerfile # dockerfile: config/docker/nginx/desktop-app/Dockerfile
args: # args:
BUILD_DATE: "${DOCKER_BUILD_DATE}" # BUILD_DATE: "${DOCKER_BUILD_DATE}"
labels: # labels:
- "org.opencontainers.image.created=${DOCKER_BUILD_DATE}" # - "org.opencontainers.image.created=${DOCKER_BUILD_DATE}"
container_name: "${PROJECT_NAME:-meldestelle}-desktop-app" # container_name: "${PROJECT_NAME:-meldestelle}-desktop-app"
restart: no # restart: no
environment: # environment:
API_BASE_URL: "http://api-gateway:8081" # API_BASE_URL: "http://api-gateway:8081"
ports: # ports:
- "${DESKTOP_APP_VNC_PORT:-5901:5901}" # - "${DESKTOP_APP_VNC_PORT:-5901:5901}"
- "${DESKTOP_APP_NOVNC_PORT:-6080:6080}" # - "${DESKTOP_APP_NOVNC_PORT:-6080:6080}"
depends_on: # depends_on:
api-gateway: # api-gateway:
condition: "service_started" # condition: "service_started"
networks: # networks:
meldestelle-network: # meldestelle-network:
aliases: # aliases:
- "desktop-app" # - "desktop-app"
profiles: [ "gui", "all" ] # profiles: [ "gui", "all" ]
networks: networks:
meldestelle-network: meldestelle-network:

View File

@ -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.* *Ziel: Datenkonsistenz auch bei Netzwerk-Verlust.*
#### 🤝 Joint Task Force (Backend & Frontend) #### 🤝 Joint Task Force (Backend & Frontend)
* [x] **Sync-Protokoll:** `PingEvent` Contract definiert. * [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. * [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. 5. [x] In Zipkin ist der komplette Request-Trace (Frontend -> Gateway -> Service -> DB) sichtbar.
## 4. Next Steps (Q1/2026) ## 4. Next Steps (Q1/2026)
1. **Sync-Fix:** Typ-Sicherheit zwischen Frontend und Backend herstellen. 1. **Entries Service:** Beginn der Implementierung des ersten echten Fach-Services ("Nennungen").
2. **Entries Service:** Beginn der Implementierung des ersten echten Fach-Services ("Nennungen"). 2. **System Hardening:** Keycloak Production-Config (kein `start-dev`).
3. **System Hardening:** Keycloak Production-Config (kein `start-dev`).

View File

@ -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**

View File

@ -287,7 +287,7 @@ class AuthTokenManager {
private fun extractPermissionsFromJson(jsonString: String): List<String>? { private fun extractPermissionsFromJson(jsonString: String): List<String>? {
return try { return try {
// Simple regex to find a permissions array // Simple regex to find a permissions array
val permissionsRegex = """"permissions":\s*\[(.*?)]""".toRegex() val permissionsRegex = """"permissions":\s*\[(.*?)\]""".toRegex()
val match = permissionsRegex.find(jsonString) val match = permissionsRegex.find(jsonString)
match?.let { matchResult -> match?.let { matchResult ->