refactor(web): Komplettumstellung auf WASM, Altlasten aus Gradle und Architektur-Tests entfernt
Desktop CI — Headless Tests & Build / Compose Desktop — Tests (headless) & Build (push) Has been cancelled
Build and Publish Docker Images / build-and-push (., backend/infrastructure/gateway/Dockerfile, api-gateway, api-gateway) (push) Has been cancelled
Build and Publish Docker Images / build-and-push (., backend/services/ping/Dockerfile, ping-service, ping-service) (push) Has been cancelled
Build and Publish Docker Images / build-and-push (., config/docker/caddy/web-app/Dockerfile, web-app, web-app) (push) Has been cancelled
Build and Publish Docker Images / build-and-push (., config/docker/keycloak/Dockerfile, keycloak, keycloak) (push) Has been cancelled
Desktop CI — Headless Tests & Build / Compose Desktop — Tests (headless) & Build (push) Has been cancelled
Build and Publish Docker Images / build-and-push (., backend/infrastructure/gateway/Dockerfile, api-gateway, api-gateway) (push) Has been cancelled
Build and Publish Docker Images / build-and-push (., backend/services/ping/Dockerfile, ping-service, ping-service) (push) Has been cancelled
Build and Publish Docker Images / build-and-push (., config/docker/caddy/web-app/Dockerfile, web-app, web-app) (push) Has been cancelled
Build and Publish Docker Images / build-and-push (., config/docker/keycloak/Dockerfile, keycloak, keycloak) (push) Has been cancelled
Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
# Journal: Korrektur Architecture-Tests & Build-Stabilisierung
|
||||
|
||||
**Datum:** 18. April 2026
|
||||
**Badge:** 🏗️ [Lead Architect] & 🧐 [QA Specialist]
|
||||
|
||||
## 🛡️ Status Quo: Build-Fehler nach WASM-Transition
|
||||
|
||||
Nach der vollständigen Umstellung der `meldestelle-web` Shell auf ein reines `wasmJs`-Target schlug der Gesamt-Build
|
||||
fehl. Das Modul `platform:architecture-tests` konnte die Abhängigkeit zur Web-Shell nicht mehr auflösen, da es als
|
||||
JVM-Modul konzipiert ist und eine kompatible Java-Variante der Shell erwartete.
|
||||
|
||||
## 🛠️ Durchgeführte Maßnahmen
|
||||
|
||||
### 1. Korrektur der Architecture-Tests
|
||||
|
||||
* **Problem:** ArchUnit (das für die Architektur-Tests verwendet wird) ist eine JVM-Bibliothek. Da die `meldestelle-web`
|
||||
Shell nun kein JVM-Target mehr besitzt, kann sie nicht in diesen Test-Zyklus eingebunden werden.
|
||||
* **Lösung:** Die Abhängigkeit zu `projects.frontend.shells.meldestelleWeb` wurde in
|
||||
`platform/architecture-tests/build.gradle.kts` auskommentiert/entfernt.
|
||||
* **Begründung:** Die Web-Shell enthält primär Entry-Point-Logik für den Browser. Die fachliche Architektur (Features,
|
||||
Core, Domain) wird weiterhin über die anderen Modul-Abhängigkeiten geprüft.
|
||||
|
||||
### 2. Synchronisation der WASM-Infrastruktur
|
||||
|
||||
* **Aktion:** Durchführung von `./gradlew kotlinWasmUpgradeYarnLock`.
|
||||
* **Ergebnis:** Die `yarn.lock` wurde an die neuen Target-Konfigurationen angepasst, was den Fehler
|
||||
`kotlinWasmStoreYarnLock` behob.
|
||||
|
||||
## ✅ Verifizierung
|
||||
|
||||
* `./gradlew clean :platform:architecture-tests:test`: **Erfolgreich**. Die Architektur-Tests für die verbleibenden
|
||||
JVM-kompatiblen Module (Desktop, Core, Features) laufen grün durch.
|
||||
* `./gradlew clean build`: **Erfolgreich**. Der gesamte Projekt-Build (700+ Tasks) läuft ohne Fehler durch.
|
||||
|
||||
## 🚀 Fazit
|
||||
|
||||
Die architektonische Härtung (JVM für Desktop, WASM für Web) ist nun auch in der Build-Infrastruktur und den
|
||||
Qualitäts-Checks (ArchUnit) konsistent abgebildet.
|
||||
|
||||
---
|
||||
🧹 **[Curator]**: Dokumentiert als finaler Fix der WASM-Transition-Phase.
|
||||
@@ -0,0 +1,47 @@
|
||||
# Session Journal: 18. April 2026 (Abschluss WASM-Transition & Onboarding-Refactoring)
|
||||
|
||||
## 🏗️ [Lead Architect] Status-Bericht
|
||||
|
||||
Diese Session markiert den Abschluss der **"Total WASM Transition"**. Wir haben das Projekt von der technischen Schuld
|
||||
redundanter JS-Targets befreit und die Architektur auf **JVM (Desktop)** und **wasmJs (Web)** gehärtet. Parallel dazu
|
||||
wurde das Onboarding in das neue Plug-and-Play Modul `device-initialization` (ADR-0024) überführt.
|
||||
|
||||
### 🛡️ Verifizierte Fakten (Stand: 18.04.2026, 15:45 Uhr)
|
||||
|
||||
1. **Plattform-Konsolidierung:**
|
||||
* `js(IR)` Targets aus allen Modulen (Core, Features, Contracts, Shells) entfernt.
|
||||
* Alle `src/jsMain/` und `src/jsTest/` Verzeichnisse wurden gelöscht.
|
||||
* Der Build läuft nun ohne "Unresolved platforms: [js]" Fehler durch.
|
||||
2. **Shell-Härtung:**
|
||||
* `meldestelle-desktop`: Reines JVM-Modul (WASM entfernt).
|
||||
* `meldestelle-web`: Reines WASM-Modul (JVM entfernt).
|
||||
* Die Web-Shell startet wieder direkt mit der Landing-Page (Veranstaltungs-Cards), ohne das Desktop-Onboarding-Gate.
|
||||
3. **Onboarding (Geräte-Initialisierung):**
|
||||
* Neues Modul `device-initialization` ist aktiv.
|
||||
* ViewModel-basierte Logik (StateFlow) implementiert.
|
||||
* Domain-Sprache auf "Geräte-Initialisierung" vereinheitlicht.
|
||||
4. **Build-Stabilität:**
|
||||
* `platform:architecture-tests` für WASM-Kompatibilität angepasst (reine WASM-Shells werden ignoriert).
|
||||
* `yarn.lock` für die neue WASM-Infrastruktur synchronisiert.
|
||||
* `./gradlew clean build` ist erfolgreich (700+ Tasks).
|
||||
|
||||
---
|
||||
|
||||
## 🧹 [Curator] Artefakte & Dokumentation
|
||||
|
||||
Folgende Dokumente wurden in dieser Session erstellt/aktualisiert:
|
||||
|
||||
* **Roadmap:** `docs/01_Architecture/MASTER_ROADMAP.md` (Phase 14: WASM Transition abgeschlossen).
|
||||
* **Journal:** `docs/99_Journal/2026-04-18_WASM-Transition-Welle-1-3_Abschluss.md` (Technisches Log).
|
||||
* **Journal:** `docs/99_Journal/2026-04-18_DeviceInitialization-PlugAndPlay.md` (Refactoring Log).
|
||||
* **Journal:** `docs/99_Journal/2026-04-18_Web-Shell-Korrektur-Fokus.md` (Recovery Log).
|
||||
* **Journal:** `docs/99_Journal/2026-04-18_Final-Shell-Hardening.md` (Target-Hardening Log).
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Nächster Fokus
|
||||
|
||||
Die Architektur ist nun "sauber". In der nächsten Session können wir mit der fachlichen Wiederherstellung der restlichen
|
||||
Module (Turnier-Feature, Nennung-Feature) auf Basis der neuen Plug-and-Play Struktur fortfahren.
|
||||
|
||||
**Session beendet.** 🫡
|
||||
@@ -0,0 +1,41 @@
|
||||
# Journal: Korrektur Web-Shell (Fokus-Wiederherstellung)
|
||||
|
||||
**Datum:** 18. April 2026
|
||||
**Agent:** 🏗️ [Lead Architect]
|
||||
|
||||
## 🛡️ Analyse: Fehlgeleitete Implementierung
|
||||
|
||||
Nach einer kritischen Überprüfung wurde festgestellt, dass die vorherige "Recovery" der Web-Shell fälschlicherweise
|
||||
Desktop-Paradigmen (Geräte-Initialisierung) in die Web-App erzwungen hat. Dies widerspricht der fachlichen Ausrichtung
|
||||
der Web-Shell (Online-Nennungen für Reiter).
|
||||
|
||||
## 🚀 Korrektur-Maßnahmen
|
||||
|
||||
### 1. Architektur-Bereinigung
|
||||
|
||||
- **Gradle:** Entfernung des `jvm()` Targets aus `meldestelle-web/build.gradle.kts`. Die Shell ist nun ein reines
|
||||
WASM-Projekt.
|
||||
- **Dependencies:** Entfernung des `device-initialization` Moduls. Web-Nutzer benötigen keine lokale
|
||||
Geräte-Konfiguration oder mDNS-Discovery.
|
||||
|
||||
### 2. UI-Rückbau (Landing-Page Fokus)
|
||||
|
||||
- **WebMainScreen.kt:** Das künstliche `isConfigured`-Gate wurde entfernt.
|
||||
- **Status:** Die App startet nun wieder direkt mit der `LandingPage` (Begrüßung und Veranstaltungs-Cards für Neumarkt).
|
||||
- **Cleanup:** Entfernung ungenutzter Imports und redundanter Koin-Parameter.
|
||||
|
||||
### 3. Koin-Setup
|
||||
|
||||
- Bereinigung der `main.kt` (Entfernung des `deviceInitializationModule`).
|
||||
|
||||
## ✅ Verifizierung
|
||||
|
||||
- `./gradlew :frontend:shells:meldestelle-web:compileKotlinWasmJs -PenableWasm=true` abgeschlossen mit **BUILD
|
||||
SUCCESSFUL**.
|
||||
- Manuelle Prüfung der Dateistruktur: Keine Desktop-Artefakte mehr in der Web-Shell.
|
||||
|
||||
## 🧹 [Curator] Fazit
|
||||
|
||||
Die Web-Shell wurde erfolgreich von "eigensinnigen" Fehlentscheidungen bereinigt und auf ihren fachlichen Kern (
|
||||
Landing-Page & Nennungs-Workflow) zurückgeführt. Die architektonische Trennung zwischen Desktop-Zentrale (mit
|
||||
Onboarding) und Web-Client ist wiederhergestellt.
|
||||
@@ -1,7 +1,4 @@
|
||||
@file:OptIn(ExperimentalWasmDsl::class)
|
||||
|
||||
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
|
||||
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
@@ -24,7 +21,6 @@ plugins {
|
||||
alias(libs.plugins.composeCompiler)
|
||||
alias(libs.plugins.composeMultiplatform)
|
||||
alias(libs.plugins.kotlinSerialization)
|
||||
// id("org.jetbrains.compose.hot-reload")
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
@@ -42,15 +38,6 @@ val packageVer = "$vMajor.$vMinor.$vPatch"
|
||||
kotlin {
|
||||
jvm()
|
||||
|
||||
wasmJs {
|
||||
binaries.library()
|
||||
browser {
|
||||
testTask {
|
||||
enabled = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
jvmMain.dependencies {
|
||||
// Core-Module
|
||||
|
||||
@@ -9,12 +9,8 @@ plugins {
|
||||
alias(libs.plugins.kotlinSerialization)
|
||||
}
|
||||
|
||||
val isWasmEnabled = findProperty("enableWasm")?.toString()?.toBoolean() ?: false
|
||||
|
||||
kotlin {
|
||||
jvm()
|
||||
|
||||
if (isWasmEnabled) {
|
||||
wasmJs {
|
||||
browser {
|
||||
testTask {
|
||||
@@ -23,12 +19,10 @@ kotlin {
|
||||
}
|
||||
binaries.executable()
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
commonMain.dependencies {}
|
||||
|
||||
if (isWasmEnabled) {
|
||||
wasmJsMain.dependencies {
|
||||
// Core-Module
|
||||
implementation(projects.frontend.core.domain)
|
||||
@@ -67,4 +61,3 @@ kotlin {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+28
-5
@@ -21,9 +21,14 @@ import kotlinx.coroutines.launch
|
||||
import org.koin.compose.koinInject
|
||||
import org.koin.compose.viewmodel.koinViewModel
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
fun WebMainScreen() {
|
||||
MainAppContent()
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
fun MainAppContent() {
|
||||
val billingViewModel: BillingViewModel = koinViewModel()
|
||||
val nennungRepository: NennungRemoteRepository = koinInject()
|
||||
val scope = rememberCoroutineScope()
|
||||
@@ -50,6 +55,7 @@ fun WebMainScreen() {
|
||||
currentScreen = WebScreen.Nennung(vId, tId)
|
||||
}
|
||||
)
|
||||
|
||||
is WebScreen.Nennung -> OnlineNennungFormular(
|
||||
turnierNr = screen.turnierId.toString(),
|
||||
onNennenAbgeschickt = { payload ->
|
||||
@@ -65,6 +71,7 @@ fun WebMainScreen() {
|
||||
},
|
||||
onBack = { currentScreen = WebScreen.Landing }
|
||||
)
|
||||
|
||||
is WebScreen.Erfolg -> Erfolgsscreen(
|
||||
email = screen.email,
|
||||
onBack = { currentScreen = WebScreen.Landing }
|
||||
@@ -88,7 +95,11 @@ fun Erfolgsscreen(email: String, onBack: () -> Unit) {
|
||||
modifier = Modifier.fillMaxWidth().padding(16.dp)
|
||||
) {
|
||||
Column(modifier = Modifier.padding(24.dp), horizontalAlignment = Alignment.CenterHorizontally) {
|
||||
Text("Nennung erfolgreich eingegangen!", style = MaterialTheme.typography.headlineSmall, fontWeight = FontWeight.Bold)
|
||||
Text(
|
||||
"Nennung erfolgreich eingegangen!",
|
||||
style = MaterialTheme.typography.headlineSmall,
|
||||
fontWeight = FontWeight.Bold
|
||||
)
|
||||
Spacer(Modifier.height(16.dp))
|
||||
Text("Eine Bestätigungsmail wurde an $email gesendet.", style = MaterialTheme.typography.bodyLarge)
|
||||
Spacer(Modifier.height(24.dp))
|
||||
@@ -167,11 +178,19 @@ fun VeranstaltungsCardWeb(
|
||||
) {
|
||||
Column(modifier = Modifier.padding(16.dp)) {
|
||||
Text(veranstaltung.name, style = MaterialTheme.typography.headlineSmall, fontWeight = FontWeight.Bold)
|
||||
Text("${veranstaltung.datum} | ${veranstaltung.ort}", style = MaterialTheme.typography.bodyMedium, color = Color.Gray)
|
||||
Text(
|
||||
"${veranstaltung.datum} | ${veranstaltung.ort}",
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
color = Color.Gray
|
||||
)
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
|
||||
Text("Turniere dieser Veranstaltung:", style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.SemiBold)
|
||||
Text(
|
||||
"Turniere dieser Veranstaltung:",
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
fontWeight = FontWeight.SemiBold
|
||||
)
|
||||
|
||||
veranstaltung.turniere.forEach { turnier ->
|
||||
TurnierCardWeb(
|
||||
@@ -326,7 +345,11 @@ fun NennungWebFormular(
|
||||
}
|
||||
|
||||
if (uiState.pdfData != null) {
|
||||
Text("PDF generiert (${uiState.pdfData!!.size} Bytes)", style = MaterialTheme.typography.labelSmall, modifier = Modifier.padding(top = 4.dp))
|
||||
Text(
|
||||
"PDF generiert (${uiState.pdfData!!.size} Bytes)",
|
||||
style = MaterialTheme.typography.labelSmall,
|
||||
modifier = Modifier.padding(top = 4.dp)
|
||||
)
|
||||
}
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
|
||||
@@ -2,6 +2,7 @@ package at.mocode.web
|
||||
|
||||
import androidx.compose.ui.ExperimentalComposeUiApi
|
||||
import androidx.compose.ui.window.ComposeViewport
|
||||
import at.mocode.frontend.core.auth.di.authModule
|
||||
import at.mocode.frontend.core.designsystem.theme.AppTheme
|
||||
import at.mocode.frontend.core.network.networkModule
|
||||
import at.mocode.frontend.features.billing.di.billingModule
|
||||
@@ -14,6 +15,7 @@ fun main() {
|
||||
startKoin {
|
||||
modules(
|
||||
networkModule,
|
||||
authModule,
|
||||
billingModule,
|
||||
nennungFeatureModule,
|
||||
turnierFeatureModule,
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
overflow: hidden;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
#compose-target {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
@@ -39,5 +39,5 @@ dependencies {
|
||||
implementation(projects.frontend.core.sync)
|
||||
|
||||
implementation(projects.frontend.shells.meldestelleDesktop)
|
||||
implementation(projects.frontend.shells.meldestelleWeb)
|
||||
// implementation(projects.frontend.shells.meldestelleWeb) // WASM-only modules cannot be tested with ArchUnit (JVM-only)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user