chore: entferne AuthApiClient, AuthTokenManager und DeviceInitializationConfig.jvm, da diese nicht mehr benötigt werden

This commit is contained in:
Stefan Mogeritsch 2026-04-19 15:57:59 +02:00
parent dc66dfb537
commit 8a3ef98c44
36 changed files with 294 additions and 81 deletions

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings"> <component name="GradleSettings">
<option name="linkedExternalProjectsSettings"> <option name="linkedExternalProjectsSettings">
<GradleProjectSettings> <GradleProjectSettings>

View File

@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_25" project-jdk-name="openjdk-25" project-jdk-type="JavaSDK" /> <component name="ProjectRootManager" version="2" languageLevel="JDK_25" project-jdk-name="openjdk-25" project-jdk-type="JavaSDK" />

View File

@ -0,0 +1,37 @@
👷 **[Frontend Expert]**
**Verstanden. Ich nehme die Herausforderung an.**
Ich werde diesen Scan als **"Audit-Phase"** behandeln. Mein Ziel ist es, nicht nur ein Chaos-Dokument zu erstellen, sondern eine **"Architektur-Anleitung"**, die als Single Source of Truth für die zukünftige Entwicklung dient.
Hier ist mein Schlachtplan für die nächsten Schritte:
### 1. Der Scan (Aktueller Schritt)
Ich führe den Scan durch, um die Struktur jedes einzelnen Moduls zu erfassen. Ich werde die Pfade so mappen, dass ich genau sehe:
* **Modul-Name** (z.B. `features:login`)
* **Vorhandene Source-Sets** (`commonMain`, `jvmMain`, `wasmJsMain`)
* **Status** (Ist es ein "Standard-Modul" oder ein "Sonderfall"?)
### 2. Die Analyse (Die "Chaos-Matrix")
Aus den Rohdaten erstelle ich die **Chaos-Matrix**. Diese wird folgende Fragen beantworten:
* Welche Module folgen bereits einem Muster?
* Wo sind die "Inseln der Wildnis" (Module ohne jegliche Struktur)?
* Welche Abhängigkeiten (Gradle-Module) sind von der Struktur-Anpassung betroffen?
### 3. Die Architektur-Anleitung (Das Endprodukt)
Dies ist das Dokument, das Sie am Ende erhalten. Es wird kein bloßes Problem-Dokument sein, sondern ein **Blueprint**. Es wird enthalten:
* **Die "Golden Rule" der Modul-Struktur:** Die definierte Standard-Struktur für jedes neue Modul.
* **Die "Migration-Matrix":** Eine Liste aller existierenden Module mit der Anweisung: *"Modul X muss von Struktur A nach Struktur B migriert werden"*.
* **Das "Pattern-Library" Dokument:**
* Wie ein `feature`-Modul aufgebaut sein muss (mit `commonMain` und `jvmMain`).
* Wie ein `library`-Modul aufgebaut sein muss (rein `commonMain`).
* Wie ein `platform`-Modul aufgebaut sein muss (z.B. für Android oder Desktop-spezifische Erweiterungen).
* **Die "Definition of Done" (DoD) für neue Module:** Eine Checkliste, die ein Entwickler abhaken muss, bevor ein Modul als "fertig" gilt.
---
**Ich starte jetzt den Scan.**
*(Ich werde nach Abschluss des Scans und der Erstellung der Matrix sofort mit der Analyse beginnen.)*
`[Status: Running Structural Scan...]

View File

@ -0,0 +1,55 @@
# 🏗️ Module Architecture Blueprint
Dieses Dokument definiert die Architektur-Standards für das Projekt, um eine konsistente, skalierbare und wartbare Modulstruktur zu gewährleisten.
## 🎯 Kernziel
Etablierung einer klaren Trennung zwischen Geschäftslogik (Common) und Plattform-spezifischer Darstellung (JVM/Web), um die Wiederverwendbarkeit und Testbarkeit zu maximieren.
---
## 📂 Modultypen (Module Archetypes)
Jedes Modul im Projekt muss einer der folgenden drei Kategorien zugeordnet werden:
### 1. Core Modules (Type: `CORE`)
* **Zweck:** Rein geschäftliche Logik, Domain-Modelle, Use-Cases.
* **Struktur:** Ausschließlich `commonMain`. Keine Abhängigkeiten zu Plattform-spezifischen APIs.
* **Regel:** Darf keine Kenntnis über die UI oder Plattform-spezifische Frameworks haben.
### 2. Feature Modules (Type: `FEATURE`)
* **Zweck:** Implementierung einer spezifischen Benutzerfunktion (z.B. "Login", "Registration").
* **Struktur:** `commonMain` (Logik) + `jvmMain` / `jsMain` (UI/Integration).
* **Regel:** Nutzt `CORE`-Module. Darf nur über definierte Schnittstellen mit anderen `FEATURE`-Modulen kommunizieren.
### 3. Infrastructure/Adapter Modules (Type: `ADAPTER`)
* **Zweck:** Implementierung von Schnittstellen (z.B. API-Clients, Datenbank-Treiber, Bluetooth-Adapter).
* **Struktur:** Implementiert `expect`-Deklarationen aus `CORE` oder `FEATURE` mittels `actual`-Implementierungen.
* **Regel:** Versteckt die Komplexität der Plattform hinter einer saubbar definierten API.
---
## 🛠️ Strukturregeln (The Golden Rules)
### 📏 Rule 1: Dependency Direction
Abhängigkeiten dürfen **nur nach unten** fließen:
`FEATURE` $\rightarrow$ `CORE` $\rightarrow$ `ADAPTER` (Interfaces)
`FEATURE` $\rightarrow$ `ADAPTER` (Implementations)
**Verboten:** Ein `CORE`-Modul darf niemals ein `FEATURE`-Modul referenzieren.
### 🔄 Rule 2: The Expect/Actual Pattern
Um Plattform-spezifischen Code in `commonMain` nutzbar zu machen, ist das `expect/actual`-Pattern zwingend:
1. **Define** `expect class/function` in `commonMain`.
2. **Implement** `actual class/function` in `jvmMain` (Desktop) und `jsMain` (Web).
### 📦 Rule 3: Encapsulation
Module müssen ihre internen Implementierungen verbergen. Nur Klassen und Funktionen, die explizit für die Nutzung durch andere Module markiert sind (z.B. via `internal` Modifier), dürfen exportiert werden.
---
## 🚀 Deployment & Build
* **Build System:** Gradle.
* **Multiplatform:** Kotlin Multiplatform (KMP).
* **CI/CD Check:** Bei jedem Pull-Request wird die Einhardung der Abhängigkeitsrichtung durch ein Dependency-Analysis-Plugin geprüft.
---

View File

@ -0,0 +1,49 @@
# 🏗️ Modul-Struktur-Blueprint (Standard-Topologie)
**Status:** ARCHITECTURAL STANDARD
**Ziel:** Elimination von strukturellen Inkonsistenheiten (Kraut & Rüben)
**Prinzip:** Plug-and-Play Multiplatform-Komponenten
## 1. Die Modul-Klassifizierung (The Taxonomy)
Jedes Modul im Projekt **muss** einer der folgenden drei Klassen zugeordnet werden. Es gibt keine "unidentifizierten" Module mehr.
### 🟢 Klasse A: `CORE_LIBRARY`
* **Zweck:** Reine Geschäftslogik, Datenmodelle, Hilfsfunktionen (Utils).
* **Anforderung:** Besteht **ausschließlich** aus `src/commonMain`.
* **Einsatz:** Keine Plattform-spezifischen Abhängigkeiten erlaubt.
* **Beispiel:** `:core:database`, `:core:network-models`.
### 🔵 Klasse B: `UI_COMPONENT` (Der Standard)
* **Zweck:** Visuelle Features, Screens, interaktive Elemente.
* **Anforderung:** **Zwingende** Struktur:
* `src/commonMain` (Logik & Interface)
* `src/jvmMain` (Desktop-spezifische UI-Erweiterungen/Render-Strategie)
* `src/wasmJsMain` (Web-spezifische Render-Strategie)
* **Einsatz:** Das Standard-Modul für alle "Plug-and-Play" Features.
* **Beispiel:** `:features:auth`, `:features:import`, `:features:settings`.
### 🟡 Klasse C: `PLATFORM_ADAPTER`
* **Zweck:** Tiefe Integration von Hardware-APIs oder Plattform-spezifischem Code.
* **Anforderung:** Enthält hochgradig spezialisierten Code für eine einzige Plattform.
* **Beispiel:** `:platform:android-biometrics`.
---
## 2. Design-Regeln (The Golden Rules)
1. **The "Expect/Actual" Rule:** `expect`-Deklarationen gehören immer in den `commonMain`-Source-Set. `actual`-Implementierungen werden strikt in den jeweiligen Plattform-Source-Sets (`jvmMain`, `wasmJsMain`, etc.) platziert.
2. **The Dependency Rule:** Ein `commonMain`-Modul darf niemals eine Abhängigkeit zu einem Modul haben, das nur in `jvmMain` existiert. Abhängigkeiten müssen immer "nach unten" (zu `common`) oder "horizontal" (zu anderen `common`-Modulen) verlaufen.
3. **The Consistency Rule:** Ein Modul darf niemals "unvollständig" sein. Wenn ein Modul ein `jvmMain` hat, muss es auch ein `wasmJsMain` (oder zumindest die Infrastruktur dafür) vorbereitet haben, um die Plugin-Architektur nicht zu brechen.
---
## 3. Implementierungs-Checkliste (Migration Guide)
Wenn du ein neues Modul erstellst oder ein altes migrierst:
- [ ] Identifiziere die Klasse (A, B oder C).
- [ ] Erstelle die Verzeichnisstruktur gemäß der Klasse.
- [ ] Überprüfe die `build.gradle.kts` auf korrekte Source-Set-Konfiguration.
- [ ] Sicherstellen, dass alle `expect`-Funktionen durch `actual`-Implementierungen in allen Ziel-Plattformen abgedeckt sind.
- [ ] Teste die Kompilierung für alle Ziel-Plattformen (`./gradlew check`).

View File

@ -1,4 +1,6 @@
package at.mocode.frontend.core.auth.data package at.mocode.frontend.core.auth.data.local
import at.mocode.frontend.core.auth.data.remote.AuthApiClient
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
@ -117,7 +119,7 @@ class AuthTokenManager {
} }
/** /**
* Get current JWT token * Get the current JWT token
*/ */
fun getToken(): String? = currentToken fun getToken(): String? = currentToken
@ -147,7 +149,7 @@ class AuthTokenManager {
} }
/** /**
* Get user ID from token * Get user ID from a token
*/ */
fun getUserId(): String? = tokenPayload?.sub fun getUserId(): String? = tokenPayload?.sub

View File

@ -1,4 +1,6 @@
package at.mocode.frontend.core.auth.data package at.mocode.frontend.core.auth.data.remote
import at.mocode.frontend.core.auth.utils.PkceHelper
import at.mocode.frontend.core.domain.AppConstants import at.mocode.frontend.core.domain.AppConstants
import at.mocode.frontend.core.network.PlatformConfig import at.mocode.frontend.core.network.PlatformConfig

View File

@ -1,7 +1,7 @@
package at.mocode.frontend.core.auth.di package at.mocode.frontend.core.auth.di
import at.mocode.frontend.core.auth.data.AuthApiClient import at.mocode.frontend.core.auth.data.remote.AuthApiClient
import at.mocode.frontend.core.auth.data.AuthTokenManager import at.mocode.frontend.core.auth.data.local.AuthTokenManager
import at.mocode.frontend.core.auth.presentation.LoginViewModel import at.mocode.frontend.core.auth.presentation.LoginViewModel
import at.mocode.frontend.core.domain.AppConstants import at.mocode.frontend.core.domain.AppConstants
import at.mocode.frontend.core.network.TokenProvider import at.mocode.frontend.core.network.TokenProvider

View File

@ -1,4 +1,4 @@
package at.mocode.frontend.core.auth.data package at.mocode.frontend.core.auth.domain.service
/** /**
* Ergebnis eines OIDC-Callback-Empfangs (Authorization Code + State). * Ergebnis eines OIDC-Callback-Empfangs (Authorization Code + State).

View File

@ -2,7 +2,14 @@ package at.mocode.frontend.core.auth.presentation
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import at.mocode.frontend.core.auth.data.* import at.mocode.frontend.core.auth.data.local.AuthState
import at.mocode.frontend.core.auth.data.local.AuthTokenManager
import at.mocode.frontend.core.auth.data.remote.AuthApiClient
import at.mocode.frontend.core.auth.domain.service.OidcCallbackResult
import at.mocode.frontend.core.auth.domain.service.consumePendingOidcCallback
import at.mocode.frontend.core.auth.domain.service.getOidcRedirectUri
import at.mocode.frontend.core.auth.domain.service.launchOidcFlow
import at.mocode.frontend.core.auth.utils.PkceHelper
import at.mocode.frontend.core.domain.AppConstants import at.mocode.frontend.core.domain.AppConstants
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow

View File

@ -1,4 +1,4 @@
package at.mocode.frontend.core.auth.data package at.mocode.frontend.core.auth.utils
import kotlin.random.Random import kotlin.random.Random

View File

@ -1,6 +1,6 @@
@file:Suppress("REDUNDANT_CALL_OF_CONVERSION_METHOD") @file:Suppress("REDUNDANT_CALL_OF_CONVERSION_METHOD")
package at.mocode.frontend.core.auth.data package at.mocode.frontend.core.auth.utils
/** /**
* Reines Kotlin SHA-256 nach FIPS 180-4. * Reines Kotlin SHA-256 nach FIPS 180-4.

View File

@ -1,4 +1,4 @@
package at.mocode.frontend.core.auth.data package at.mocode.frontend.core.auth.domain.service
import com.sun.net.httpserver.HttpServer import com.sun.net.httpserver.HttpServer
import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CompletableDeferred
@ -8,6 +8,7 @@ import kotlinx.coroutines.withTimeoutOrNull
import java.awt.Desktop import java.awt.Desktop
import java.net.InetSocketAddress import java.net.InetSocketAddress
import java.net.URI import java.net.URI
import kotlin.time.Duration.Companion.milliseconds
/** /**
* JVM-Implementierung: öffnet den System-Browser und startet einen lokalen * JVM-Implementierung: öffnet den System-Browser und startet einen lokalen
@ -71,7 +72,7 @@ actual suspend fun launchOidcFlow(
} }
// Warten auf Callback (max. 5 Minuten) // Warten auf Callback (max. 5 Minuten)
return withTimeoutOrNull(5 * 60 * 1000L) { return withTimeoutOrNull((5 * 60 * 1000L).milliseconds) {
deferred.await() deferred.await()
} ?: run { } ?: run {
server.stop(0) server.stop(0)

View File

@ -1,4 +1,4 @@
package at.mocode.frontend.core.auth.data package at.mocode.frontend.core.auth.domain.service
/** /**
* Wasm-Implementierung für OIDC Redirect. * Wasm-Implementierung für OIDC Redirect.

View File

@ -1,6 +1,10 @@
@file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
package at.mocode.frontend.features.deviceinitialization.domain
package at.mocode.frontend.features.device.initialization.data.local
import at.mocode.frontend.features.device.initialization.domain.model.DeviceInitializationSettings
expect object DeviceInitializationSettingsManager { expect object DeviceInitializationSettingsManager {
fun saveSettings(settings: DeviceInitializationSettings) fun saveSettings(settings: DeviceInitializationSettings)

View File

@ -0,0 +1,13 @@
@file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
package at.mocode.frontend.features.device.initialization.di
import at.mocode.frontend.features.device.initialization.domain.model.DeviceInitializationSettings
import at.mocode.frontend.features.device.initialization.presentation.DeviceInitializationViewModel
import org.koin.dsl.module
val deviceInitializationModule = module {
factory { (onComplete: (DeviceInitializationSettings) -> Unit) ->
DeviceInitializationViewModel(get(), onComplete)
}
}

View File

@ -1,4 +1,9 @@
package at.mocode.frontend.features.deviceinitialization.domain @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
package at.mocode.frontend.features.device.initialization.domain
import at.mocode.frontend.features.device.initialization.domain.model.DeviceInitializationSettings
import at.mocode.frontend.features.device.initialization.domain.model.NetworkRole
/** /**
* Validierungslogik für den Geräte-Initialisierungs-Wizard. * Validierungslogik für den Geräte-Initialisierungs-Wizard.
@ -29,7 +34,6 @@ object DeviceInitializationValidator {
fun canContinue(settings: DeviceInitializationSettings): Boolean { fun canContinue(settings: DeviceInitializationSettings): Boolean {
val basicValid = isNameValid(settings.deviceName) && val basicValid = isNameValid(settings.deviceName) &&
isKeyValid(settings.sharedKey) && isKeyValid(settings.sharedKey) &&
(if (settings.networkRole == NetworkRole.MASTER) isBackupPathValid(settings.backupPath) else true) &&
isSyncIntervalValid(settings.syncInterval) isSyncIntervalValid(settings.syncInterval)
if (!basicValid) return false if (!basicValid) return false

View File

@ -1,4 +1,7 @@
package at.mocode.frontend.features.deviceinitialization.domain @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
package at.mocode.frontend.features.device.initialization.domain.model
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@ -1,4 +1,12 @@
package at.mocode.frontend.features.deviceinitialization.presentation @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
package at.mocode.frontend.features.device.initialization.presentation
import at.mocode.frontend.features.device.initialization.domain.model.DeviceInitializationSettings
import at.mocode.frontend.features.device.initialization.domain.model.NetworkRole
import at.mocode.frontend.features.device.initialization.domain.model.ExpectedClient
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
@ -20,7 +28,7 @@ import androidx.compose.ui.input.key.*
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import at.mocode.frontend.features.deviceinitialization.domain.DeviceInitializationValidator import at.mocode.frontend.features.device.initialization.domain.DeviceInitializationValidator
@Composable @Composable
fun DeviceInitializationScreen( fun DeviceInitializationScreen(

View File

@ -0,0 +1,19 @@
@file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
package at.mocode.frontend.features.device.initialization.presentation
import at.mocode.frontend.features.device.initialization.domain.model.DeviceInitializationSettings
import at.mocode.frontend.features.device.initialization.domain.model.NetworkRole
import at.mocode.frontend.features.device.initialization.domain.model.ExpectedClient
import at.mocode.frontend.core.network.discovery.DiscoveredService
data class DeviceInitializationUiState(
val currentStep: Int = 0,
val settings: DeviceInitializationSettings = DeviceInitializationSettings(),
val discoveredMasters: List<DiscoveredService> = emptyList(),
val isProcessing: Boolean = false,
val error: String? = null
)

View File

@ -1,11 +1,16 @@
package at.mocode.frontend.features.deviceinitialization.presentation @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
package at.mocode.frontend.features.device.initialization.presentation
import at.mocode.frontend.features.device.initialization.domain.model.DeviceInitializationSettings
import at.mocode.frontend.features.device.initialization.domain.model.NetworkRole
import at.mocode.frontend.features.device.initialization.domain.model.ExpectedClient
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import at.mocode.frontend.core.network.discovery.NetworkDiscoveryService import at.mocode.frontend.core.network.discovery.NetworkDiscoveryService
import at.mocode.frontend.features.deviceinitialization.domain.DeviceInitializationSettings
import at.mocode.frontend.features.deviceinitialization.domain.ExpectedClient
import at.mocode.frontend.features.deviceinitialization.domain.NetworkRole
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow

View File

@ -1,4 +1,12 @@
package at.mocode.frontend.features.deviceinitialization.presentation @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
package at.mocode.frontend.features.device.initialization.presentation
import at.mocode.frontend.features.device.initialization.domain.model.DeviceInitializationSettings
import at.mocode.frontend.features.device.initialization.domain.model.NetworkRole
import at.mocode.frontend.features.device.initialization.domain.model.ExpectedClient
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
@ -10,7 +18,6 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.input.key.* import androidx.compose.ui.input.key.*
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import at.mocode.frontend.features.deviceinitialization.domain.NetworkRole
@Composable @Composable
fun NetworkRoleSelector( fun NetworkRoleSelector(

View File

@ -1,10 +0,0 @@
package at.mocode.frontend.features.deviceinitialization.di
import at.mocode.frontend.features.deviceinitialization.presentation.DeviceInitializationViewModel
import org.koin.dsl.module
val deviceInitializationModule = module {
factory { (onComplete: (at.mocode.frontend.features.deviceinitialization.domain.DeviceInitializationSettings) -> Unit) ->
DeviceInitializationViewModel(get(), onComplete)
}
}

View File

@ -1,12 +0,0 @@
package at.mocode.frontend.features.deviceinitialization.presentation
import at.mocode.frontend.core.network.discovery.DiscoveredService
import at.mocode.frontend.features.deviceinitialization.domain.DeviceInitializationSettings
data class DeviceInitializationUiState(
val currentStep: Int = 0,
val settings: DeviceInitializationSettings = DeviceInitializationSettings(),
val discoveredMasters: List<DiscoveredService> = emptyList(),
val isProcessing: Boolean = false,
val error: String? = null
)

View File

@ -1,5 +1,9 @@
package at.mocode.frontend.features.deviceinitialization.domain @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
package at.mocode.frontend.features.device.initialization.data.local
import at.mocode.frontend.features.device.initialization.domain.DeviceInitializationValidator
import at.mocode.frontend.features.device.initialization.domain.model.DeviceInitializationSettings
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import java.io.File import java.io.File

View File

@ -1,4 +1,12 @@
package at.mocode.frontend.features.deviceinitialization.presentation @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
package at.mocode.frontend.features.device.initialization.presentation
import at.mocode.frontend.features.device.initialization.domain.model.DeviceInitializationSettings
import at.mocode.frontend.features.device.initialization.domain.model.NetworkRole
import at.mocode.frontend.features.device.initialization.domain.model.ExpectedClient
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
@ -29,8 +37,7 @@ import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import at.mocode.frontend.core.designsystem.components.MsEnumDropdown import at.mocode.frontend.core.designsystem.components.MsEnumDropdown
import at.mocode.frontend.features.deviceinitialization.domain.DeviceInitializationValidator import at.mocode.frontend.features.device.initialization.domain.DeviceInitializationValidator
import at.mocode.frontend.features.deviceinitialization.domain.NetworkRole
import java.io.File import java.io.File
import javax.swing.JFileChooser import javax.swing.JFileChooser
import javax.swing.UIManager import javax.swing.UIManager

View File

@ -1,7 +1,10 @@
@file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
package at.mocode.frontend.features.deviceinitialization.domain
package at.mocode.frontend.features.device.initialization.data.local
import at.mocode.frontend.features.device.initialization.domain.DeviceInitializationValidator
import at.mocode.frontend.features.device.initialization.domain.model.DeviceInitializationSettings
import kotlinx.browser.localStorage import kotlinx.browser.localStorage
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
@ -21,7 +24,7 @@ actual object DeviceInitializationSettingsManager {
actual fun loadSettings(): DeviceInitializationSettings? { actual fun loadSettings(): DeviceInitializationSettings? {
val content = localStorage.getItem(SETTINGS_KEY) ?: return null val content = localStorage.getItem(SETTINGS_KEY) ?: return null
return try { return try {
json.decodeFromString<DeviceInitializationSettings>(DeviceInitializationSettings.serializer(), content) json.decodeFromString(DeviceInitializationSettings.serializer(), content)
} catch (e: Exception) { } catch (e: Exception) {
println("Fehler beim Laden der Einstellungen (WasmJS): ${e.message}") println("Fehler beim Laden der Einstellungen (WasmJS): ${e.message}")
null null

View File

@ -1,4 +1,12 @@
package at.mocode.frontend.features.deviceinitialization.presentation @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
package at.mocode.frontend.features.device.initialization.presentation
import at.mocode.frontend.features.device.initialization.domain.model.DeviceInitializationSettings
import at.mocode.frontend.features.device.initialization.domain.model.NetworkRole
import at.mocode.frontend.features.device.initialization.domain.model.ExpectedClient
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@ -13,7 +21,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import at.mocode.frontend.features.deviceinitialization.domain.DeviceInitializationValidator import at.mocode.frontend.features.device.initialization.domain.DeviceInitializationValidator
@Composable @Composable
actual fun DeviceInitializationConfig( actual fun DeviceInitializationConfig(

View File

@ -1,6 +1,6 @@
package at.mocode.frontend.features.profile.data package at.mocode.frontend.features.profile.data
import at.mocode.frontend.core.auth.data.AuthTokenManager import at.mocode.frontend.core.auth.data.local.AuthTokenManager
import at.mocode.frontend.core.network.PlatformConfig import at.mocode.frontend.core.network.PlatformConfig
import io.ktor.client.* import io.ktor.client.*
import io.ktor.client.call.* import io.ktor.client.call.*

View File

@ -6,7 +6,7 @@ import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import at.mocode.core.domain.serialization.UuidSerializer import at.mocode.core.domain.serialization.UuidSerializer
import at.mocode.frontend.core.auth.data.AuthTokenManager import at.mocode.frontend.core.auth.data.local.AuthTokenManager
import at.mocode.frontend.core.domain.zns.ZnsImportProvider import at.mocode.frontend.core.domain.zns.ZnsImportProvider
import at.mocode.frontend.core.network.NetworkConfig import at.mocode.frontend.core.network.NetworkConfig
import io.ktor.client.* import io.ktor.client.*

View File

@ -5,7 +5,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import at.mocode.frontend.core.auth.data.AuthTokenManager import at.mocode.frontend.core.auth.data.local.AuthTokenManager
import at.mocode.frontend.core.domain.repository.MasterdataRepository import at.mocode.frontend.core.domain.repository.MasterdataRepository
import at.mocode.frontend.core.domain.zns.ZnsImportProvider import at.mocode.frontend.core.domain.zns.ZnsImportProvider
import at.mocode.frontend.core.domain.zns.ZnsImportState import at.mocode.frontend.core.domain.zns.ZnsImportState

View File

@ -2,11 +2,5 @@
"deviceName": "Meldestelle", "deviceName": "Meldestelle",
"sharedKey": "Password", "sharedKey": "Password",
"backupPath": "/mocode/meldestelle/docs/temp", "backupPath": "/mocode/meldestelle/docs/temp",
"networkRole": "MASTER", "networkRole": "MASTER"
"expectedClients": [
{
"name": "Richter-Turm",
"role": "RICHTER"
}
]
} }

View File

@ -10,12 +10,12 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import at.mocode.desktop.navigation.DesktopNavigationPort import at.mocode.desktop.navigation.DesktopNavigationPort
import at.mocode.desktop.screens.layout.DesktopMainLayout import at.mocode.desktop.screens.layout.DesktopMainLayout
import at.mocode.frontend.core.auth.data.AuthTokenManager import at.mocode.frontend.core.auth.data.local.AuthTokenManager
import at.mocode.frontend.core.auth.presentation.LoginScreen import at.mocode.frontend.core.auth.presentation.LoginScreen
import at.mocode.frontend.core.auth.presentation.LoginViewModel import at.mocode.frontend.core.auth.presentation.LoginViewModel
import at.mocode.frontend.core.designsystem.theme.AppTheme import at.mocode.frontend.core.designsystem.theme.AppTheme
import at.mocode.frontend.core.navigation.AppScreen import at.mocode.frontend.core.navigation.AppScreen
import at.mocode.frontend.features.deviceinitialization.domain.DeviceInitializationSettingsManager import at.mocode.frontend.features.device.initialization.data.local.DeviceInitializationSettingsManager
import org.koin.compose.koinInject import org.koin.compose.koinInject
import org.koin.compose.viewmodel.koinViewModel import org.koin.compose.viewmodel.koinViewModel

View File

@ -1,13 +1,13 @@
package at.mocode.desktop.di package at.mocode.desktop.di
import at.mocode.desktop.navigation.DesktopNavigationPort import at.mocode.desktop.navigation.DesktopNavigationPort
import at.mocode.frontend.core.auth.data.AuthTokenManager import at.mocode.desktop.repository.DesktopMasterdataRepository
import at.mocode.frontend.core.auth.data.local.AuthTokenManager
import at.mocode.frontend.core.domain.models.User import at.mocode.frontend.core.domain.models.User
import at.mocode.frontend.core.domain.repository.MasterdataRepository
import at.mocode.frontend.core.navigation.CurrentUserProvider import at.mocode.frontend.core.navigation.CurrentUserProvider
import at.mocode.frontend.core.navigation.DeepLinkHandler import at.mocode.frontend.core.navigation.DeepLinkHandler
import at.mocode.frontend.core.navigation.NavigationPort import at.mocode.frontend.core.navigation.NavigationPort
import at.mocode.desktop.repository.DesktopMasterdataRepository
import at.mocode.frontend.core.domain.repository.MasterdataRepository
import org.koin.dsl.module import org.koin.dsl.module
/** /**

View File

@ -12,7 +12,7 @@ import at.mocode.frontend.core.localdb.localDbModule
import at.mocode.frontend.core.network.networkModule import at.mocode.frontend.core.network.networkModule
import at.mocode.frontend.core.sync.di.syncModule import at.mocode.frontend.core.sync.di.syncModule
import at.mocode.frontend.features.billing.di.billingModule import at.mocode.frontend.features.billing.di.billingModule
import at.mocode.frontend.features.deviceinitialization.di.deviceInitializationModule import at.mocode.frontend.features.device.initialization.di.deviceInitializationModule
import at.mocode.frontend.features.nennung.di.nennungFeatureModule import at.mocode.frontend.features.nennung.di.nennungFeatureModule
import at.mocode.frontend.features.pferde.di.pferdeModule import at.mocode.frontend.features.pferde.di.pferdeModule
import at.mocode.frontend.features.profile.di.profileModule import at.mocode.frontend.features.profile.di.profileModule

View File

@ -25,9 +25,12 @@ import at.mocode.desktop.screens.management.VeranstalterDetail
import at.mocode.desktop.screens.management.VeranstalterVerwaltungScreen import at.mocode.desktop.screens.management.VeranstalterVerwaltungScreen
import at.mocode.desktop.screens.nennung.NennungsEingangScreen import at.mocode.desktop.screens.nennung.NennungsEingangScreen
import at.mocode.desktop.screens.profile.FunktionaerProfil import at.mocode.desktop.screens.profile.FunktionaerProfil
import at.mocode.desktop.screens.veranstaltung.* import at.mocode.desktop.screens.veranstaltung.VeranstaltungVerwaltung
import at.mocode.desktop.screens.veranstaltung.details.* import at.mocode.desktop.screens.veranstaltung.details.VeranstaltungKonfig
import at.mocode.desktop.screens.veranstaltung.wizards.* import at.mocode.desktop.screens.veranstaltung.details.VeranstaltungProfilScreen
import at.mocode.desktop.screens.veranstaltung.wizards.TurnierWizard
import at.mocode.desktop.screens.veranstaltung.wizards.VeranstalterAnlegenWizard
import at.mocode.frontend.core.auth.data.local.AuthTokenManager
import at.mocode.frontend.core.designsystem.theme.AppColors import at.mocode.frontend.core.designsystem.theme.AppColors
import at.mocode.frontend.core.designsystem.theme.Dimens import at.mocode.frontend.core.designsystem.theme.Dimens
import at.mocode.frontend.core.domain.zns.ZnsImportProvider import at.mocode.frontend.core.domain.zns.ZnsImportProvider
@ -36,12 +39,12 @@ import at.mocode.frontend.core.network.ConnectivityTracker
import at.mocode.frontend.core.network.discovery.NetworkDiscoveryService import at.mocode.frontend.core.network.discovery.NetworkDiscoveryService
import at.mocode.frontend.features.billing.presentation.BillingScreen import at.mocode.frontend.features.billing.presentation.BillingScreen
import at.mocode.frontend.features.billing.presentation.BillingViewModel import at.mocode.frontend.features.billing.presentation.BillingViewModel
import at.mocode.frontend.features.deviceinitialization.domain.DeviceInitializationSettings import at.mocode.frontend.features.device.initialization.data.local.DeviceInitializationSettingsManager
import at.mocode.frontend.features.deviceinitialization.domain.DeviceInitializationSettingsManager import at.mocode.frontend.features.device.initialization.domain.model.DeviceInitializationSettings
import at.mocode.frontend.features.deviceinitialization.presentation.DeviceInitializationScreen import at.mocode.frontend.features.device.initialization.presentation.DeviceInitializationScreen
import at.mocode.frontend.features.deviceinitialization.presentation.DeviceInitializationViewModel import at.mocode.frontend.features.device.initialization.presentation.DeviceInitializationViewModel
import at.mocode.frontend.features.nennung.presentation.NennungViewModel
import at.mocode.frontend.features.nennung.presentation.NennungManagementScreen import at.mocode.frontend.features.nennung.presentation.NennungManagementScreen
import at.mocode.frontend.features.nennung.presentation.NennungViewModel
import at.mocode.frontend.features.pferde.presentation.PferdeScreen import at.mocode.frontend.features.pferde.presentation.PferdeScreen
import at.mocode.frontend.features.pferde.presentation.PferdeViewModel import at.mocode.frontend.features.pferde.presentation.PferdeViewModel
import at.mocode.frontend.features.profile.presentation.ProfileScreen import at.mocode.frontend.features.profile.presentation.ProfileScreen
@ -535,7 +538,7 @@ private fun DesktopContentArea(
DeviceInitializationSettingsManager.saveSettings(finalSettings) DeviceInitializationSettingsManager.saveSettings(finalSettings)
// Vision_04: Sicherheitsschlüssel als Token setzen, damit Cloud-Suche funktioniert // Vision_04: Sicherheitsschlüssel als Token setzen, damit Cloud-Suche funktioniert
val authTokenManager = val authTokenManager =
org.koin.core.context.GlobalContext.get().get<at.mocode.frontend.core.auth.data.AuthTokenManager>() org.koin.core.context.GlobalContext.get().get<AuthTokenManager>()
authTokenManager.setToken(finalSettings.sharedKey) authTokenManager.setToken(finalSettings.sharedKey)
onSettingsChange(finalSettings) onSettingsChange(finalSettings)
onNavigate(AppScreen.VeranstaltungVerwaltung) onNavigate(AppScreen.VeranstaltungVerwaltung)