meldestelle/docs/90_Reports/2026-02-01_Backend_Hardening_PingService.md
StefanMoCoAt 7401df11a6 chore(backend): rename lastSyncTimestamp to since across Ping sync API for consistency
- Updated parameter name in `PingController`, `PingApi`, and related tests to align with SyncManager conventions.
2026-02-01 17:56:18 +01:00

3.3 KiB

type status owner last_update
Report ACTIVE Backend Developer 2026-02-01

Abschlussbericht: Backend Hardening & Infrastructure (Ping-Service)

1. Management Summary

Der Ping-Service wurde erfolgreich als technischer Blueprint ("Tracer Bullet") gehärtet. Er erfüllt nun alle Anforderungen der Phase 1 (Backend Hardening) der Q1 Roadmap. Die Infrastruktur wurde modernisiert (Valkey 9.0), und die Testabdeckung wurde durch echte Integrationstests (Testcontainers) auf ein Enterprise-Niveau gehoben.

Der Service ist Production Ready und dient ab sofort als Vorlage für alle fachlichen Microservices.

2. Durchgeführte Maßnahmen

🛡️ Security & Resilience

  • OAuth2 Resource Server: Implementiert und konfiguriert (GlobalSecurityConfig). Tokens vom Keycloak werden validiert.
  • RBAC: Endpunkte wie /ping/secure sind durch Rollen geschützt (@PreAuthorize).
  • CircuitBreaker: Resilience4j sichert DB-Zugriffe ab (@CircuitBreaker). Fallback-Methoden ("Degraded Mode") sind aktiv.

🏗️ Infrastructure Upgrade

  • Valkey Migration: Erfolgreiche Migration von Redis (proprietär) auf Valkey 9.0 (Open Source) in docker-compose und Environment-Configs.
    • Images: valkey/valkey:9.0
    • Kompatibilität: Vollständig gegeben (Drop-In Replacement).

🧪 Quality Assurance (Testing)

  • Integrationstests: Implementierung von PingRepositoryTest mit Testcontainers (Postgres).
    • Prüft Flyway-Migrationen (V1, V2).
    • Prüft JPA-Mapping und UUIDv7-Persistenz gegen eine echte Datenbank.
  • Test-Isolierung: Lösung komplexer Spring-Kontext-Probleme (BeanDefinitionOverrideException) durch:
    • Einführung einer isolierten TestPersistenceConfig für Repository-Tests.
    • Nutzung von @TestConfiguration in Controller-Tests.
    • Entfernung des hinderlichen @Profile("!test") im PingRepositoryAdapter.

📊 Observability

  • Actuator: Health, Info, Metrics und Prometheus-Endpunkte sind exponiert.
  • Tracing: Zipkin-Integration vorbereitet via monitoring-client.

3. Technische Details & Learnings

Problem: Spring Context Pollution

Während der Implementierung der Integrationstests kam es zu Konflikten zwischen den Bean-Definitionen verschiedener Tests (BeanDefinitionOverrideException). Lösung: Strikte Trennung der Kontexte. PingRepositoryTest lädt nun nicht mehr die gesamte PingServiceApplication, sondern nur eine minimale TestPersistenceConfig, die gezielt nur das Persistence-Layer scannt. Dies beschleunigt die Tests und verhindert Seiteneffekte durch Controller oder Security-Configs.

Problem: Profile-Exclusion

Der PingRepositoryAdapter war mit @Profile("!test") annotiert. Dies verhinderte, dass Integrationstests (die im test-Profil laufen) den echten Adapter nutzen konnten. Lösung: Annotation entfernt. In Unit-Tests wird der Adapter ohnehin durch Mocks ersetzt, daher ist die Exclusion unnötig und schädlich für Integrationstests.

4. Nächste Schritte (Handover an Frontend)

Der Backend-Stack ist stabil. Der Frontend-Expert kann nun die Integration (Phase 2) abschließen:

  1. Login gegen Keycloak.
  2. Aufruf von /ping/secure mit Bearer-Token.
  3. Test des Delta-Syncs (/ping/sync).

Gez. Senior Backend Developer