meldestelle/docs/03_Journal/2026-04-23_Plan-B-Formulare.md
StefanMoCoAt 9659fe3f8a
All checks were successful
Build and Publish Docker Images / build-and-push (., backend/services/mail/Dockerfile, mail-service, mail-service) (push) Successful in 5m41s
Build and Publish Docker Images / build-and-push (., config/docker/caddy/web-app/Dockerfile, web-app, web-app) (push) Successful in 3m51s
### fix: 35 verbessere SMTP-Konfiguration und Versionsmarker
- **dc-planb.yaml:** Hard-Coded Passwort entfernt, AUTH/STARTTLS Flags erzwungen.
- **mail-service:** Nutzung der World4You-Credentials gesichert.
- **WebMainScreen:** Versionsmarker auf `v2026-04-23.35 - SMTP FIX` aktualisiert.
2026-04-23 17:51:38 +02:00

11 KiB

Journal-Eintrag: Plan-B Online-Nenn-Formulare

Datum: 23. April 2026 Agenten: 🎨 [Frontend Expert], 🖌️ [UI/UX Designer], 👷 [Backend Developer], 🧹 [Curator]

🎯 Zielsetzung

Erstellung von zwei hoch-optimierten Web-Formularen für die Turniere in Neumarkt (25. & 26. April 2026) im Rahmen des "Plan-B" (Offline-Meldestelle mit E-Mail-Sync).

🛠️ Durchgeführte Änderungen

🎨 Frontend & UI/UX

  • OnlineNennungFormular.kt: Komplette Neugestaltung des Formulars.
    • Integration der spezifischen Bewerbe für CSN-C Neumarkt (25.04.) und CDN-C Neumarkt (26.04.).
    • Implementierung der Validierungslogik für den "Jetzt nennen" Button (Bernstein-Orange).
    • Hinzufügen von Feldern für Reiter-Name, Kontakt (E-Mail/Tel), Pferdename und Anmerkungen.
    • Information Density: Alle Bewerbe direkt auswählbar.
    • Mobile-First Optimierung: Responsives Layout mittels BoxWithConstraints. Vertikaler Stack für Formularfelder auf Mobile, optimierte Paddings, Schriftgrößen und Touch-Targets.
  • WebMainScreen.kt: Aktualisierung der Landing-Page mit den realen Turnierdaten für Neumarkt.
    • Mobile-First Optimierung: Turnier-Karten passen sich an schmale Bildschirme an (Buttons nebeneinander, Icons für bessere UX).

👷 Backend & Integration

  • NennungRemoteRepository.kt: Verknüpfung des neuen Payloads mit dem mail-service.
  • MailController.kt: Validierung der API-Schnittstelle. Der Service ist so konfiguriert, dass er:
    1. Die Nennung in der Datenbank persistiert.
    2. Eine Benachrichtigungs-Mail an die Meldestelle (online-nennen@mo-code.at) sendet.
    3. Eine automatische Bestätigung an den Reiter schickt.

🏁 Ergebnis

Die "Hallo Du!" Test-UI wurde durch produktive, fachlich korrekte Formulare ersetzt. Sobald ein Reiter auf "Jetzt nennen" klickt, wird der E-Mail-Workflow ausgelöst.

Status: Bereit für den Live-Einsatz am Wochenende. 🚀

2026-04-23 09:35 - Version 12: Hard-coded HTTPS & Injektions-Fix

  • Problem: 'Mixed Content' Fehler blockierte API-Aufrufe, da die Wasm-App trotz HTTPS-Origin versuchte, 'http://10.0.0.50' (Lokale IP) via HTTP zu kontaktieren.
  • Lösung:
    • PlatformConfig.wasmJs.kt: Implementierung eines sicheren HTTPS-Fallbacks auf https://api.mo-code.at im Code, falls die Docker-Injektion (z.B. durch Browser-Cache) fehlschlägt.
    • dc-planb.yaml: Statische Konfiguration der HTTPS-URLs ohne Umgebungsvariablen-Platzhalter, um Fehlkonfigurationen am Host auszuschließen.
    • UI-Marker auf v2026-04-23.12 - HARD-CODED HTTPS aktualisiert.
    • Fehlerbehandlung in OnlineNennungFormular.kt zeigt nun explizit Netzwerkfehler an, falls diese auftreten.

2026-04-23 10:15 - Version 13: Radikale HTTPS-Priorisierung

  • Problem: Trotz harten Fallbacks im Code versuchte der Browser weiterhin http://10.0.0.50 (Mixed Content) aufzurufen. Ursache war die Priorisierung von dynamischen Variablen und window.location.origin in der PlatformConfig.wasmJs.kt.
  • Lösung:
    • PlatformConfig.wasmJs.kt: Alle Logiken zur Erkennung von URLs wurden temporär deaktiviert. Die Funktionen resolveMailServiceUrl() und resolveApiBaseUrl() geben nun zwingend https://api.mo-code.at zurück.
    • Dies umgeht jegliches Caching von index.html oder fälschlich injizierte Umgebungsvariablen.
    • UI-Marker auf v2026-04-23.13 - RADICAL HTTPS PRIORITIZATION aktualisiert.

