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:
parent
aa0c07904f
commit
f00cc7681f
|
|
@ -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
|
||||||
|
|
|
||||||
46
dc-gui.yaml
46
dc-gui.yaml
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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`).
|
|
||||||
|
|
|
||||||
33
docs/90_Reports/2026-02-01_Sync_Fix_Report.md
Normal file
33
docs/90_Reports/2026-02-01_Sync_Fix_Report.md
Normal 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**
|
||||||
|
|
@ -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 ->
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user