diff --git a/config/docker/caddy/web-app/Caddyfile b/config/docker/caddy/web-app/Caddyfile index 8c6f68f8..5ea67c25 100644 --- a/config/docker/caddy/web-app/Caddyfile +++ b/config/docker/caddy/web-app/Caddyfile @@ -20,18 +20,19 @@ # Same-Origin Strategy: Alle /api/* Anfragen werden intern an den Mail-Service weitergeleitet # Dadurch sieht der Browser nur noch app.mo-code.at und CORS wird hinfällig. handle /api/* { - # Wir entfernen das /api Präfix bevor wir es an den Service weitergeben - uri strip_prefix /api + # Wir leiten direkt weiter, der mail-service erwartet /api/mail/... + reverse_proxy mail-service:8085 { + header_up Host {upstream_hostport} + header_up X-Real-IP {remote_host} + header_up X-Forwarded-For {remote_host} + } - # CORS Header zur Sicherheit trotzdem mitsenden (Nuclear Option v3) header { Access-Control-Allow-Origin "*" Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" Access-Control-Allow-Headers "*" - X-Caddy-Strategy "same-origin-v27" + X-Caddy-Strategy "same-origin-v28" } - - reverse_proxy mail-service:8085 } handle /health { diff --git a/frontend/core/network/src/wasmJsMain/kotlin/at/mocode/frontend/core/network/PlatformConfig.wasmJs.kt b/frontend/core/network/src/wasmJsMain/kotlin/at/mocode/frontend/core/network/PlatformConfig.wasmJs.kt index 1c2bc4b9..7b03dce1 100644 --- a/frontend/core/network/src/wasmJsMain/kotlin/at/mocode/frontend/core/network/PlatformConfig.wasmJs.kt +++ b/frontend/core/network/src/wasmJsMain/kotlin/at/mocode/frontend/core/network/PlatformConfig.wasmJs.kt @@ -7,8 +7,8 @@ package at.mocode.frontend.core.network @Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") actual object PlatformConfig { actual fun resolveMailServiceUrl(): String { - // SAME-ORIGIN Strategy: Use relative path to bypass CORS - return "/api" + // SAME-ORIGIN Strategy: Use root for proxying + return "" } actual fun resolveKeycloakUrl(): String { @@ -20,8 +20,8 @@ actual object PlatformConfig { } actual fun resolveApiBaseUrl(): String { - // SAME-ORIGIN Strategy: Use relative path to bypass CORS - return "/api" + // SAME-ORIGIN Strategy: Use root for proxying + return "" } } diff --git a/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/domain/NennungRemoteRepository.kt b/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/domain/NennungRemoteRepository.kt index 201c4d58..794f7252 100644 --- a/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/domain/NennungRemoteRepository.kt +++ b/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/domain/NennungRemoteRepository.kt @@ -92,11 +92,21 @@ class NennungRemoteRepository(private val client: HttpClient) { ) // Wir senden an den mail-service (URL dynamisch aufgelöst) - client.post("$mailServiceUrl/api/mail/nennung") { + val fullUrl = "$mailServiceUrl/api/mail/nennung" + println("Sende Nennung an URL: $fullUrl") + + val response = client.post(fullUrl) { contentType(ContentType.Application.Json) setBody(request) } - Result.success(Unit) + + if (response.status.isSuccess()) { + Result.success(Unit) + } else { + val errorText = "Server meldet Fehler: ${response.status.value} ${response.status.description}" + println(errorText) + Result.failure(Exception(errorText)) + } } catch (e: Exception) { Result.failure(e) } 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 980ac2e0..63d6f3a8 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 = error ?: "Ein unbekannter Fehler ist aufgetreten." + errorMessage = "Senden fehlgeschlagen: " + (error ?: "Netzwerkfehler oder Server nicht erreichbar.") } } } @@ -443,7 +443,7 @@ fun OnlineNennungFormular( onNennenAbgeschickt(payload) { success, error -> isLoading = false if (!success) { - errorMessage = error ?: "Ein unbekannter Fehler ist aufgetreten." + errorMessage = "Senden fehlgeschlagen: " + (error ?: "Netzwerkfehler oder Server nicht erreichbar.") } } }, 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 714cd577..d0e911ef 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.27 - SAME-ORIGIN PROXY", + text = "v2026-04-23.28 - SAME-ORIGIN v2", style = MaterialTheme.typography.labelSmall, color = Color.LightGray.copy(alpha = 0.5f) )