From 255343145d16e1dc3a7798497bf73d2126bd7574 Mon Sep 17 00:00:00 2001 From: StefanMoCoAt Date: Wed, 22 Apr 2026 16:01:49 +0200 Subject: [PATCH] ### feat: optimiere Architektur und verbessere E-Mail-Handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - **ArchTests:** Passe Slices-Matching für `FrontendArchitectureTest` an Package-Struktur an. - **Mail-Service:** Füge Plan-B-Benachrichtigung für Nennungen an Meldestelle hinzu; entferne Plus-Addressing (Fallback). - **Build:** Deaktiviere Desktop-Build standardmäßig (`enableDesktop=false`) und mache Module-Registrierung optional. --- .../mocode/mail/service/api/MailController.kt | 54 ++++++++++++------- gradle.properties | 1 + platform/architecture-tests/build.gradle.kts | 2 +- .../archtests/FrontendArchitectureTest.kt | 4 +- settings.gradle.kts | 5 +- 5 files changed, 44 insertions(+), 22 deletions(-) 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 ecaba5e3..6e52b7e4 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,19 +71,43 @@ class MailController( nennungRepository.save(entity) logger.info("Nennung ${entity.id} in Datenbank persistiert.") - // Bestätigung an Reiter senden + // --- PLAN B: Benachrichtigung an die Meldestelle (online-nennen@mo-code.at) senden --- + try { + val notification = SimpleMailMessage() + notification.from = baseMailAddress // Mailserver erfordert oft, dass From == Username ist + notification.setTo(baseMailAddress) // Wir senden es an uns selbst + // WICHTIG: Die Turniernummer im Betreff für das einfache Mail-Filtering! + notification.subject = "[NENNUNG] Turnier ${request.turnierNr} - ${request.vorname} ${request.nachname}" + + val textBody = buildString { + appendLine("Neue Online-Nennung eingegangen!") + appendLine("----------------------------------") + appendLine("Turnier: ${request.turnierNr}") + appendLine("Reiter: ${request.vorname} ${request.nachname}") + appendLine("Lizenz: ${request.lizenz}") + appendLine("Pferd: ${request.pferdName} (Alter: ${request.pferdAlter})") + appendLine("E-Mail: ${request.email}") + appendLine("Telefon: ${request.telefon ?: "-"}") + appendLine("Bewerbe: ${request.bewerbe}") + appendLine("Bemerkungen: ${request.bemerkungen ?: "-"}") + appendLine("----------------------------------") + appendLine("System-ID: ${entity.id}") + } + notification.text = textBody + + 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}") + } + + // --- Ursprüngliche Bestätigung an den Reiter (optional, bleibt vorerst erhalten) --- try { val message = SimpleMailMessage() - // Dynamische Absenderadresse mit Plus-Addressing (z.B. online-nennen+26128@mo-code.at) - val dynamicFrom = try { - val (user, domain) = baseMailAddress.split("@") - "$user+${request.turnierNr}@$domain" - } catch (_: Exception) { - baseMailAddress - } - - message.from = dynamicFrom + // PLAN B Fallback: Kein Plus-Addressing, da World4You es nicht unterstützt + // Wir verwenden als Absender einfach die Basis-Adresse + message.from = baseMailAddress message.setTo(request.email) message.subject = "Bestätigung: Ihre Online-Nennung für Turnier ${request.turnierNr}" message.text = """ @@ -133,14 +157,8 @@ class MailController( @RequestParam nachname: String ) { val message = SimpleMailMessage() - val dynamicFrom = try { - val (user, domain) = baseMailAddress.split("@") - "$user+$turnierNr@$domain" - } catch (_: Exception) { - baseMailAddress - } - - message.from = dynamicFrom + // PLAN B Fallback: Kein Plus-Addressing + message.from = baseMailAddress message.setTo(email) message.subject = "Bestätigung: Nennung für Turnier $turnierNr manuell übernommen" message.text = """ diff --git a/gradle.properties b/gradle.properties index e9d42f39..4e8dff48 100644 --- a/gradle.properties +++ b/gradle.properties @@ -74,6 +74,7 @@ dev.port.offset=0 # Setze enableWasm=true, um die Web-App zu bauen oder Web-spezifische # Module zu testen. Default=false spart massiv Zeit beim Desktop-Build. enableWasm=true +enableDesktop=false # Dokka Gradle plugin V2 mode (with helpers for V1 compatibility) # See https://kotl.in/dokka-gradle-migration diff --git a/platform/architecture-tests/build.gradle.kts b/platform/architecture-tests/build.gradle.kts index f68fa3db..7d20f76f 100644 --- a/platform/architecture-tests/build.gradle.kts +++ b/platform/architecture-tests/build.gradle.kts @@ -38,6 +38,6 @@ dependencies { implementation(projects.frontend.core.localDb) implementation(projects.frontend.core.sync) - implementation(projects.frontend.shells.meldestelleDesktop) + // implementation(projects.frontend.shells.meldestelleDesktop) // Temporarily disabled while desktop build is disabled // implementation(projects.frontend.shells.meldestelleWeb) // WASM-only modules cannot be tested with ArchUnit (JVM-only) } diff --git a/platform/architecture-tests/src/test/kotlin/at/mocode/archtests/FrontendArchitectureTest.kt b/platform/architecture-tests/src/test/kotlin/at/mocode/archtests/FrontendArchitectureTest.kt index 88e30f9f..1792eee8 100644 --- a/platform/architecture-tests/src/test/kotlin/at/mocode/archtests/FrontendArchitectureTest.kt +++ b/platform/architecture-tests/src/test/kotlin/at/mocode/archtests/FrontendArchitectureTest.kt @@ -11,9 +11,9 @@ class FrontendArchitectureTest { @ArchTest fun `feature modules should not depend on each other`(importedClasses: JavaClasses) { - // The pattern must match the actual package structure, e.g., 'at.mocode.ping.feature' + // The pattern must match the actual package structure, e.g., 'at.mocode.frontend.features.(*)..' slices() - .matching("at.mocode.(*).feature..") + .matching("at.mocode.frontend.features.(*)..") .should().notDependOnEachOther() .check(importedClasses) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 09343bb7..dd8d12a3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -160,7 +160,10 @@ include(":frontend:features:billing-feature") include(":frontend:features:device-initialization") // --- SHELLS --- -include(":frontend:shells:meldestelle-desktop") +val enableDesktop = providers.gradleProperty("enableDesktop").getOrElse("true").toBoolean() +if (enableDesktop) { + include(":frontend:shells:meldestelle-desktop") +} include(":frontend:shells:meldestelle-web") // ==========================================================================