refactor: Migrate from monolithic to modular architecture
1. **Docker-Compose für Entwicklung optimieren** 2. **Umgebungsvariablen für lokale Entwicklung** 3. **Service-Abhängigkeiten** 4. **Docker-Compose für Produktion** 5. **Dokumentation**
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
plugins {
|
||||
kotlin("jvm")
|
||||
kotlin("plugin.spring")
|
||||
id("org.springframework.boot") version "3.2.0"
|
||||
id("org.springframework.boot") version "3.2.3"
|
||||
id("io.spring.dependency-management") version "1.1.4"
|
||||
id("org.jetbrains.compose") version "1.7.3"
|
||||
id("org.jetbrains.kotlin.plugin.compose") version "2.1.20"
|
||||
id("org.jetbrains.kotlin.plugin.compose") version "2.1.21"
|
||||
}
|
||||
|
||||
repositories {
|
||||
|
||||
+181
@@ -0,0 +1,181 @@
|
||||
package at.mocode.client.web.viewmodel
|
||||
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import at.mocode.core.domain.model.DatenQuelleE
|
||||
import at.mocode.core.domain.model.GeschlechtE
|
||||
import at.mocode.members.application.usecase.CreatePersonUseCase
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.datetime.LocalDate
|
||||
|
||||
class CreatePersonViewModel(
|
||||
private val createPersonUseCase: CreatePersonUseCase
|
||||
) : ViewModel() {
|
||||
|
||||
// Form state
|
||||
var nachname by mutableStateOf("")
|
||||
private set
|
||||
var vorname by mutableStateOf("")
|
||||
private set
|
||||
var titel by mutableStateOf("")
|
||||
private set
|
||||
var oepsSatzNr by mutableStateOf("")
|
||||
private set
|
||||
var geburtsdatum by mutableStateOf("")
|
||||
private set
|
||||
var geschlecht by mutableStateOf<GeschlechtE?>(null)
|
||||
private set
|
||||
var telefon by mutableStateOf("")
|
||||
private set
|
||||
var email by mutableStateOf("")
|
||||
private set
|
||||
var strasse by mutableStateOf("")
|
||||
private set
|
||||
var plz by mutableStateOf("")
|
||||
private set
|
||||
var ort by mutableStateOf("")
|
||||
private set
|
||||
var adresszusatz by mutableStateOf("")
|
||||
private set
|
||||
var feiId by mutableStateOf("")
|
||||
private set
|
||||
var mitgliedsNummer by mutableStateOf("")
|
||||
private set
|
||||
var notizen by mutableStateOf("")
|
||||
private set
|
||||
var istGesperrt by mutableStateOf(false)
|
||||
private set
|
||||
var sperrGrund by mutableStateOf("")
|
||||
private set
|
||||
|
||||
// UI state
|
||||
var isLoading by mutableStateOf(false)
|
||||
private set
|
||||
var errorMessage by mutableStateOf<String?>(null)
|
||||
private set
|
||||
var isSuccess by mutableStateOf(false)
|
||||
private set
|
||||
|
||||
// Update methods
|
||||
fun updateNachname(value: String) { nachname = value }
|
||||
fun updateVorname(value: String) { vorname = value }
|
||||
fun updateTitel(value: String) { titel = value }
|
||||
fun updateOepsSatzNr(value: String) { oepsSatzNr = value }
|
||||
fun updateGeburtsdatum(value: String) { geburtsdatum = value }
|
||||
fun updateGeschlecht(value: GeschlechtE?) { geschlecht = value }
|
||||
fun updateTelefon(value: String) { telefon = value }
|
||||
fun updateEmail(value: String) { email = value }
|
||||
fun updateStrasse(value: String) { strasse = value }
|
||||
fun updatePlz(value: String) { plz = value }
|
||||
fun updateOrt(value: String) { ort = value }
|
||||
fun updateAdresszusatz(value: String) { adresszusatz = value }
|
||||
fun updateFeiId(value: String) { feiId = value }
|
||||
fun updateMitgliedsNummer(value: String) { mitgliedsNummer = value }
|
||||
fun updateNotizen(value: String) { notizen = value }
|
||||
fun updateIstGesperrt(value: Boolean) { istGesperrt = value }
|
||||
fun updateSperrGrund(value: String) { sperrGrund = value }
|
||||
|
||||
fun clearError() {
|
||||
errorMessage = null
|
||||
}
|
||||
|
||||
fun createPerson() {
|
||||
// Basic validation
|
||||
when {
|
||||
nachname.isBlank() -> {
|
||||
errorMessage = "Nachname ist erforderlich"
|
||||
return
|
||||
}
|
||||
vorname.isBlank() -> {
|
||||
errorMessage = "Vorname ist erforderlich"
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
viewModelScope.launch {
|
||||
isLoading = true
|
||||
errorMessage = null
|
||||
|
||||
try {
|
||||
// Parse birthdate if provided
|
||||
val parsedGeburtsdatum = if (geburtsdatum.isNotBlank()) {
|
||||
try {
|
||||
val parts = geburtsdatum.split("-")
|
||||
if (parts.size == 3) {
|
||||
LocalDate(parts[0].toInt(), parts[1].toInt(), parts[2].toInt())
|
||||
} else {
|
||||
errorMessage = "Ungültiges Datumsformat. Verwenden Sie YYYY-MM-DD"
|
||||
isLoading = false
|
||||
isSuccess = false
|
||||
return@launch
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
errorMessage = "Ungültiges Datumsformat. Verwenden Sie YYYY-MM-DD"
|
||||
isLoading = false
|
||||
isSuccess = false
|
||||
return@launch
|
||||
}
|
||||
} else null
|
||||
|
||||
val request = CreatePersonUseCase.CreatePersonRequest(
|
||||
oepsSatzNr = oepsSatzNr.takeIf { it.isNotBlank() },
|
||||
nachname = nachname,
|
||||
vorname = vorname,
|
||||
titel = titel.takeIf { it.isNotBlank() },
|
||||
geburtsdatum = parsedGeburtsdatum,
|
||||
geschlechtE = geschlecht,
|
||||
telefon = telefon.takeIf { it.isNotBlank() },
|
||||
email = email.takeIf { it.isNotBlank() },
|
||||
strasse = strasse.takeIf { it.isNotBlank() },
|
||||
plz = plz.takeIf { it.isNotBlank() },
|
||||
ort = ort.takeIf { it.isNotBlank() },
|
||||
adresszusatzZusatzinfo = adresszusatz.takeIf { it.isNotBlank() },
|
||||
feiId = feiId.takeIf { it.isNotBlank() },
|
||||
mitgliedsNummerBeiStammVerein = mitgliedsNummer.takeIf { it.isNotBlank() },
|
||||
istGesperrt = istGesperrt,
|
||||
sperrGrund = sperrGrund.takeIf { it.isNotBlank() },
|
||||
datenQuelle = DatenQuelleE.MANUELL,
|
||||
notizenIntern = notizen.takeIf { it.isNotBlank() }
|
||||
)
|
||||
|
||||
val response = createPersonUseCase.execute(request)
|
||||
|
||||
if (response.success) {
|
||||
isSuccess = true
|
||||
} else {
|
||||
errorMessage = response.error?.message ?: "Unbekannter Fehler beim Erstellen der Person"
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
errorMessage = "Fehler beim Erstellen der Person: ${e.message}"
|
||||
} finally {
|
||||
isLoading = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun resetForm() {
|
||||
nachname = ""
|
||||
vorname = ""
|
||||
titel = ""
|
||||
oepsSatzNr = ""
|
||||
geburtsdatum = ""
|
||||
geschlecht = null
|
||||
telefon = ""
|
||||
email = ""
|
||||
strasse = ""
|
||||
plz = ""
|
||||
ort = ""
|
||||
adresszusatz = ""
|
||||
feiId = ""
|
||||
mitgliedsNummer = ""
|
||||
notizen = ""
|
||||
istGesperrt = false
|
||||
sperrGrund = ""
|
||||
isLoading = false
|
||||
errorMessage = null
|
||||
isSuccess = false
|
||||
}
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
package at.mocode.client.web.viewmodel
|
||||
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import at.mocode.members.domain.model.DomPerson
|
||||
import at.mocode.members.domain.repository.PersonRepository
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class PersonListViewModel(
|
||||
private val personRepository: PersonRepository
|
||||
) : ViewModel() {
|
||||
|
||||
// UI state
|
||||
var persons by mutableStateOf<List<DomPerson>>(emptyList())
|
||||
private set
|
||||
var isLoading by mutableStateOf(false)
|
||||
private set
|
||||
var errorMessage by mutableStateOf<String?>(null)
|
||||
private set
|
||||
|
||||
init {
|
||||
loadPersons()
|
||||
}
|
||||
|
||||
fun loadPersons() {
|
||||
viewModelScope.launch {
|
||||
isLoading = true
|
||||
errorMessage = null
|
||||
|
||||
try {
|
||||
persons = personRepository.findAllActive(limit = 100, offset = 0)
|
||||
} catch (e: Exception) {
|
||||
errorMessage = "Fehler beim Laden der Personen: ${e.message}"
|
||||
} finally {
|
||||
isLoading = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun clearError() {
|
||||
errorMessage = null
|
||||
}
|
||||
|
||||
fun refreshPersons() {
|
||||
loadPersons()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user