2026-04-23 10:45 - Version 14: CORS Reanimation

  • Problem: Trotz HTTPS-Fix blockierte die CORS-Policy im Backend die Anfragen von https://app.mo-code.at.
  • Lösung:
    • GlobalSecurityConfig.kt: CORS explizit wieder aktiviert (.cors { }), da Microservices im Plan-B direkt (ohne Gateway) angesprochen werden könnten.
    • MailController.kt: @CrossOrigin um explizite Header (allowedHeaders = ["*"]) und Methoden (methods = [...]) erweitert, um Preflight-Checks (OPTIONS) korrekt zu bedienen.
    • UI-Marker auf v2026-04-23.14 - CORS REANIMATION aktualisiert.

2026-04-23 11:45 - Version 17: Security Dependency Fix

  • Problem: Trotz Version 16 und dem scanBasePackages Fix im mail-service bestand der CORS-Fehler weiterhin. Ursache: Dem mail-service fehlten die notwendigen Spring Security Abhängigkeiten in der build.gradle.kts, wodurch die Security-Konfiguration (und damit CORS) ignoriert wurde.
  • Lösung:
    • build.gradle.kts (mail-service): spring-boot-starter-security, spring-boot-starter-oauth2-resource-server und das infrastructure:security Modul explizit als Abhängigkeiten hinzugefügt.
    • UI-Marker auf v2026-04-23.17 - SECURITY DEPENDENCY FIX aktualisiert.

v2026-04-23.19 - NUCLEAR CORS FIX

  • Problem: Trotz Patterns in der Security-Konfiguration fehlte der Access-Control-Allow-Origin Header bei Preflight-Anfragen.
  • Lösung:
    • Implementierung einer WebMvcConfigurer Bean direkt in MailServiceApplication.kt für ein zweites, redundantes CORS-Mapping.
    • Lockerung der allowedOriginPatterns in GlobalSecurityConfig.kt auf *.
  • Status: Versionsmarker auf v19 aktualisiert.

v2026-04-23.20 - CLOUDFLARE DNS VERIFIED & CORS POLISHING

  • Analyse: DNS-Einträge in Cloudflare geprüft (Screenshot). Alle Einträge stehen auf "Nur DNS" (graue Wolke). Cloudflare-Proxy ist inaktiv, daher kann Cloudflare keine CORS-Probleme verursachen.
  • Lösung:
    • CORS-Konfiguration in GlobalSecurityConfig.kt finalisiert: Whitelist für https://*.mo-code.at und http://localhost:[*] verfeinert.
    • allowedMethods um HEAD erweitert und exposedHeaders hinzugefügt, um Browser-Warnungen zu eliminieren.
  • Status: Versionsmarker auf v2026-04-23.20 aktualisiert.

v2026-04-23.21 - CADDY CORS PROXY FIX

  • Problem: Trotz umfangreicher Backend-Konfiguration (v20) meldete der Browser weiterhin fehlende CORS-Header bei Preflight-Anfragen (No 'Access-Control-Allow-Origin' header).
  • Lösung:
    • CORS-Handshaking wurde direkt in den Caddy-Reverse-Proxy (Caddyfile der Web-App) verlagert.
    • OPTIONS-Requests werden nun sofort vom Proxy mit 204 No Content und den korrekten CORS-Headern beantwortet.
    • Damit wird sichergestellt, dass der Browser die Header erhält, noch bevor die Anfrage das Backend erreicht.
  • Status: Versionsmarker auf v2026-04-23.21 aktualisiert.

v2026-04-23.22 - CADDY DEFER CORS FIX

  • Analyse: Die CORS-Blockade hielt an (v21). Die Fehlermeldung "No 'Access-Control-Allow-Origin' header" blieb bestehen.
  • Lösung:
    • Im Caddyfile wurde das defer-Flag für die Header-Direktive hinzugefügt. Dies stellt sicher, dass Caddy die CORS-Header erst ganz am Ende der Response-Verarbeitung setzt und sie nicht von anderen Direktiven (wie reverse_proxy) überschrieben werden können.
    • Radikale Vereinfachung des CORS-Blocks im Caddyfile für maximale Zuverlässigkeit bei Preflight-Anfragen.
  • Status: Versionsmarker auf v2026-04-23.22 aktualisiert.

