feat(masterdata): add controllers, services, and repositories for Reiter, Horse, and Verein domains

- Introduced entities `ReiterController`, `HorseController`, and `VereinController`, with associated REST routes.
- Implemented upsert functionality for `Reiter`, `Horse`, and `Verein` repositories.
- Added services for `Altersklasse` calculations and integrated them into the domain layer.
- Updated database schema to include `ReiterTable`, `HorseTable`, `VereinTable`, and `FunktionaerTable`.
- Refactored `masterdataApiModule` to register new domain controllers.
- Adjusted Ktor server and Spring configurations to support new domains.

Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
This commit is contained in:
2026-03-30 13:16:55 +02:00
parent c576bbd6af
commit 0c870ba2e3
15 changed files with 533 additions and 33 deletions
@@ -174,4 +174,35 @@ class ExposedReiterRepository : ReiterRepository {
override suspend fun existsBySatznummer(satznummer: String): Boolean = DatabaseFactory.dbQuery {
ReiterTable.selectAll().where { ReiterTable.satznummer eq satznummer }.any()
}
override suspend fun upsertBySatznummer(reiter: DomReiter): DomReiter = DatabaseFactory.dbQuery {
val existing = ReiterTable.selectAll().where { ReiterTable.satznummer eq reiter.satznummer }
.map(::rowToDomReiter)
.singleOrNull()
if (existing != null) {
val toUpdate = reiter.copy(reiterId = existing.reiterId)
ReiterTable.update({ ReiterTable.id eq existing.reiterId }) {
it[personId] = toUpdate.personId
it[nachname] = toUpdate.nachname
it[vorname] = toUpdate.vorname
it[geburtsdatum] = toUpdate.geburtsdatum
it[lizenzNummer] = toUpdate.lizenzNummer
it[lizenzKlasse] = toUpdate.lizenzKlasse.name
it[startkartAktiv] = toUpdate.startkartAktiv
it[startkartSaison] = toUpdate.startkartSaison
it[feiId] = toUpdate.feiId
it[nation] = toUpdate.nation
it[vereinsNummer] = toUpdate.vereinsNummer
it[vereinsName] = toUpdate.vereinsName
it[istGastreiter] = toUpdate.istGastreiter
it[istAktiv] = toUpdate.istAktiv
it[datenQuelle] = toUpdate.datenQuelle.name
it[updatedAt] = toUpdate.updatedAt
}
toUpdate
} else {
save(reiter)
}
}
}
@@ -7,14 +7,10 @@ import at.mocode.core.utils.database.DatabaseFactory
import at.mocode.masterdata.domain.model.DomVerein
import at.mocode.masterdata.domain.repository.VereinRepository
import org.jetbrains.exposed.v1.core.ResultRow
import org.jetbrains.exposed.v1.core.or
import org.jetbrains.exposed.v1.jdbc.deleteWhere
import org.jetbrains.exposed.v1.jdbc.insert
import org.jetbrains.exposed.v1.jdbc.selectAll
import org.jetbrains.exposed.v1.jdbc.update
import org.jetbrains.exposed.v1.core.eq
import org.jetbrains.exposed.v1.core.like
import org.jetbrains.exposed.v1.jdbc.andWhere
import org.jetbrains.exposed.v1.core.or
import org.jetbrains.exposed.v1.jdbc.*
import kotlin.uuid.Uuid
/**
@@ -151,4 +147,35 @@ class ExposedVereinRepository : VereinRepository {
override suspend fun existsByVereinsNummer(vereinsNummer: String): Boolean = DatabaseFactory.dbQuery {
VereinTable.selectAll().where { VereinTable.vereinsNummer eq vereinsNummer }.any()
}
override suspend fun upsertByVereinsNummer(verein: DomVerein): DomVerein = DatabaseFactory.dbQuery {
val existing = VereinTable.selectAll().where { VereinTable.vereinsNummer eq verein.vereinsNummer }
.map(::rowToDomVerein)
.singleOrNull()
if (existing != null) {
val toUpdate = verein.copy(vereinId = existing.vereinId)
VereinTable.update({ VereinTable.id eq existing.vereinId }) {
it[vereinsNummer] = toUpdate.vereinsNummer
it[name] = toUpdate.name
it[kurzname] = toUpdate.kurzname
it[bundesland] = toUpdate.bundesland
it[ort] = toUpdate.ort
it[plz] = toUpdate.plz
it[strasse] = toUpdate.strasse
it[email] = toUpdate.email
it[telefon] = toUpdate.telefon
it[website] = toUpdate.website
it[oepsRegionNummer] = toUpdate.oepsRegionNummer
it[istVeranstalter] = toUpdate.istVeranstalter
it[istAktiv] = toUpdate.istAktiv
it[bemerkungen] = toUpdate.bemerkungen
it[datenQuelle] = toUpdate.datenQuelle.name
it[updatedAt] = toUpdate.updatedAt
}
toUpdate
} else {
save(verein)
}
}
}
@@ -283,4 +283,43 @@ class HorseRepositoryImpl : HorseRepository {
}
query.count()
}
override suspend fun upsertByLebensnummer(horse: DomPferd): DomPferd = DatabaseFactory.dbQuery {
val lebensnummer = horse.lebensnummer ?: return@dbQuery save(horse)
val existing = HorseTable.selectAll().where { HorseTable.lebensnummer eq lebensnummer }
.map(::rowToDomPferd)
.singleOrNull()
if (existing != null) {
val toUpdate = horse.copy(pferdId = existing.pferdId)
HorseTable.update({ HorseTable.id eq existing.pferdId }) {
it[pferdeName] = toUpdate.pferdeName
it[geschlecht] = toUpdate.geschlecht.name
it[geburtsdatum] = toUpdate.geburtsdatum
it[rasse] = toUpdate.rasse
it[farbe] = toUpdate.farbe
it[besitzerId] = toUpdate.besitzerId
it[verantwortlichePersonId] = toUpdate.verantwortlichePersonId
it[zuechterName] = toUpdate.zuechterName
it[zuchtbuchNummer] = toUpdate.zuchtbuchNummer
it[lebensnummer] = toUpdate.lebensnummer
it[chipNummer] = toUpdate.chipNummer
it[passNummer] = toUpdate.passNummer
it[oepsNummer] = toUpdate.oepsNummer
it[feiNummer] = toUpdate.feiNummer
it[vaterName] = toUpdate.vaterName
it[mutterName] = toUpdate.mutterName
it[mutterVaterName] = toUpdate.mutterVaterName
it[stockmass] = toUpdate.stockmass
it[istAktiv] = toUpdate.istAktiv
it[bemerkungen] = toUpdate.bemerkungen
it[datenQuelle] = toUpdate.datenQuelle.name
it[updatedAt] = toUpdate.updatedAt
}
toUpdate
} else {
save(horse)
}
}
}