Files
meldestelle/server/src/main/kotlin/at/mocode/model/PostgresArtikelRepository.kt
T
2025-06-30 13:25:44 +02:00

84 lines
3.1 KiB
Kotlin

package at.mocode.model
import at.mocode.tables.ArtikelTable
import com.benasher44.uuid.Uuid
import com.ionspin.kotlin.bignum.decimal.BigDecimal
import kotlinx.datetime.Clock
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
import org.jetbrains.exposed.sql.transactions.transaction
class PostgresArtikelRepository : ArtikelRepository {
override suspend fun findAll(): List<Artikel> = transaction {
ArtikelTable.selectAll().map { rowToArtikel(it) }
}
override suspend fun findById(id: Uuid): Artikel? = transaction {
ArtikelTable.selectAll().where { ArtikelTable.id eq id }
.map { rowToArtikel(it) }
.singleOrNull()
}
override suspend fun create(artikel: Artikel): Artikel = transaction {
val now = Clock.System.now()
ArtikelTable.insert {
it[id] = artikel.id
it[bezeichnung] = artikel.bezeichnung
it[preis] = artikel.preis.toStringExpanded()
it[einheit] = artikel.einheit
it[istVerbandsabgabe] = artikel.istVerbandsabgabe
it[createdAt] = now
it[updatedAt] = now
}
artikel.copy(createdAt = now, updatedAt = now)
}
override suspend fun update(id: Uuid, artikel: Artikel): Artikel? = transaction {
val updateCount = ArtikelTable.update({ ArtikelTable.id eq id }) {
it[bezeichnung] = artikel.bezeichnung
it[preis] = artikel.preis.toStringExpanded()
it[einheit] = artikel.einheit
it[istVerbandsabgabe] = artikel.istVerbandsabgabe
it[updatedAt] = Clock.System.now()
}
if (updateCount > 0) {
ArtikelTable.selectAll().where { ArtikelTable.id eq id }
.map { rowToArtikel(it) }
.singleOrNull()
} else null
}
override suspend fun delete(id: Uuid): Boolean = transaction {
ArtikelTable.deleteWhere { ArtikelTable.id eq id } > 0
}
override suspend fun findByVerbandsabgabe(istVerbandsabgabe: Boolean): List<Artikel> = transaction {
ArtikelTable.selectAll().where { ArtikelTable.istVerbandsabgabe eq istVerbandsabgabe }
.map { rowToArtikel(it) }
}
override suspend fun search(query: String): List<Artikel> = transaction {
ArtikelTable.selectAll().where {
(ArtikelTable.bezeichnung.lowerCase() like "%${query.lowercase()}%") or
(ArtikelTable.einheit.lowerCase() like "%${query.lowercase()}%")
}.map { rowToArtikel(it) }
}
private fun rowToArtikel(row: ResultRow): Artikel {
return Artikel(
id = row[ArtikelTable.id],
bezeichnung = row[ArtikelTable.bezeichnung],
preis = try {
BigDecimal.parseString(row[ArtikelTable.preis])
} catch (_: Exception) {
BigDecimal.ZERO
},
einheit = row[ArtikelTable.einheit],
istVerbandsabgabe = row[ArtikelTable.istVerbandsabgabe],
createdAt = row[ArtikelTable.createdAt],
updatedAt = row[ArtikelTable.updatedAt]
)
}
}