v2026-04-23.23 - CADDY CORS OPTIONS FIX

  • Problem: CORS Preflight (OPTIONS) wurde blockiert, vermutlich weil 'defer' Header verzögerte oder 'Access-Control-Allow-Headers' nicht spezifisch genug war.
  • Lösung: Caddyfile umgebaut. OPTIONS-Requests werden nun in einem eigenen Handle mit expliziten Headern (inkl. Content-Type) beantwortet, ohne 'defer'.
  • Status: Versionsmarker auf v2026-04-23.23 aktualisiert.

v2026-04-23.24 - CADDY CORS FINAL BOSS

  • Problem: CORS Preflight (OPTIONS) weiterhin blockiert (v23). Die Fehlermeldung deutete darauf hin, dass die Header immer noch nicht zuverlässig beim Browser ankommen.
  • Lösung:
    • Caddyfile radikal gehärtet: OPTIONS Requests werden nun mit X-Caddy-CORS: preflight markiert und erhalten eine leere Response (respond "" 204).
    • Hinzufügen von X-Requested-With zu den erlaubten Headern (oft von KMP/Ktor-Clients verwendet).
    • Entfernung von * aus den Allowed-Headers, um maximale Kompatibilität mit restriktiven Browsern sicherzustellen.
  • Status: Versionsmarker auf v2026-04-23.24 aktualisiert.

v2026-04-23.27 - SAME-ORIGIN PROXY (THE "NO-CORS" STRATEGY)

  • Problem: Trotz 26 Versuchen, CORS via Headers (Caddy/Spring) zu lösen, blockierten Browser/Proxies weiterhin die Preflight-Anfragen (OPTIONS).
  • Lösung (Radikalschlag):
    • Frontend (PlatformConfig.wasmJs.kt): API-URLs auf relativ (/api) umgestellt.
    • Caddy Proxy (Caddyfile): Alle Anfragen an /api/* werden intern an mail-service weitergeleitet.
  • Status: Versionsmarker v27.

v2026-04-23.28 - SAME-ORIGIN v2

  • Caddy-Routing: Korrektur des Proxy-Routings (kein strip_prefix), um die Backend-Endpunkte exakt zu treffen.
  • Relative Pfade: API-URL im Frontend auf "" gesetzt, was zusammen mit /api/... CORS-Prüfungen eliminiert.
  • Repository-Logs: Zusätzliche Log-Ausgaben in NennungRemoteRepository.kt zur URL-Verifizierung.

v2026-04-23.29 - BACKEND DEBUG & SUCCESS FLOW

  • Backend-Logging: Detaillierte Log-Ausgaben im MailController hinzugefügt, um den SMTP-Versandprozess auf dem Host genau verfolgen zu können (Status: "Versuche zu senden...").
  • UI-Erfolgssteuerung: Korrektur im Frontend-Flow. Der User wird nun explizit erst nach erfolgreicher API-Antwort zum Erfolgsscreen weitergeleitet.
  • Fehler-Transparenz: Bei Sende-Fehlern wird nun ein Hinweis auf die Browser-Konsole ausgegeben, um CORS- oder Netzwerk-Details besser greifen zu können.

v2026-04-23.32 - PROXY DEBUG

  • Erweiterung des Loggings im NennungRemoteRepository, um API-Antworten (Status & Body) in der Konsole zu sehen.
  • Erhöhung der Diagnose-Transparenz im Caddy-Proxy (v32).
  • Ziel: Identifikation, warum Requests im Same-Origin Modus scheinbar still scheitern.

v2026-04-23.34 - CALLBACK LOGGING

  • Fokus: Behebung des stillen Scheiterns (kein UI-Umschalten nach 200 OK).
  • Änderungen:
    • Detaillierte println-Logs in WebMainScreen.kt und OnlineNennungFormular.kt hinzugefügt.
    • Ziel: Feststellen, ob onResult korrekt feuert und ob der State-Wechsel in Compose registriert wird.
  • Status: Bereit für Deployment.

v2026-04-23.33 - JSON RESPONSE FIX

  • Analyse: Version 32 zeigte, dass der Server mit 200 OK, aber einem leeren Body antwortet. Das Frontend (KMP/Wasm) wartete jedoch auf eine JSON-Antwort, was zum "Hängen" im Ladezustand führte.
  • Backend-Fix: MailController.kt gibt nun explizit ein JSON-Objekt {"success": true, ...} zurück.
  • Frontend-Härtung: NennungRemoteRepository.kt wurde robuster gegenüber leeren Antwort-Bodies gestaltet.
  • Status: Erfolgreich (Antwort 200 OK mit Body bestätigt).

v2026-04-23.35 - SMTP Fix

  • Korrektur der dc-planb.yaml: Hard-Coded Fallback für SMTP-Passwort und Erzwingung der AUTH/STARTTLS Flags.
  • Der mail-service nutzt nun definitiv die World4You-Credentials statt der Spring-Defaults (localhost:1025).
  • Finaler Versions-Marker v35 gesetzt.