From deaa76c8f6beb57439f62daf45d8a1ebf113efc7 Mon Sep 17 00:00:00 2001 From: avalin Date: Wed, 15 May 2024 18:21:17 +0200 Subject: [PATCH] Fix filters [db] --- .../allin/data/mock/MockBetDataSource.kt | 28 +++++++++---------- .../data/postgres/PostgresBetDataSource.kt | 27 ++++++++++++++++-- .../src/main/kotlin/allin/model/BetFilter.kt | 9 +++++- .../main/kotlin/allin/routing/betRouter.kt | 9 ++++-- 4 files changed, 53 insertions(+), 20 deletions(-) diff --git a/Sources/src/main/kotlin/allin/data/mock/MockBetDataSource.kt b/Sources/src/main/kotlin/allin/data/mock/MockBetDataSource.kt index d298ca3..117605a 100644 --- a/Sources/src/main/kotlin/allin/data/mock/MockBetDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/mock/MockBetDataSource.kt @@ -17,20 +17,20 @@ class MockBetDataSource(private val mockData: MockDataSource.MockData) : BetData override fun getAllBets(filters: List): List { return bets.filter { bet -> - val finished = if (filters.contains(BetFilter.FINISHED)) { - bet.status in listOf(FINISHED, 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(IN_PROGRESS, WAITING, CLOSING) - } else false - - invitation || public || finished || inProgress + val public = filters.contains(BetFilter.PUBLIC) && + !bet.isPrivate + + val invitation = filters.contains(BetFilter.INVITATION) && + bet.isPrivate + + val finished = filters.contains(BetFilter.FINISHED) && + bet.status in listOf(FINISHED, CANCELLED) + + val inProgress = filters.contains(BetFilter.IN_PROGRESS) && + bet.status in listOf(IN_PROGRESS, WAITING, CLOSING) + + + (public || invitation) && (finished || inProgress) } } diff --git a/Sources/src/main/kotlin/allin/data/postgres/PostgresBetDataSource.kt b/Sources/src/main/kotlin/allin/data/postgres/PostgresBetDataSource.kt index b63c297..827b850 100644 --- a/Sources/src/main/kotlin/allin/data/postgres/PostgresBetDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/postgres/PostgresBetDataSource.kt @@ -13,6 +13,29 @@ 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( + 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) @@ -27,7 +50,7 @@ class PostgresBetDataSource(private val database: Database) : BetDataSource { bet.status in listOf(BetStatus.IN_PROGRESS, BetStatus.WAITING, BetStatus.CLOSING) } else false - if (invitation || public || finished || inProgress) { + if ((invitation || public) && (finished || inProgress)) { bet.toBet(database) } else null } @@ -39,7 +62,7 @@ class PostgresBetDataSource(private val database: Database) : BetDataSource { database.bets.find { it.id eq id }?.toBetDetail(database, username) override fun getBetsNotFinished(): List { - val currentTime = ZonedDateTime.now(ZoneId.of("Europe/Paris")) + val currentTime = ZonedDateTime.now(ZoneId.of("+02:00")) return database.bets .filter { it.endBet greaterEq currentTime.toInstant() } .map { it.toBet(database) } diff --git a/Sources/src/main/kotlin/allin/model/BetFilter.kt b/Sources/src/main/kotlin/allin/model/BetFilter.kt index a0b3b72..268d1bb 100644 --- a/Sources/src/main/kotlin/allin/model/BetFilter.kt +++ b/Sources/src/main/kotlin/allin/model/BetFilter.kt @@ -1,8 +1,15 @@ package allin.model +import kotlinx.serialization.Serializable + enum class BetFilter { PUBLIC, INVITATION, IN_PROGRESS, FINISHED -} \ No newline at end of file +} + +@Serializable +data class BetFiltersRequest( + val filters: List +) \ No newline at end of file diff --git a/Sources/src/main/kotlin/allin/routing/betRouter.kt b/Sources/src/main/kotlin/allin/routing/betRouter.kt index fbbfe56..05f91b1 100644 --- a/Sources/src/main/kotlin/allin/routing/betRouter.kt +++ b/Sources/src/main/kotlin/allin/routing/betRouter.kt @@ -61,10 +61,13 @@ fun Application.betRouter() { } } authenticate { - get("/bets/gets", { + post("/bets/gets", { description = "Allows you to recover all bets" request { headerParameter("JWT token of the logged user") + body> { + description = "List of filters" + } } response { HttpStatusCode.Accepted to { @@ -77,8 +80,8 @@ fun Application.betRouter() { }) { hasToken { principal -> verifyUserFromToken(userDataSource, principal) { _, _ -> - val filters = call.receive>() - call.respond(HttpStatusCode.Accepted, betDataSource.getAllBets(filters)) + val request = call.receive() + call.respond(HttpStatusCode.Accepted, betDataSource.getAllBets(request.filters)) } } }