diff --git a/backend/services/mail/mail-service/src/main/kotlin/at/mocode/mail/service/api/MailController.kt b/backend/services/mail/mail-service/src/main/kotlin/at/mocode/mail/service/api/MailController.kt index 21ff2173..dee774f9 100644 --- a/backend/services/mail/mail-service/src/main/kotlin/at/mocode/mail/service/api/MailController.kt +++ b/backend/services/mail/mail-service/src/main/kotlin/at/mocode/mail/service/api/MailController.kt @@ -71,6 +71,7 @@ class MailController( logger.info("Nennung ${entity.id} in Datenbank persistiert.") // --- PLAN B: Benachrichtigung an die Meldestelle (online-nennen@mo-code.at) senden --- + logger.info("Versuche Benachrichtigungs-Mail an $baseMailAddress zu senden...") try { val notification = SimpleMailMessage() notification.from = baseMailAddress // Mailserver erfordert oft, dass From == Username ist @@ -97,10 +98,11 @@ class MailController( mailSender.send(notification) logger.info("Plan-B Nennungs-Mail an die Meldestelle gesendet. Betreff: ${notification.subject}") } 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) --- + logger.info("Versuche Bestätigungs-Mail an ${request.email} zu senden...") try { val message = SimpleMailMessage() @@ -126,7 +128,7 @@ class MailController( mailSender.send(message) logger.info("Bestätigungs-Mail an ${request.email} gesendet.") } 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) } } diff --git a/docs/03_Journal/2026-04-23_Plan-B-Formulare.md b/docs/03_Journal/2026-04-23_Plan-B-Formulare.md index 00ae3aca..d3259161 100644 --- a/docs/03_Journal/2026-04-23_Plan-B-Formulare.md +++ b/docs/03_Journal/2026-04-23_Plan-B-Formulare.md @@ -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) - **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)**: - - **Frontend (`PlatformConfig.wasmJs.kt`)**: API-URLs von absolut (`https://api.mo-code.at`) 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. - - **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 auf v2026-04-23.27 aktualisiert. Dies ist die stabilste Architektur für Web-Apps. + - **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. diff --git a/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/presentation/web/OnlineNennungFormular.kt b/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/presentation/web/OnlineNennungFormular.kt index 63d6f3a8..a32cd5c1 100644 --- a/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/presentation/web/OnlineNennungFormular.kt +++ b/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/presentation/web/OnlineNennungFormular.kt @@ -401,7 +401,7 @@ fun OnlineNennungFormular( onNennenAbgeschickt(payload) { success, error -> isLoading = false 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.") } } } diff --git a/frontend/shells/meldestelle-web/src/wasmJsMain/kotlin/at/mocode/frontend/shell/web/WebMainScreen.kt b/frontend/shells/meldestelle-web/src/wasmJsMain/kotlin/at/mocode/frontend/shell/web/WebMainScreen.kt index d0e911ef..ed8f62eb 100644 --- a/frontend/shells/meldestelle-web/src/wasmJsMain/kotlin/at/mocode/frontend/shell/web/WebMainScreen.kt +++ b/frontend/shells/meldestelle-web/src/wasmJsMain/kotlin/at/mocode/frontend/shell/web/WebMainScreen.kt @@ -126,7 +126,7 @@ fun MainAppContent() { // Dezentraler Versions-Marker in der unteren rechten Ecke Box(modifier = Modifier.fillMaxSize().padding(8.dp), contentAlignment = Alignment.BottomEnd) { Text( - text = "v2026-04-23.28 - SAME-ORIGIN v2", + text = "v2026-04-23.30 - COMPILE FIX", style = MaterialTheme.typography.labelSmall, color = Color.LightGray.copy(alpha = 0.5f) )