Extend Bewerb DTOs and APIs: add comprehensive properties, mapping functions, and RichterEinsatz support, and align backend and frontend implementations.

This commit is contained in:
2026-04-08 22:59:22 +02:00
parent 2d42578378
commit 8b6ea11d46
2 changed files with 226 additions and 5 deletions
@@ -0,0 +1,87 @@
package at.mocode.turnier.feature.data.remote
import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.request.*
import io.ktor.http.*
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalTime
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class RichterEinsatzDto(
val funktionaerId: String,
val position: String,
)
@Serializable
data class CreateBewerbPayload(
// Basis
val klasse: String,
val hoeheCm: Int? = null,
val bezeichnung: String,
// Text & Details
val beschreibung: String? = null,
val aufgabe: String? = null,
val aufgabenNummer: String? = null,
val paraGrade: String? = null,
// Ort & Funktionäre
val austragungsplatzId: String? = null,
val richterEinsaetze: List<RichterEinsatzDto> = emptyList(),
// Zeitplan
val geplantesDatum: LocalDate? = null,
@SerialName("beginnZeitTyp") val beginnZeitTyp: String? = null, // enum name
val beginnZeit: LocalTime? = null,
val reitdauerMinuten: Int? = null,
val umbauMinuten: Int? = null,
val besichtigungMinuten: Int? = null,
val stechenGeplant: Boolean = false,
// Finanzen
val startgeldCent: Long? = null,
val geldpreisAusbezahlt: Boolean = false,
)
@Serializable
data class BewerbResponse(
val id: String,
val turnierId: String,
val klasse: String,
val hoeheCm: Int? = null,
val bezeichnung: String,
// Text & Details
val beschreibung: String? = null,
val aufgabe: String? = null,
val aufgabenNummer: String? = null,
val paraGrade: String? = null,
// Ort & Funktionäre
val austragungsplatzId: String? = null,
val richterEinsaetze: List<RichterEinsatzDto> = emptyList(),
// Zeitplan
val geplantesDatum: LocalDate? = null,
@SerialName("beginnZeitTyp") val beginnZeitTyp: String? = null,
val beginnZeit: LocalTime? = null,
val reitdauerMinuten: Int? = null,
val umbauMinuten: Int? = null,
val besichtigungMinuten: Int? = null,
val stechenGeplant: Boolean = false,
// Finanzen
val startgeldCent: Long? = null,
val geldpreisAusbezahlt: Boolean = false,
)
class BewerbApi(private val apiClient: HttpClient) {
suspend fun createBewerb(turnierId: String, payload: CreateBewerbPayload): BewerbResponse =
apiClient.post("/turniere/$turnierId/bewerbe") {
contentType(ContentType.Application.Json)
setBody(payload)
}.body()
}