From 929d4bede5449b95a6558364fe4a2874e188e16f Mon Sep 17 00:00:00 2001 From: ludelanier Date: Thu, 16 May 2024 18:45:04 +0200 Subject: [PATCH] add filter get bets --- .../data/postgres/PostgresBetDataSource.kt | 68 ++++++++----------- .../main/kotlin/allin/routing/betRouter.kt | 7 +- 2 files changed, 35 insertions(+), 40 deletions(-) diff --git a/Sources/src/main/kotlin/allin/data/postgres/PostgresBetDataSource.kt b/Sources/src/main/kotlin/allin/data/postgres/PostgresBetDataSource.kt index 827b850..cbd3090 100644 --- a/Sources/src/main/kotlin/allin/data/postgres/PostgresBetDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/postgres/PostgresBetDataSource.kt @@ -11,49 +11,41 @@ import java.time.ZonedDateTime class PostgresBetDataSource(private val database: Database) : BetDataSource { - override fun getAllBets(filters: List): List = - database.bets - .filter { bet -> - val public = if (filters.contains(BetFilter.PUBLIC)) { - !bet.isPrivate - } else bet.id eq "" - - val invitation = if (filters.contains(BetFilter.INVITATION)) { - bet.isPrivate - } else bet.id eq "" - - val finished = if (filters.contains(BetFilter.FINISHED)) { - bet.status inList listOf(BetStatus.FINISHED, BetStatus.CANCELLED) - } else bet.id eq "" - - val inProgress = if (filters.contains(BetFilter.IN_PROGRESS)) { - bet.status inList listOf( + override fun getAllBets(filters: List): List { + return when { + filters.isEmpty() -> database.bets.map { it.toBet(database) } + + filters.size == 1 -> { + val filter = filters.first() + + when (filter) { + BetFilter.PUBLIC -> database.bets.filter { !it.isPrivate } + BetFilter.INVITATION -> database.bets.filter { it.isPrivate } + BetFilter.FINISHED -> database.bets.filter { it.status eq BetStatus.FINISHED } + BetFilter.IN_PROGRESS -> database.bets.filter { + it.status inList listOf(BetStatus.IN_PROGRESS, BetStatus.WAITING, BetStatus.CLOSING) + } + }.map { it.toBet(database) } + } + + else -> { + database.bets.filter { bet -> + val public = (BetFilter.PUBLIC in filters) and !bet.isPrivate + val invitation = (BetFilter.INVITATION in filters) and bet.isPrivate + val finished = + (BetFilter.FINISHED in filters) and ((bet.status eq BetStatus.FINISHED) or (bet.status eq BetStatus.CANCELLED)) + val inProgress = (BetFilter.IN_PROGRESS in filters) and (bet.status inList listOf( BetStatus.IN_PROGRESS, BetStatus.WAITING, BetStatus.CLOSING - ) - } else bet.id eq "" + )) - (public or invitation) and (finished or inProgress) - } - .mapNotNull { bet -> - val finished = if (filters.contains(BetFilter.FINISHED)) { - bet.status in listOf(BetStatus.FINISHED, BetStatus.CANCELLED) - } else false - val public = if (filters.contains(BetFilter.PUBLIC)) { - !bet.isPrivate - } else false - val invitation = if (filters.contains(BetFilter.INVITATION)) { - bet.isPrivate - } else false - val inProgress = if (filters.contains(BetFilter.IN_PROGRESS)) { - bet.status in listOf(BetStatus.IN_PROGRESS, BetStatus.WAITING, BetStatus.CLOSING) - } else false - - if ((invitation || public) && (finished || inProgress)) { - bet.toBet(database) - } else null + (public or invitation) and (finished or inProgress) + }.map { it.toBet(database) } } + } + } + override fun getBetById(id: String): Bet? = database.bets.find { it.id eq id }?.toBet(database) diff --git a/Sources/src/main/kotlin/allin/routing/betRouter.kt b/Sources/src/main/kotlin/allin/routing/betRouter.kt index 05f91b1..57a810c 100644 --- a/Sources/src/main/kotlin/allin/routing/betRouter.kt +++ b/Sources/src/main/kotlin/allin/routing/betRouter.kt @@ -80,8 +80,11 @@ fun Application.betRouter() { }) { hasToken { principal -> verifyUserFromToken(userDataSource, principal) { _, _ -> - val request = call.receive() - call.respond(HttpStatusCode.Accepted, betDataSource.getAllBets(request.filters)) + val filtersRequest = + kotlin.runCatching { call.receiveNullable() }.getOrNull() + val filters = + filtersRequest?.filters ?: emptyList() // Use provided filters or empty list if null + call.respond(HttpStatusCode.Accepted, betDataSource.getAllBets(filters)) } } }