From 5d1c89438c580f18f7bc286f88b8e7c6dfb266bc Mon Sep 17 00:00:00 2001 From: StefanMoCoAt Date: Wed, 8 Apr 2026 23:00:23 +0200 Subject: [PATCH] Migrate `UUID` handling in `VeranstaltungRepositoryImpl`: standardize conversion functions, update methods for entity mapping, and refactor queries for enhanced consistency and type safety. --- .../VeranstaltungRepositoryImpl.kt | 84 ++++++++++--------- 1 file changed, 45 insertions(+), 39 deletions(-) diff --git a/backend/services/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungRepositoryImpl.kt b/backend/services/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungRepositoryImpl.kt index 00ce4129..2ca3460a 100644 --- a/backend/services/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungRepositoryImpl.kt +++ b/backend/services/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungRepositoryImpl.kt @@ -4,14 +4,19 @@ package at.mocode.events.infrastructure.persistence import at.mocode.core.domain.model.SparteE import at.mocode.events.domain.model.Veranstaltung import at.mocode.events.domain.repository.VeranstaltungRepository -import at.mocode.core.utils.database.DatabaseFactory import kotlin.uuid.Uuid -import kotlinx.datetime.Clock import kotlinx.datetime.LocalDate import kotlinx.serialization.json.Json -import org.jetbrains.exposed.sql.* -import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq -import org.jetbrains.exposed.sql.statements.UpdateBuilder +import org.jetbrains.exposed.v1.core.* +import org.jetbrains.exposed.v1.jdbc.* +import org.jetbrains.exposed.v1.core.statements.UpdateBuilder +import at.mocode.backend.infrastructure.persistence.readTransaction +import at.mocode.backend.infrastructure.persistence.writeTransaction +import at.mocode.backend.infrastructure.persistence.getOrNull +import at.mocode.core.utils.database.DatabaseFactory +import java.util.UUID +import kotlin.time.Clock +import kotlin.time.Instant /** * Exposed-based implementation of VeranstaltungRepository. @@ -21,8 +26,11 @@ import org.jetbrains.exposed.sql.statements.UpdateBuilder */ class VeranstaltungRepositoryImpl : VeranstaltungRepository { + private fun Uuid.toJavaUuid(): UUID = UUID.fromString(this.toString()) + private fun UUID.toKotlinUuid(): Uuid = Uuid.parse(this.toString()) + override suspend fun findById(id: Uuid): Veranstaltung? = DatabaseFactory.dbQuery { - VeranstaltungTable.selectAll().where { VeranstaltungTable.id eq id } + VeranstaltungTable.selectAll().where { VeranstaltungTable.id eq id.toJavaUuid() } .map { rowToVeranstaltung(it) } .singleOrNull() } @@ -36,78 +44,77 @@ class VeranstaltungRepositoryImpl : VeranstaltungRepository { } override suspend fun findByVeranstalterVereinId(vereinId: Uuid, activeOnly: Boolean): List = DatabaseFactory.dbQuery { - val query = VeranstaltungTable.selectAll().where { VeranstaltungTable.veranstalterVereinId eq vereinId } + var query = VeranstaltungTable.selectAll().where { VeranstaltungTable.veranstalterVereinId eq vereinId.toJavaUuid() } if (activeOnly) { - query.andWhere { VeranstaltungTable.istAktiv eq true } - } else { - query - }.orderBy(VeranstaltungTable.startDatum, SortOrder.DESC) + query = query.andWhere { VeranstaltungTable.istAktiv eq true } + } + query.orderBy(VeranstaltungTable.startDatum, SortOrder.DESC) .map { rowToVeranstaltung(it) } } override suspend fun findByDateRange(startDate: LocalDate, endDate: LocalDate, activeOnly: Boolean): List = DatabaseFactory.dbQuery { - val query = VeranstaltungTable.selectAll().where { + var query = VeranstaltungTable.selectAll().where { (VeranstaltungTable.startDatum greaterEq startDate) and (VeranstaltungTable.endDatum lessEq endDate) } if (activeOnly) { - query.andWhere { VeranstaltungTable.istAktiv eq true } - } else { - query - }.orderBy(VeranstaltungTable.startDatum) + query = query.andWhere { VeranstaltungTable.istAktiv eq true } + } + query.orderBy(VeranstaltungTable.startDatum) .map { rowToVeranstaltung(it) } } override suspend fun findByStartDate(date: LocalDate, activeOnly: Boolean): List = DatabaseFactory.dbQuery { - val query = VeranstaltungTable.selectAll().where { VeranstaltungTable.startDatum eq date } + var query = VeranstaltungTable.selectAll().where { VeranstaltungTable.startDatum eq date } if (activeOnly) { - query.andWhere { VeranstaltungTable.istAktiv eq true } - } else { - query - }.orderBy(VeranstaltungTable.name) + query = query.andWhere { VeranstaltungTable.istAktiv eq true } + } + query.orderBy(VeranstaltungTable.name) .map { rowToVeranstaltung(it) } } override suspend fun findAllActive(limit: Int, offset: Int): List = DatabaseFactory.dbQuery { VeranstaltungTable.selectAll().where { VeranstaltungTable.istAktiv eq true } .orderBy(VeranstaltungTable.startDatum, SortOrder.DESC) - .limit(limit, offset.toLong()) + .limit(limit) + .offset(offset.toLong()) .map { rowToVeranstaltung(it) } } override suspend fun findPublicEvents(activeOnly: Boolean): List = DatabaseFactory.dbQuery { - val query = VeranstaltungTable.selectAll().where { VeranstaltungTable.istOeffentlich eq true } + var query = VeranstaltungTable.selectAll().where { VeranstaltungTable.istOeffentlich eq true } if (activeOnly) { - query.andWhere { VeranstaltungTable.istAktiv eq true } - } else { - query - }.orderBy(VeranstaltungTable.startDatum, SortOrder.DESC) + query = query.andWhere { VeranstaltungTable.istAktiv eq true } + } + query.orderBy(VeranstaltungTable.startDatum, SortOrder.DESC) .map { rowToVeranstaltung(it) } } override suspend fun save(veranstaltung: Veranstaltung): Veranstaltung = DatabaseFactory.dbQuery { val now = Clock.System.now() + // Ensure now is kotlinx.datetime.Instant as expected by Domain val updatedVeranstaltung = veranstaltung.copy(updatedAt = now) + val vId = veranstaltung.veranstaltungId.toJavaUuid() // Check if a record exists val existingRecord = VeranstaltungTable.selectAll() - .where { VeranstaltungTable.id eq veranstaltung.veranstaltungId } + .where { VeranstaltungTable.id eq vId } .singleOrNull() if (existingRecord != null) { // Update existing record - VeranstaltungTable.update({ VeranstaltungTable.id eq veranstaltung.veranstaltungId }) { + VeranstaltungTable.update({ VeranstaltungTable.id eq vId }) { veranstaltungToStatement(it, updatedVeranstaltung) } updatedVeranstaltung } else { // Insert a new record VeranstaltungTable.insert { - it[id] = veranstaltung.veranstaltungId + it[id] = vId veranstaltungToStatement(it, updatedVeranstaltung) } updatedVeranstaltung @@ -115,7 +122,7 @@ class VeranstaltungRepositoryImpl : VeranstaltungRepository { } override suspend fun delete(id: Uuid): Boolean = DatabaseFactory.dbQuery { - val deletedRows = VeranstaltungTable.deleteWhere { VeranstaltungTable.id eq id } + val deletedRows = VeranstaltungTable.deleteWhere { VeranstaltungTable.id eq id.toJavaUuid() } deletedRows > 0 } @@ -125,13 +132,12 @@ class VeranstaltungRepositoryImpl : VeranstaltungRepository { } override suspend fun countByVeranstalterVereinId(vereinId: Uuid, activeOnly: Boolean): Long = DatabaseFactory.dbQuery { - val query = VeranstaltungTable.selectAll().where { VeranstaltungTable.veranstalterVereinId eq vereinId } + var query = VeranstaltungTable.selectAll().where { VeranstaltungTable.veranstalterVereinId eq vereinId.toJavaUuid() } if (activeOnly) { - query.andWhere { VeranstaltungTable.istAktiv eq true } - } else { - query - }.count() + query = query.andWhere { VeranstaltungTable.istAktiv eq true } + } + query.count() } /** @@ -151,7 +157,7 @@ class VeranstaltungRepositoryImpl : VeranstaltungRepository { } return Veranstaltung( - veranstaltungId = row[VeranstaltungTable.id].value, + veranstaltungId = row[VeranstaltungTable.id].toKotlinUuid(), name = row[VeranstaltungTable.name], untertitel = row[VeranstaltungTable.untertitel], beschreibung = row[VeranstaltungTable.beschreibung], @@ -160,7 +166,7 @@ class VeranstaltungRepositoryImpl : VeranstaltungRepository { startDatum = row[VeranstaltungTable.startDatum], endDatum = row[VeranstaltungTable.endDatum], ort = row[VeranstaltungTable.ort], - veranstalterVereinId = row[VeranstaltungTable.veranstalterVereinId], + veranstalterVereinId = row[VeranstaltungTable.veranstalterVereinId].toKotlinUuid(), sparten = sparten, istAktiv = row[VeranstaltungTable.istAktiv], istOeffentlich = row[VeranstaltungTable.istOeffentlich], @@ -183,7 +189,7 @@ class VeranstaltungRepositoryImpl : VeranstaltungRepository { statement[VeranstaltungTable.startDatum] = veranstaltung.startDatum statement[VeranstaltungTable.endDatum] = veranstaltung.endDatum statement[VeranstaltungTable.ort] = veranstaltung.ort - statement[VeranstaltungTable.veranstalterVereinId] = veranstaltung.veranstalterVereinId + statement[VeranstaltungTable.veranstalterVereinId] = veranstaltung.veranstalterVereinId.toJavaUuid() statement[VeranstaltungTable.sparten] = Json.encodeToString(veranstaltung.sparten) statement[VeranstaltungTable.istAktiv] = veranstaltung.istAktiv statement[VeranstaltungTable.istOeffentlich] = veranstaltung.istOeffentlich