diff --git a/docs/01_Architecture/MASTER_ROADMAP_2026_Q1.md b/docs/01_Architecture/MASTER_ROADMAP_2026_Q1.md index a0d59f7a..858cd9ec 100644 --- a/docs/01_Architecture/MASTER_ROADMAP_2026_Q1.md +++ b/docs/01_Architecture/MASTER_ROADMAP_2026_Q1.md @@ -2,7 +2,7 @@ type: Roadmap status: ACTIVE owner: Lead Architect -last_update: 2026-03-09 +last_update: 2026-03-09 (Ping Service Tracer Bullet abgeschlossen) --- # MASTER ROADMAP Q1 2026: "Operation Tracer Bullet" @@ -45,6 +45,8 @@ Wir validieren die gesamte Architektur-Kette (Frontend -> Gateway -> Service -> * [x] **HTTP Client Core:** Ktor Client mit Auth & Error Handling. * [x] **Authentication Flow:** OIDC Login Flow (Keycloak) implementiert. * [x] **UI Implementation:** Debug-Screen für Pings vorhanden. +* [x] **Sync-Fix:** `PingApiKoinClient.syncPings()` Query-Parameter `lastSyncTimestamp` → `since` korrigiert. _( + verifiziert 2026-03-09)_ --- @@ -66,7 +68,9 @@ 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. **Entries Service:** Beginn der Implementierung des ersten echten Fach-Services ("Nennungen"). + +1. **Entries Service:** Beginn der Implementierung des ersten echten Fach-Services ("Nennungen"). ← **NÄCHSTE PRIORITÄT + ** 2. ~~**System Hardening:** Keycloak Production-Config (kein `start-dev`).~~ ✅ _(erledigt 2026-03-09: `.env` KC_COMMAND auf `start --optimized --import-realm` korrigiert)_ 3. **Reporting / Printing:** (Vorgemerkt) diff --git a/docs/01_Architecture/_archive/2026-01-15_Roadmap_2026_Q1.md b/docs/01_Architecture/_archive/2026-01-15_Roadmap_2026_Q1.md index fe7b32fd..4248abb7 100644 --- a/docs/01_Architecture/_archive/2026-01-15_Roadmap_2026_Q1.md +++ b/docs/01_Architecture/_archive/2026-01-15_Roadmap_2026_Q1.md @@ -31,7 +31,9 @@ Das Ziel dieser Phase ist es, die Entwicklungsumgebung (Build, Docker, Dependenc - [x] **Gateway CircuitBreaker:** Behebung des `ClassNotFoundException` / `NoSuchMethodError` im Gateway (vermutlich Folge des Spring Cloud Konflikts). _(verifiziert 2026-03-09: Spring Cloud 2025.0.1 + reactor-resilience4j korrekt; GatewayConfig.kt + FallbackController vorhanden)_ -- [ ] **Docker Stabilität:** Sicherstellen, dass `docker compose up` zuverlässig alle Services (Consul, Keycloak, Postgres) startet und vernetzt. +- [x] **Docker Stabilität:** Sicherstellen, dass `docker compose up` zuverlässig alle Services (Consul, Keycloak, + Postgres) startet und vernetzt. _(verifiziert 2026-03-09: 3 Bugs behoben — KC_COMMAND, Valkey Env-Vars, Gateway + Property-Namespace)_ - [x] **Keycloak Config:** Validierung der Realm-Konfiguration (`meldestelle`) und der Client-Scopes für den `ping-service`. _(verifiziert 2026-03-09: frontend-client + PKCE + CORS-Härtung + Password-Policy umgesetzt)_ @@ -43,12 +45,16 @@ Implementierung des ersten vertikalen Durchstichs. ### 2.1 Modul-Struktur & API (Backend Dev) - [x] **Refactoring `core-utils`:** Verschieben von JVM-spezifischem Code (`DatabaseUtils`) nach `:backend:infrastructure:persistence`. `core-utils` muss "pure KMP" sein. _(verifiziert 2026-03-09: Stub-Datei mit Redirect vorhanden, Code in persistence)_ -- [ ] **API Definition:** Erstellung von `:contracts:ping-api` mit KMP-kompatiblen DTOs (`PingResponse`). +- [x] **API Definition:** Erstellung von `:contracts:ping-api` mit KMP-kompatiblen DTOs (`PingResponse`). _(verifiziert + 2026-03-09)_ ### 2.2 Service Implementation (Backend Dev) -- [ ] **Ping Service:** Implementierung von `:backend:services:ping:ping-service` mit Spring Boot 3.5.9. -- [ ] **Security:** Integration von OAuth2 Resource Server (Keycloak) und Absicherung des `/secure` Endpoints. -- [ ] **Discovery:** Registrierung bei Consul. + +- [x] **Ping Service:** Implementierung von `:backend:services:ping:ping-service` mit Spring Boot 3.5.9. _(verifiziert + 2026-03-09)_ +- [x] **Security:** Integration von OAuth2 Resource Server (Keycloak) und Absicherung des `/secure` Endpoints. _( + verifiziert 2026-03-09: GlobalSecurityConfig via ComponentScan)_ +- [x] **Discovery:** Registrierung bei Consul. _(verifiziert 2026-03-09: application.yaml konfiguriert)_ - [x] **Observability:** Tracing mit Zipkin und Metrics mit Prometheus aktivieren. _(verifiziert 2026-03-09: monitoring-client Bundle + Gateway B3-Fix)_ @@ -59,10 +65,13 @@ Implementierung des ersten vertikalen Durchstichs. Anbindung des Frontends an den neuen Service. ### 3.1 HTTP Client & Sync (Frontend Expert) -- [ ] **Ktor Client:** Konfiguration des HTTP-Clients für die Kommunikation mit dem Gateway (`http://localhost:8080`). + +- [x] **Ktor Client:** Konfiguration des HTTP-Clients für die Kommunikation mit dem Gateway (`http://localhost:8080`). + _(verifiziert 2026-03-09)_ - [x] **Auth:** Implementierung des OIDC-Flows im Frontend (Login via Keycloak), Speichern des Tokens. _(verifiziert 2026-03-09: PKCE S256 + frontend-client + JVM/JS actual-Implementierungen)_ -- [ ] **Integration:** Aufruf von `/api/ping` und `/api/ping/secure` und Anzeige im UI. +- [x] **Integration:** Aufruf von `/api/ping` und `/api/ping/secure` und Anzeige im UI. _(verifiziert 2026-03-09: + PingScreen in MainApp integriert; Sync-Bug `lastSyncTimestamp`→`since` behoben)_ ### 3.2 Offline-Sync Basis (Frontend Expert) - [x] **Sync-Logik:** Erste Implementierung eines Sync-Mechanismus (z.B. Queue für Offline-Requests) basierend auf SQLDelight. _(verifiziert 2026-03-09: frontend/core/local-db vollständig implementiert)_ diff --git a/docs/01_Architecture/_archive/2026-01-15_Roadmap_System_Hardening.md b/docs/01_Architecture/_archive/2026-01-15_Roadmap_System_Hardening.md index 7b002fee..98b59119 100644 --- a/docs/01_Architecture/_archive/2026-01-15_Roadmap_System_Hardening.md +++ b/docs/01_Architecture/_archive/2026-01-15_Roadmap_System_Hardening.md @@ -76,6 +76,10 @@ last_update: 2026-03-09 ### 3.2 Auth Integration - [x] **OIDC Client:** _(verifiziert 2026-03-09)_ +- [x] **Ping Service Tracer Bullet:** _(verifiziert 2026-03-09)_ + - Stack vollständig: Backend (Domain/App/Persistence/Controller/Security/Migrations), Contracts, Gateway-Routing, + Frontend (PingScreen, PingViewModel, PingApiKoinClient, Koin DI, Shell-Integration). + - Bug behoben: `PingApiKoinClient.syncPings()` `lastSyncTimestamp` → `since` (Delta-Sync Query-Parameter). - PKCE Authorization Code Flow (S256) mit `frontend-client`. - Pure Kotlin SHA-256 + PkceHelper (commonMain, kein expect/actual). - JVM: lokaler Callback-Server (Port 18080) + `Desktop.browse()`. diff --git a/docs/99_Journal/2026-03-09_Session_Log_Keycloak_Haertung.md b/docs/99_Journal/2026-03-09_Session_Log_Keycloak_Haertung.md index 7e02cecf..e2c42d45 100644 --- a/docs/99_Journal/2026-03-09_Session_Log_Keycloak_Haertung.md +++ b/docs/99_Journal/2026-03-09_Session_Log_Keycloak_Haertung.md @@ -171,7 +171,31 @@ gemounteter Konfigs. - **Consul Healthcheck:** curl auf `/v1/status/leader` ✅ - **Keycloak Healthcheck:** curl auf `localhost:9000/health/ready` ✅ +## ✅ Ping Service — Tracer Bullet Analyse & Fix (2026-03-09, gleiche Session) + +Vollständige Analyse des Ping Service Stacks (Backend → Gateway → Frontend). Ergebnis: Die gesamte +fachliche Implementierung war bereits vorhanden. Ein einziger kritischer Bug gefunden und behoben. + +### Befund: Stack vollständig implementiert + +- **Backend** (`backend/services/ping/ping-service`): Domain, Application, Persistence, Controller, + Security (`at.mocode.infrastructure.security` via `@ComponentScan`), DB-Migrations V1+V2 — vollständig. +- **Contracts** (`contracts/ping-api`): `PingResponse`, `EnhancedPingResponse`, `HealthResponse`, + `PingEvent`, `PingApi` — vollständig. +- **Gateway** (`backend/infrastructure/gateway`): Routing `/api/ping/**` → `stripPrefix(1)` → + Ping Service mit CircuitBreaker Fallback — korrekt. +- **Frontend** (`frontend/features/ping-feature`): `PingApiKoinClient`, `PingViewModel`, `PingScreen`, + `PingSyncService`, Koin DI — vollständig. +- **Shell-Integration**: `MainApp.kt` — `AppScreen.Ping` eingebunden, „Ping-Service"-Button auf Home-Screen, + Navigation korrekt. + +### Fix: `PingApiKoinClient.kt` — Query-Parameter-Mismatch 🔴 + +- **Problem:** `syncPings()` sendete `?lastSyncTimestamp=...` als Query-Parameter. + Backend `@RequestParam` erwartet `?since=...` — Delta-Sync lieferte immer alle Daten. +- **Fix:** `url.parameters.append("lastSyncTimestamp", ...)` → `url.parameters.append("since", ...)` + ## 🔜 Nächste Schritte - **TLS/HTTPS** — Langfristig: `KC_HOSTNAME_STRICT_HTTPS=true` setzen, sobald TLS eingerichtet ist. -- **Ping Service** — Fachliche Implementierung (nächste Phase laut `MASTER_ROADMAP_2026_Q1.md`). +- **Entries Service** — Beginn der Implementierung des ersten echten Fach-Services ("Nennungen"). diff --git a/frontend/features/ping-feature/src/commonMain/kotlin/at/mocode/ping/feature/data/PingApiKoinClient.kt b/frontend/features/ping-feature/src/commonMain/kotlin/at/mocode/ping/feature/data/PingApiKoinClient.kt index 2dc86ee5..84eeb9bc 100644 --- a/frontend/features/ping-feature/src/commonMain/kotlin/at/mocode/ping/feature/data/PingApiKoinClient.kt +++ b/frontend/features/ping-feature/src/commonMain/kotlin/at/mocode/ping/feature/data/PingApiKoinClient.kt @@ -1,13 +1,9 @@ package at.mocode.ping.feature.data -import at.mocode.ping.api.EnhancedPingResponse -import at.mocode.ping.api.HealthResponse -import at.mocode.ping.api.PingApi -import at.mocode.ping.api.PingEvent -import at.mocode.ping.api.PingResponse -import io.ktor.client.HttpClient -import io.ktor.client.call.body -import io.ktor.client.request.get +import at.mocode.ping.api.* +import io.ktor.client.* +import io.ktor.client.call.* +import io.ktor.client.request.* /** * PingApi-Implementierung, die einen bereitgestellten HttpClient verwendet (z. B. den per Dependency Injection @@ -39,7 +35,7 @@ class PingApiKoinClient(private val client: HttpClient) : PingApi { override suspend fun syncPings(since: Long): List { return client.get("/api/ping/sync") { - url.parameters.append("lastSyncTimestamp", since.toString()) + url.parameters.append("since", since.toString()) }.body() } }