From 667cdc54726cd0814e1fae29ebd3c780332bbd71 Mon Sep 17 00:00:00 2001 From: Arthur VALIN Date: Tue, 21 May 2024 11:20:46 +0200 Subject: [PATCH 1/5] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'.drone.star'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .drone.star | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.star b/.drone.star index 32cb14a..46e87c2 100644 --- a/.drone.star +++ b/.drone.star @@ -93,7 +93,7 @@ def cd(ctx): "CODEFIRST_CLIENTDRONE_ENV_POSTGRES_PASSWORD": {"from_secret": "db_password"}, "CODEFIRST_CLIENTDRONE_ENV_POSTGRES_HOST": {"from_secret": "db_host"}, "CODEFIRST_CLIENTDRONE_ENV_SALT": {"from_secret": "SALT"}, - "ADMINS": "lucasevard,emrekartal,arthurvalin,lucasdelanier", + "ADMINS": ["lucasevard", "emrekartal", "arthurvalin", "lucasdelanier"], "IMAGENAME": "hub.codefirst.iut.uca.fr/lucas.evard/api:latest", "CONTAINERNAME": "api", "COMMAND": "create", @@ -122,7 +122,7 @@ def db(ctx): "COMMAND": "create", "OVERWRITE": "false", "PRIVATE": "false", - "ADMINS": "lucasevard,emrekartal,arthurvalin,lucasdelanier", + "ADMINS": ["lucasevard", "emrekartal", "arthurvalin", "lucasdelanier"], "CODEFIRST_CLIENTDRONE_ENV_POSTGRES_ROOT_PASSWORD": {"from_secret": "db_root_password"}, "CODEFIRST_CLIENTDRONE_ENV_POSTGRES_DB": {"from_secret": "db_database"}, "CODEFIRST_CLIENTDRONE_ENV_POSTGRES_USER": {"from_secret": "db_user"}, From 8fc6f68dc10fc67204d8e34cc1bdc9b40bcd714a Mon Sep 17 00:00:00 2001 From: Arthur VALIN Date: Tue, 21 May 2024 11:26:13 +0200 Subject: [PATCH 2/5] revert 667cdc54726cd0814e1fae29ebd3c780332bbd71 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit revert Mise à jour de '.drone.star' --- .drone.star | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.star b/.drone.star index 46e87c2..32cb14a 100644 --- a/.drone.star +++ b/.drone.star @@ -93,7 +93,7 @@ def cd(ctx): "CODEFIRST_CLIENTDRONE_ENV_POSTGRES_PASSWORD": {"from_secret": "db_password"}, "CODEFIRST_CLIENTDRONE_ENV_POSTGRES_HOST": {"from_secret": "db_host"}, "CODEFIRST_CLIENTDRONE_ENV_SALT": {"from_secret": "SALT"}, - "ADMINS": ["lucasevard", "emrekartal", "arthurvalin", "lucasdelanier"], + "ADMINS": "lucasevard,emrekartal,arthurvalin,lucasdelanier", "IMAGENAME": "hub.codefirst.iut.uca.fr/lucas.evard/api:latest", "CONTAINERNAME": "api", "COMMAND": "create", @@ -122,7 +122,7 @@ def db(ctx): "COMMAND": "create", "OVERWRITE": "false", "PRIVATE": "false", - "ADMINS": ["lucasevard", "emrekartal", "arthurvalin", "lucasdelanier"], + "ADMINS": "lucasevard,emrekartal,arthurvalin,lucasdelanier", "CODEFIRST_CLIENTDRONE_ENV_POSTGRES_ROOT_PASSWORD": {"from_secret": "db_root_password"}, "CODEFIRST_CLIENTDRONE_ENV_POSTGRES_DB": {"from_secret": "db_database"}, "CODEFIRST_CLIENTDRONE_ENV_POSTGRES_USER": {"from_secret": "db_user"}, From 7e1f4cab953d52204f904c7757bae87da3c42ee6 Mon Sep 17 00:00:00 2001 From: Lucas DELANIER Date: Tue, 21 May 2024 11:36:49 +0200 Subject: [PATCH 3/5] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'README.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 622fc3c..82c9bf4 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,6 @@ Le controller BET gère toutes les opérations liées aux paris. Il permet de r # Déploiement Le déploiement est réalisé sur Code First via les services **Drone** et **Runner** ! :rocket: - Lien de l'API sur codefirst : [API All In](https://codefirst.iut.uca.fr/containers/AllDev-api) From 6168d50bfaee3508ea1c664b7282ac472bb5aba9 Mon Sep 17 00:00:00 2001 From: Lucas DELANIER Date: Tue, 21 May 2024 11:38:21 +0200 Subject: [PATCH 4/5] add filter get bets (#11) Co-authored-by: ludelanier Co-authored-by: avalin Co-authored-by: Lucas EVARD Reviewed-on: https://codefirst.iut.uca.fr/git/AllDev/Api/pulls/11 Co-authored-by: Lucas DELANIER Co-committed-by: Lucas DELANIER --- README.md | 1 - Sources/src/main/kotlin/allin/Application.kt | 1 + .../main/kotlin/allin/data/BetDataSource.kt | 7 +--- .../allin/data/mock/MockBetDataSource.kt | 37 +++++++++++++++++- .../data/postgres/PostgresBetDataSource.kt | 39 +++++++++++++++++-- .../entities/BetResultNotificationEntity.kt | 4 +- .../src/main/kotlin/allin/model/BetFilter.kt | 15 +++++++ .../main/kotlin/allin/routing/betRouter.kt | 11 +++++- 8 files changed, 101 insertions(+), 14 deletions(-) create mode 100644 Sources/src/main/kotlin/allin/model/BetFilter.kt diff --git a/README.md b/README.md index 82c9bf4..0e6f14f 100644 --- a/README.md +++ b/README.md @@ -89,5 +89,4 @@ Lien de l'API sur codefirst : [API All In](https://codefirst.iut.uca.fr/containe
© AllDev - API -
diff --git a/Sources/src/main/kotlin/allin/Application.kt b/Sources/src/main/kotlin/allin/Application.kt index 374fb93..222feb2 100644 --- a/Sources/src/main/kotlin/allin/Application.kt +++ b/Sources/src/main/kotlin/allin/Application.kt @@ -87,6 +87,7 @@ private fun Application.extracted() { betDetailRouter() friendRouter() + kronJob(BET_VERIFY_DELAY) { dataSource.betDataSource.updateBetStatuses(ZonedDateTime.now()) } diff --git a/Sources/src/main/kotlin/allin/data/BetDataSource.kt b/Sources/src/main/kotlin/allin/data/BetDataSource.kt index 7aa2762..f8f8441 100644 --- a/Sources/src/main/kotlin/allin/data/BetDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/BetDataSource.kt @@ -1,13 +1,10 @@ package allin.data -import allin.model.Bet -import allin.model.BetDetail -import allin.model.BetResultDetail -import allin.model.UpdatedBetData +import allin.model.* import java.time.ZonedDateTime interface BetDataSource { - fun getAllBets(): List + fun getAllBets(filters: List): List fun getBetById(id: String): Bet? fun getBetDetailById(id: String, username: String): BetDetail? fun getBetsNotFinished(): List diff --git a/Sources/src/main/kotlin/allin/data/mock/MockBetDataSource.kt b/Sources/src/main/kotlin/allin/data/mock/MockBetDataSource.kt index 20a20ec..123768b 100644 --- a/Sources/src/main/kotlin/allin/data/mock/MockBetDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/mock/MockBetDataSource.kt @@ -15,7 +15,42 @@ class MockBetDataSource(private val mockData: MockDataSource.MockData) : BetData private val betInfos get() = mockData.betInfos private val answerInfos get() = mockData.answerInfos - override fun getAllBets(): List = bets + override fun getAllBets(filters: List): List { + return when { + filters.isEmpty() -> bets + + filters.size == 1 -> { + val filter = filters[0] + + when (filter) { + BetFilter.PUBLIC -> bets.filter { !it.isPrivate } + BetFilter.INVITATION -> bets.filter { it.isPrivate } + BetFilter.FINISHED -> bets.filter { it.status == FINISHED } + BetFilter.IN_PROGRESS -> bets.filter { + it.status in listOf(IN_PROGRESS, WAITING, CLOSING) + } + }.map { it } + } + + else -> { + bets.filter { bet -> + val public = (BetFilter.PUBLIC in filters) && !bet.isPrivate + val invitation = (BetFilter.INVITATION in filters) && bet.isPrivate + val finished = + (BetFilter.FINISHED in filters) and ((bet.status == FINISHED) or (bet.status == CANCELLED)) + val inProgress = (BetFilter.IN_PROGRESS in filters) and (bet.status in listOf( + IN_PROGRESS, + WAITING, + CLOSING + )) + + (public || invitation) && (finished or inProgress) + }.map { it } + } + } + + } + override fun getBetById(id: String): Bet? = bets.find { it.id == id } diff --git a/Sources/src/main/kotlin/allin/data/postgres/PostgresBetDataSource.kt b/Sources/src/main/kotlin/allin/data/postgres/PostgresBetDataSource.kt index f650a69..cbd3090 100644 --- a/Sources/src/main/kotlin/allin/data/postgres/PostgresBetDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/postgres/PostgresBetDataSource.kt @@ -11,8 +11,41 @@ import java.time.ZonedDateTime class PostgresBetDataSource(private val database: Database) : BetDataSource { - override fun getAllBets(): List = - database.bets.map { it.toBet(database) } + 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 + )) + + (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) @@ -21,7 +54,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/data/postgres/entities/BetResultNotificationEntity.kt b/Sources/src/main/kotlin/allin/data/postgres/entities/BetResultNotificationEntity.kt index 8ee4496..8662cca 100644 --- a/Sources/src/main/kotlin/allin/data/postgres/entities/BetResultNotificationEntity.kt +++ b/Sources/src/main/kotlin/allin/data/postgres/entities/BetResultNotificationEntity.kt @@ -14,8 +14,8 @@ interface BetResultNotificationEntity : Entity { } object BetResultNotificationsEntity : Table("betresultnotification") { - val betId = varchar("betid").primaryKey() - val username = varchar("username").primaryKey() + val betId = varchar("betid").primaryKey().bindTo { it.betId } + val username = varchar("username").primaryKey().bindTo { it.username } } val Database.betResultNotifications get() = this.sequenceOf(BetResultNotificationsEntity) \ No newline at end of file diff --git a/Sources/src/main/kotlin/allin/model/BetFilter.kt b/Sources/src/main/kotlin/allin/model/BetFilter.kt new file mode 100644 index 0000000..268d1bb --- /dev/null +++ b/Sources/src/main/kotlin/allin/model/BetFilter.kt @@ -0,0 +1,15 @@ +package allin.model + +import kotlinx.serialization.Serializable + +enum class BetFilter { + PUBLIC, + INVITATION, + IN_PROGRESS, + FINISHED +} + +@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 2cc737f..57a810c 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,7 +80,11 @@ fun Application.betRouter() { }) { hasToken { principal -> verifyUserFromToken(userDataSource, principal) { _, _ -> - call.respond(HttpStatusCode.Accepted, betDataSource.getAllBets()) + 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)) } } } From f68a7e7d64d9fec2d2eacba0ab42706fe9a43fec Mon Sep 17 00:00:00 2001 From: Lucas EVARD Date: Tue, 21 May 2024 14:30:02 +0200 Subject: [PATCH 5/5] [db] Raise database --- .drone.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.star b/.drone.star index 32cb14a..5910419 100644 --- a/.drone.star +++ b/.drone.star @@ -2,7 +2,7 @@ def main(ctx): commit_message = ctx.build.message.lower() if "readme.md" in commit_message or "[no_ci]" in commit_message: return nullPipeline() - + if "[db]" in commit_message: return [ ci(ctx),