### fix: 30 verbessere Fehlertransparenz und Debug-Logs
All checks were successful
Build and Publish Docker Images / build-and-push (., backend/services/mail/Dockerfile, mail-service, mail-service) (push) Successful in 5m44s
Build and Publish Docker Images / build-and-push (., config/docker/caddy/web-app/Dockerfile, web-app, web-app) (push) Successful in 4m12s

- **OnlineNennungFormular:** Hinweis auf Browser-Konsole zu Fehlermeldungen hinzugefügt.
- **MailController:** Zusätzliche Debug-Logs für SMTP-Flows (Sendeversuch und Fehlerbehandlung).
- **WebMainScreen:** Versionsmarker auf `v2026-04-23.30 - COMPILE FIX` aktualisiert.
This commit is contained in:
Stefan Mogeritsch 2026-04-23 16:02:06 +02:00
parent 3f291c907c
commit 162e2ef414
4 changed files with 19 additions and 9 deletions

View File

@ -71,6 +71,7 @@ class MailController(
logger.info("Nennung ${entity.id} in Datenbank persistiert.") logger.info("Nennung ${entity.id} in Datenbank persistiert.")
// --- PLAN B: Benachrichtigung an die Meldestelle (online-nennen@mo-code.at) senden --- // --- PLAN B: Benachrichtigung an die Meldestelle (online-nennen@mo-code.at) senden ---
logger.info("Versuche Benachrichtigungs-Mail an $baseMailAddress zu senden...")
try { try {
val notification = SimpleMailMessage() val notification = SimpleMailMessage()
notification.from = baseMailAddress // Mailserver erfordert oft, dass From == Username ist notification.from = baseMailAddress // Mailserver erfordert oft, dass From == Username ist
@ -97,10 +98,11 @@ class MailController(
mailSender.send(notification) mailSender.send(notification)
logger.info("Plan-B Nennungs-Mail an die Meldestelle gesendet. Betreff: ${notification.subject}") logger.info("Plan-B Nennungs-Mail an die Meldestelle gesendet. Betreff: ${notification.subject}")
} catch (e: Exception) { } catch (e: Exception) {
logger.error("Fehler beim Senden der Plan-B Nennungs-Mail an die Meldestelle: ${e.message}") logger.error("KRITISCH: Fehler beim Senden der Plan-B Nennungs-Mail an die Meldestelle: ${e.message}", e)
} }
// --- Ursprüngliche Bestätigung an den Reiter (optional, bleibt vorerst erhalten) --- // --- Ursprüngliche Bestätigung an den Reiter (optional, bleibt vorerst erhalten) ---
logger.info("Versuche Bestätigungs-Mail an ${request.email} zu senden...")
try { try {
val message = SimpleMailMessage() val message = SimpleMailMessage()
@ -126,7 +128,7 @@ class MailController(
mailSender.send(message) mailSender.send(message)
logger.info("Bestätigungs-Mail an ${request.email} gesendet.") logger.info("Bestätigungs-Mail an ${request.email} gesendet.")
} catch (e: Exception) { } catch (e: Exception) {
logger.error("Fehler beim Senden der Bestätigungs-Mail: ${e.message}") logger.error("KRITISCH: Fehler beim Senden der Bestätigungs-Mail an ${request.email}: ${e.message}", e)
} }
} }

View File

@ -103,9 +103,17 @@ Die "Hallo Du!" Test-UI wurde durch produktive, fachlich korrekte Formulare erse
### v2026-04-23.27 - SAME-ORIGIN PROXY (THE "NO-CORS" STRATEGY) ### 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). - **Problem**: Trotz 26 Versuchen, CORS via Headers (Caddy/Spring) zu lösen, blockierten Browser/Proxies weiterhin die Preflight-Anfragen (OPTIONS).
- **Analyse**: Wenn der Browser `app.mo-code.at` (Frontend) und `api.mo-code.at` (Backend) sieht, greift die Same-Origin-Policy. In einigen Netzwerk-Konstellationen (Firewalls/Restriktive Browser) schlägt CORS trotz korrekter Header fehl.
- **Lösung (Radikalschlag)**: - **Lösung (Radikalschlag)**:
- **Frontend (`PlatformConfig.wasmJs.kt`)**: API-URLs von absolut (`https://api.mo-code.at`) auf relativ (`/api`) umgestellt. - **Frontend (`PlatformConfig.wasmJs.kt`)**: API-URLs auf relativ (`/api`) umgestellt.
- **Caddy Proxy (`Caddyfile`)**: Ein neuer Handle für `/api/*` leitet alle Anfragen intern (Docker-intern) an `mail-service:8085` weiter und entfernt das `/api` Präfix. - **Caddy Proxy (`Caddyfile`)**: Alle Anfragen an `/api/*` werden intern an `mail-service` weitergeleitet.
- **Ergebnis**: Für den Browser finden alle Anfragen auf `app.mo-code.at` statt. Es gibt keine "Cross-Origin" Grenze mehr, CORS-Header werden vom Browser gar nicht mehr geprüft. - **Status**: Versionsmarker v27.
- **Status**: Versionsmarker auf v2026-04-23.27 aktualisiert. Dies ist die stabilste Architektur für Web-Apps.
### 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.

View File

@ -401,7 +401,7 @@ fun OnlineNennungFormular(
onNennenAbgeschickt(payload) { success, error -> onNennenAbgeschickt(payload) { success, error ->
isLoading = false isLoading = false
if (!success) { if (!success) {
errorMessage = "Senden fehlgeschlagen: " + (error ?: "Netzwerkfehler oder Server nicht erreichbar.") errorMessage = "Senden fehlgeschlagen: " + (error ?: "Netzwerkfehler oder Server nicht erreichbar. Bitte die Browser-Konsole (F12) prüfen.")
} }
} }
} }

View File

@ -126,7 +126,7 @@ fun MainAppContent() {
// Dezentraler Versions-Marker in der unteren rechten Ecke // Dezentraler Versions-Marker in der unteren rechten Ecke
Box(modifier = Modifier.fillMaxSize().padding(8.dp), contentAlignment = Alignment.BottomEnd) { Box(modifier = Modifier.fillMaxSize().padding(8.dp), contentAlignment = Alignment.BottomEnd) {
Text( Text(
text = "v2026-04-23.28 - SAME-ORIGIN v2", text = "v2026-04-23.30 - COMPILE FIX",
style = MaterialTheme.typography.labelSmall, style = MaterialTheme.typography.labelSmall,
color = Color.LightGray.copy(alpha = 0.5f) color = Color.LightGray.copy(alpha = 0.5f)
) )