From 20ce4c152b06865842bab8bd4e9ab4d6cadd8fc1 Mon Sep 17 00:00:00 2001 From: luevard <99143550+saucepommefrite@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:42:44 +0100 Subject: [PATCH 1/5] :sparkles: ParticipationEntity creation --- Sources/src/main/kotlin/allin/Application.kt | 6 +- Sources/src/main/kotlin/allin/dto/UserDTO.kt | 2 +- .../allin/entities/ParticipationEntity.kt | 60 +++++++++++++++++++ .../main/kotlin/allin/entities/UserEntity.kt | 8 +-- .../src/main/kotlin/allin/model/BetDetail.kt | 16 +++++ .../main/kotlin/allin/routing/BetRouter.kt | 4 +- .../allin/routing/ParticipationRouter.kt | 12 ++-- 7 files changed, 93 insertions(+), 15 deletions(-) create mode 100644 Sources/src/main/kotlin/allin/entities/ParticipationEntity.kt create mode 100644 Sources/src/main/kotlin/allin/model/BetDetail.kt diff --git a/Sources/src/main/kotlin/allin/Application.kt b/Sources/src/main/kotlin/allin/Application.kt index 826268a..ab801cd 100644 --- a/Sources/src/main/kotlin/allin/Application.kt +++ b/Sources/src/main/kotlin/allin/Application.kt @@ -1,9 +1,6 @@ package allin -import allin.entities.BetEntity -import allin.entities.BetsEntity -import allin.entities.ResponsesEntity -import allin.entities.UsersEntity +import allin.entities.* import allin.routing.BasicRouting import allin.routing.BetRouter import allin.routing.ParticipationRouter @@ -57,4 +54,5 @@ private fun Application.extracted() { UsersEntity.createUserTable() BetsEntity.createBetsTable() ResponsesEntity.createResponseTable() + ParticipationsEntity.createParticipationTable() } diff --git a/Sources/src/main/kotlin/allin/dto/UserDTO.kt b/Sources/src/main/kotlin/allin/dto/UserDTO.kt index c0bec1d..2ed2a42 100644 --- a/Sources/src/main/kotlin/allin/dto/UserDTO.kt +++ b/Sources/src/main/kotlin/allin/dto/UserDTO.kt @@ -1,4 +1,4 @@ package allin.dto import kotlinx.serialization.Serializable @Serializable -data class UserDTO(val id: String, val username: String, val email: String, val nbCoins: Double, var token:String?) +data class UserDTO(val id: String, val username: String, val email: String, val nbCoins: Int, var token:String?) diff --git a/Sources/src/main/kotlin/allin/entities/ParticipationEntity.kt b/Sources/src/main/kotlin/allin/entities/ParticipationEntity.kt new file mode 100644 index 0000000..56fe17d --- /dev/null +++ b/Sources/src/main/kotlin/allin/entities/ParticipationEntity.kt @@ -0,0 +1,60 @@ +package allin.entities + +import allin.database +import allin.model.Participation +import allin.utils.Execute +import org.ktorm.dsl.* +import org.ktorm.entity.Entity +import org.ktorm.schema.* +import java.util.* + +interface ParticipationEntity : Entity { + val id: String + val betId: String + val username: String + val answer: String + val stake: Int +} + + +object ParticipationsEntity : Table("participation") { + val id = uuid("id").primaryKey() + val betId = uuid("bet") + val username = varchar("username") + val answer = varchar("answer") + val stake = int("stake") + + fun createParticipationTable(){ + val request="CREATE TABLE IF NOT EXISTS participation (id uuid PRIMARY KEY,bet uuid,username varchar(250),answer varchar(250),stake int);" + database.Execute(request) + } + + fun addParticipationEntity(participation : Participation){ + database.insert(ParticipationsEntity){ + set(it.id, UUID.fromString(participation.id)) + set(it.betId,UUID.fromString(participation.betId)) + set(it.username,participation.username) + set(it.answer,participation.answer) + set(it.stake,participation.stake) + } + } + + fun getParticipationEntity(): MutableList { + return database.from(ParticipationsEntity).select().map { + row -> Participation( + row[id].toString(), + row[betId].toString(), + row[username].toString(), + row[answer].toString(), + row[stake]?:0, + ) + }.toMutableList() + } + + fun deleteParticipation(participation: Participation): Boolean { + val deletedCount = database.delete(ParticipationsEntity) { + it.id eq UUID.fromString(participation.id) + } + return deletedCount > 0 + } +} \ No newline at end of file diff --git a/Sources/src/main/kotlin/allin/entities/UserEntity.kt b/Sources/src/main/kotlin/allin/entities/UserEntity.kt index 9a1bcfc..81caae5 100644 --- a/Sources/src/main/kotlin/allin/entities/UserEntity.kt +++ b/Sources/src/main/kotlin/allin/entities/UserEntity.kt @@ -14,13 +14,13 @@ interface UserEntity : Entity { val username: String var email: String var password: String - var nbCoins: Double + var nbCoins: Int } object UsersEntity : Table("utilisateur") { val id = uuid("id").primaryKey() val username = varchar("username") val password = varchar("password") - val nbCoins = double("coins") + val nbCoins = int("coins") val email = varchar("email") fun getUserToUserDTO(): MutableList { @@ -29,7 +29,7 @@ object UsersEntity : Table("utilisateur") { row[id].toString(), row[username].toString(), row[email].toString(), - row[nbCoins]?:0.0, + row[nbCoins]?:0, null ) }.toMutableList() @@ -51,7 +51,7 @@ object UsersEntity : Table("utilisateur") { row[id].toString(), row[username].toString(), row[email].toString(), - row[nbCoins] ?: 0.0, + row[nbCoins]?:0, null ), row[password].toString() diff --git a/Sources/src/main/kotlin/allin/model/BetDetail.kt b/Sources/src/main/kotlin/allin/model/BetDetail.kt new file mode 100644 index 0000000..c60da55 --- /dev/null +++ b/Sources/src/main/kotlin/allin/model/BetDetail.kt @@ -0,0 +1,16 @@ +package allin.model + +data class BetAnswerDetail( + val response: String, // La réponse (ex: "Yes", "No" etc...) + val totalStakes: Int, // Le nombre total d'argent misé sur cette réponse + val totalParticipants: Int, // Le nombre total de participant + val highestStake: Int, // Plus grosse mise + val odds: Float // Cote du bet +) + +data class BetDetail( + val bet: Bet, // Le Bet + val answers: List, // Pour chaque réponse possible du bet les détails + val participations: List, // La liste des participations + val userParticipation: Participation? // La participation du User current +) \ 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 619cb55..f2f79d6 100644 --- a/Sources/src/main/kotlin/allin/routing/BetRouter.kt +++ b/Sources/src/main/kotlin/allin/routing/BetRouter.kt @@ -2,6 +2,8 @@ package allin.routing import allin.entities.BetsEntity.addBetEntity import allin.entities.BetsEntity.getBets +import allin.entities.ParticipationsEntity +import allin.entities.ParticipationsEntity.getParticipationEntity import allin.ext.hasToken import allin.ext.verifyUserFromToken import allin.model.ApiMessage @@ -100,7 +102,7 @@ fun Application.BetRouter() { val bets= getBets() hasToken { principal -> verifyUserFromToken(principal) { user, _ -> - val bets = participations + val bets = getParticipationEntity() .filter { it.username == user.username } .mapNotNull { itParticipation -> bets.find { it.id == itParticipation.betId } } call.respond(HttpStatusCode.OK, bets) diff --git a/Sources/src/main/kotlin/allin/routing/ParticipationRouter.kt b/Sources/src/main/kotlin/allin/routing/ParticipationRouter.kt index b56551e..ba05523 100644 --- a/Sources/src/main/kotlin/allin/routing/ParticipationRouter.kt +++ b/Sources/src/main/kotlin/allin/routing/ParticipationRouter.kt @@ -1,5 +1,8 @@ package allin.routing +import allin.entities.ParticipationsEntity.addParticipationEntity +import allin.entities.ParticipationsEntity.deleteParticipation +import allin.entities.ParticipationsEntity.getParticipationEntity import allin.ext.hasToken import allin.ext.verifyUserFromToken import allin.model.ApiMessage @@ -13,8 +16,6 @@ import io.ktor.server.response.* import io.ktor.server.routing.* import java.util.* -val participations = mutableListOf() - fun Application.ParticipationRouter() { routing { authenticate { @@ -23,7 +24,7 @@ fun Application.ParticipationRouter() { val participation = call.receive() verifyUserFromToken(principal) { user, _ -> if (user.nbCoins >= participation.stake) { - participations.add( + addParticipationEntity( Participation( id = UUID.randomUUID().toString(), betId = participation.betId, @@ -42,10 +43,11 @@ fun Application.ParticipationRouter() { delete("/participations/delete") { hasToken { principal -> val participationId = call.receive() - participations.find { it.id == participationId }?.let { participation -> + getParticipationEntity().find { it.id == participationId }?.let { participation -> verifyUserFromToken(principal) { _, _ -> // user.nbCoins += participation.stake - participations.remove(participation) + //participations.remove(participation) + deleteParticipation(participation) call.respond(HttpStatusCode.NoContent) } } ?: call.respond(HttpStatusCode.NotFound, ApiMessage.ParticipationNotFound) From 131d7b56be690188f1b26cc926fdfd0241479e0b Mon Sep 17 00:00:00 2001 From: luevard <99143550+saucepommefrite@users.noreply.github.com> Date: Tue, 23 Jan 2024 18:49:44 +0100 Subject: [PATCH 2/5] :sparkles: Add BetDetail and BetAnswerDetail --- Sources/src/main/kotlin/allin/Application.kt | 6 +-- .../allin/entities/ParticipationEntity.kt | 30 +++++++++++++ .../main/kotlin/allin/entities/UserEntity.kt | 6 ++- .../src/main/kotlin/allin/model/BetAction.kt | 5 --- .../src/main/kotlin/allin/model/BetDetail.kt | 22 +++++++++- .../kotlin/allin/routing/BetActionRouter.kt | 11 ----- .../kotlin/allin/routing/BetDetailRouter.kt | 44 +++++++++++++++++++ .../main/kotlin/allin/routing/BetRouter.kt | 1 - .../allin/routing/ParticipationRouter.kt | 4 +- 9 files changed, 103 insertions(+), 26 deletions(-) delete mode 100644 Sources/src/main/kotlin/allin/model/BetAction.kt delete mode 100644 Sources/src/main/kotlin/allin/routing/BetActionRouter.kt create mode 100644 Sources/src/main/kotlin/allin/routing/BetDetailRouter.kt diff --git a/Sources/src/main/kotlin/allin/Application.kt b/Sources/src/main/kotlin/allin/Application.kt index ab801cd..0de0d66 100644 --- a/Sources/src/main/kotlin/allin/Application.kt +++ b/Sources/src/main/kotlin/allin/Application.kt @@ -1,10 +1,7 @@ package allin import allin.entities.* -import allin.routing.BasicRouting -import allin.routing.BetRouter -import allin.routing.ParticipationRouter -import allin.routing.UserRouter +import allin.routing.* import allin.utils.* import com.typesafe.config.ConfigFactory import io.ktor.serialization.kotlinx.json.* @@ -51,6 +48,7 @@ private fun Application.extracted() { UserRouter() BetRouter() ParticipationRouter() + BetDetailRouter() UsersEntity.createUserTable() BetsEntity.createBetsTable() ResponsesEntity.createResponseTable() diff --git a/Sources/src/main/kotlin/allin/entities/ParticipationEntity.kt b/Sources/src/main/kotlin/allin/entities/ParticipationEntity.kt index 56fe17d..5684f8f 100644 --- a/Sources/src/main/kotlin/allin/entities/ParticipationEntity.kt +++ b/Sources/src/main/kotlin/allin/entities/ParticipationEntity.kt @@ -39,6 +39,36 @@ object ParticipationsEntity : Table("participation") { } } + fun getParticipationEntityFromBetId(betid: String): MutableList { + return database.from(ParticipationsEntity) + .select() + .where { betId eq UUID.fromString(betid) } + .map { row -> + Participation( + row[id].toString(), + row[betId].toString(), + row[username].toString(), + row[answer].toString(), + row[stake] ?: 0, + ) + }.toMutableList() + } + + fun getParticipationEntityFromUserId(user: String, betid: String): MutableList { + return database.from(ParticipationsEntity) + .select() + .where { (betId eq UUID.fromString(betid)) and (username eq user) } + .map { row -> + Participation( + row[id].toString(), + row[betId].toString(), + row[username].toString(), + row[answer].toString(), + row[stake] ?: 0, + ) + }.toMutableList() + } + fun getParticipationEntity(): MutableList { return database.from(ParticipationsEntity).select().map { row -> Participation( diff --git a/Sources/src/main/kotlin/allin/entities/UserEntity.kt b/Sources/src/main/kotlin/allin/entities/UserEntity.kt index 81caae5..9e1614f 100644 --- a/Sources/src/main/kotlin/allin/entities/UserEntity.kt +++ b/Sources/src/main/kotlin/allin/entities/UserEntity.kt @@ -7,7 +7,6 @@ import allin.utils.Execute import org.ktorm.dsl.* import org.ktorm.entity.* import org.ktorm.schema.* -import java.util.* import java.util.UUID.fromString interface UserEntity : Entity { @@ -40,6 +39,11 @@ object UsersEntity : Table("utilisateur") { database.Execute(request) } + fun modifyCoins(user: String, cost : Int){ + val request = "UPDATE utilisateur SET coins = coins - $cost WHERE username = '$user';" + database.Execute(request) + + } fun getUserByUsernameAndPassword(login: String): Pair { return database.from(UsersEntity) diff --git a/Sources/src/main/kotlin/allin/model/BetAction.kt b/Sources/src/main/kotlin/allin/model/BetAction.kt deleted file mode 100644 index 2f2298b..0000000 --- a/Sources/src/main/kotlin/allin/model/BetAction.kt +++ /dev/null @@ -1,5 +0,0 @@ -package allin.model - -import allin.dto.UserDTO -data class BetAction(val id:Int, val coins: Int, val user: String, val bet: Int) -data class BetActionCompleted(val id:Int, val coins: Int, val user: UserDTO, val bet: Bet) diff --git a/Sources/src/main/kotlin/allin/model/BetDetail.kt b/Sources/src/main/kotlin/allin/model/BetDetail.kt index c60da55..d44c62b 100644 --- a/Sources/src/main/kotlin/allin/model/BetDetail.kt +++ b/Sources/src/main/kotlin/allin/model/BetDetail.kt @@ -1,5 +1,8 @@ package allin.model +import kotlinx.serialization.Serializable + +@Serializable data class BetAnswerDetail( val response: String, // La réponse (ex: "Yes", "No" etc...) val totalStakes: Int, // Le nombre total d'argent misé sur cette réponse @@ -8,9 +11,24 @@ data class BetAnswerDetail( val odds: Float // Cote du bet ) +@Serializable data class BetDetail( val bet: Bet, // Le Bet - val answers: List, // Pour chaque réponse possible du bet les détails + val answers: List?, // Pour chaque réponse possible du bet les détails val participations: List, // La liste des participations val userParticipation: Participation? // La participation du User current -) \ No newline at end of file +) + +fun getBetAnswerDetail(participations: List): List { + val groupedParticipations = participations.groupBy { it.answer } + val betAnswerDetails = mutableListOf() + for ((answer, participationList) in groupedParticipations) { + val totalStakes = participationList.sumBy { it.stake } + val totalParticipants = participationList.size + val highestStake = participationList.maxByOrNull { it.stake }?.stake ?: 0 + val odds = 1.0f + val betAnswerDetail = BetAnswerDetail(answer, totalStakes, totalParticipants, highestStake, odds) + betAnswerDetails.add(betAnswerDetail) + } + return betAnswerDetails +} diff --git a/Sources/src/main/kotlin/allin/routing/BetActionRouter.kt b/Sources/src/main/kotlin/allin/routing/BetActionRouter.kt deleted file mode 100644 index bd91f03..0000000 --- a/Sources/src/main/kotlin/allin/routing/BetActionRouter.kt +++ /dev/null @@ -1,11 +0,0 @@ -package allin.routing - -import io.ktor.server.application.* -import io.ktor.server.routing.* - -fun Application.BetActionRouter(){ - routing { - route("/BetAction/add"){ - } - } -} diff --git a/Sources/src/main/kotlin/allin/routing/BetDetailRouter.kt b/Sources/src/main/kotlin/allin/routing/BetDetailRouter.kt new file mode 100644 index 0000000..ca16441 --- /dev/null +++ b/Sources/src/main/kotlin/allin/routing/BetDetailRouter.kt @@ -0,0 +1,44 @@ +package allin.routing + +import allin.entities.BetsEntity.getBets +import allin.entities.ParticipationsEntity.getParticipationEntityFromBetId +import allin.entities.ParticipationsEntity.getParticipationEntityFromUserId +import allin.ext.hasToken +import allin.ext.verifyUserFromToken +import allin.model.BetDetail +import allin.model.getBetAnswerDetail +import io.ktor.http.* +import io.ktor.server.application.* +import io.ktor.server.auth.* +import io.ktor.server.response.* +import io.ktor.server.routing.* + +fun Application.BetDetailRouter() { + routing { + authenticate { + get("/BetDetail/get/{id}") { + hasToken { principal -> + verifyUserFromToken(principal) { user, _ -> + val id = call.parameters["id"].toString() + val participations = getParticipationEntityFromBetId(id) + val selectedBet = getBets().find { it.id == id } + if (selectedBet != null) { + call.respond( + HttpStatusCode.Accepted, + BetDetail( + selectedBet, + getBetAnswerDetail(participations), + participations.toList(), + getParticipationEntityFromUserId(user.username,id).last() + ) + ) + } else { + call.respond(HttpStatusCode.NotFound, "Bet not found") + } + } + } + } + } + } + } + diff --git a/Sources/src/main/kotlin/allin/routing/BetRouter.kt b/Sources/src/main/kotlin/allin/routing/BetRouter.kt index f2f79d6..8a20b33 100644 --- a/Sources/src/main/kotlin/allin/routing/BetRouter.kt +++ b/Sources/src/main/kotlin/allin/routing/BetRouter.kt @@ -2,7 +2,6 @@ package allin.routing import allin.entities.BetsEntity.addBetEntity import allin.entities.BetsEntity.getBets -import allin.entities.ParticipationsEntity import allin.entities.ParticipationsEntity.getParticipationEntity import allin.ext.hasToken import allin.ext.verifyUserFromToken diff --git a/Sources/src/main/kotlin/allin/routing/ParticipationRouter.kt b/Sources/src/main/kotlin/allin/routing/ParticipationRouter.kt index ba05523..acafa86 100644 --- a/Sources/src/main/kotlin/allin/routing/ParticipationRouter.kt +++ b/Sources/src/main/kotlin/allin/routing/ParticipationRouter.kt @@ -3,6 +3,7 @@ package allin.routing import allin.entities.ParticipationsEntity.addParticipationEntity import allin.entities.ParticipationsEntity.deleteParticipation import allin.entities.ParticipationsEntity.getParticipationEntity +import allin.entities.UsersEntity.modifyCoins import allin.ext.hasToken import allin.ext.verifyUserFromToken import allin.model.ApiMessage @@ -33,6 +34,7 @@ fun Application.ParticipationRouter() { stake = participation.stake ) ) + modifyCoins(user.username,participation.stake) call.respond(HttpStatusCode.Created) } else { call.respond(HttpStatusCode.Forbidden, ApiMessage.NotEnoughCoins) @@ -45,8 +47,6 @@ fun Application.ParticipationRouter() { val participationId = call.receive() getParticipationEntity().find { it.id == participationId }?.let { participation -> verifyUserFromToken(principal) { _, _ -> - // user.nbCoins += participation.stake - //participations.remove(participation) deleteParticipation(participation) call.respond(HttpStatusCode.NoContent) } From fb0d8ba1b74dfcfe4a0d2fc6b5f2496b61c7eaef Mon Sep 17 00:00:00 2001 From: luevard <99143550+saucepommefrite@users.noreply.github.com> Date: Tue, 23 Jan 2024 19:46:28 +0100 Subject: [PATCH 3/5] :sparkles: Pattern Format --- Sources/src/main/kotlin/allin/routing/BetRouter.kt | 2 -- Sources/src/main/kotlin/allin/serializer/DateSerializer.kt | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Sources/src/main/kotlin/allin/routing/BetRouter.kt b/Sources/src/main/kotlin/allin/routing/BetRouter.kt index 8a20b33..7f7db78 100644 --- a/Sources/src/main/kotlin/allin/routing/BetRouter.kt +++ b/Sources/src/main/kotlin/allin/routing/BetRouter.kt @@ -17,7 +17,6 @@ import io.ktor.server.response.* import io.ktor.server.routing.* import java.util.* -//val bets = mutableListOf() val tokenManagerBet = AppConfig.tokenManager fun Application.BetRouter() { @@ -43,7 +42,6 @@ fun Application.BetRouter() { bet.response, username ) - //bets.add(betWithId) addBetEntity(betWithId) call.respond(HttpStatusCode.Created, betWithId) } diff --git a/Sources/src/main/kotlin/allin/serializer/DateSerializer.kt b/Sources/src/main/kotlin/allin/serializer/DateSerializer.kt index febe993..5ef9fdf 100644 --- a/Sources/src/main/kotlin/allin/serializer/DateSerializer.kt +++ b/Sources/src/main/kotlin/allin/serializer/DateSerializer.kt @@ -16,7 +16,7 @@ import java.time.format.DateTimeFormatter @Serializer(ZonedDateTime::class) object ZonedDateTimeSerializer : KSerializer { - private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z") + private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss Z") override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("ZonedDateTime", PrimitiveKind.STRING) From c252415b6e4ba78b282fcda057ca546eb38c5ec8 Mon Sep 17 00:00:00 2001 From: luevard <99143550+saucepommefrite@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:41:59 +0100 Subject: [PATCH 4/5] :sparkles: Patch Empty List --- Sources/src/main/kotlin/allin/model/BetDetail.kt | 2 +- Sources/src/main/kotlin/allin/routing/BetDetailRouter.kt | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Sources/src/main/kotlin/allin/model/BetDetail.kt b/Sources/src/main/kotlin/allin/model/BetDetail.kt index d44c62b..387d43f 100644 --- a/Sources/src/main/kotlin/allin/model/BetDetail.kt +++ b/Sources/src/main/kotlin/allin/model/BetDetail.kt @@ -15,7 +15,7 @@ data class BetAnswerDetail( data class BetDetail( val bet: Bet, // Le Bet val answers: List?, // Pour chaque réponse possible du bet les détails - val participations: List, // La liste des participations + val participations: List?, // La liste des participations val userParticipation: Participation? // La participation du User current ) diff --git a/Sources/src/main/kotlin/allin/routing/BetDetailRouter.kt b/Sources/src/main/kotlin/allin/routing/BetDetailRouter.kt index ca16441..b093e67 100644 --- a/Sources/src/main/kotlin/allin/routing/BetDetailRouter.kt +++ b/Sources/src/main/kotlin/allin/routing/BetDetailRouter.kt @@ -6,6 +6,7 @@ import allin.entities.ParticipationsEntity.getParticipationEntityFromUserId import allin.ext.hasToken import allin.ext.verifyUserFromToken import allin.model.BetDetail +import allin.model.Participation import allin.model.getBetAnswerDetail import io.ktor.http.* import io.ktor.server.application.* @@ -16,7 +17,7 @@ import io.ktor.server.routing.* fun Application.BetDetailRouter() { routing { authenticate { - get("/BetDetail/get/{id}") { + get("/betdetail/get/{id}") { hasToken { principal -> verifyUserFromToken(principal) { user, _ -> val id = call.parameters["id"].toString() @@ -29,7 +30,7 @@ fun Application.BetDetailRouter() { selectedBet, getBetAnswerDetail(participations), participations.toList(), - getParticipationEntityFromUserId(user.username,id).last() + getParticipationEntityFromUserId(user.username,id).lastOrNull() ) ) } else { From 340772040d05045329ab5686053b3697e5f7bfc3 Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Tue, 23 Jan 2024 21:02:04 +0100 Subject: [PATCH 5/5] Fix getBetAnswerDetail --- .../src/main/kotlin/allin/model/BetDetail.kt | 22 +++++++++--------- .../kotlin/allin/routing/BetDetailRouter.kt | 23 +++++++++---------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/Sources/src/main/kotlin/allin/model/BetDetail.kt b/Sources/src/main/kotlin/allin/model/BetDetail.kt index 387d43f..757b297 100644 --- a/Sources/src/main/kotlin/allin/model/BetDetail.kt +++ b/Sources/src/main/kotlin/allin/model/BetDetail.kt @@ -19,16 +19,16 @@ data class BetDetail( val userParticipation: Participation? // La participation du User current ) -fun getBetAnswerDetail(participations: List): List { - val groupedParticipations = participations.groupBy { it.answer } - val betAnswerDetails = mutableListOf() - for ((answer, participationList) in groupedParticipations) { - val totalStakes = participationList.sumBy { it.stake } - val totalParticipants = participationList.size - val highestStake = participationList.maxByOrNull { it.stake }?.stake ?: 0 - val odds = 1.0f - val betAnswerDetail = BetAnswerDetail(answer, totalStakes, totalParticipants, highestStake, odds) - betAnswerDetails.add(betAnswerDetail) +fun getBetAnswerDetail(bet: Bet, participations: List): List { + return bet.response.map { response -> + val responseParticipations = participations.filter { it.answer == response } + BetAnswerDetail( + response = response, + totalStakes = responseParticipations.sumOf { it.stake }, + totalParticipants = responseParticipations.size, + highestStake = responseParticipations.maxOfOrNull { it.stake } ?: 0, + odds = if (participations.isEmpty()) 1f else responseParticipations.size / participations.size.toFloat() + ) } - return betAnswerDetails + } diff --git a/Sources/src/main/kotlin/allin/routing/BetDetailRouter.kt b/Sources/src/main/kotlin/allin/routing/BetDetailRouter.kt index b093e67..8596f34 100644 --- a/Sources/src/main/kotlin/allin/routing/BetDetailRouter.kt +++ b/Sources/src/main/kotlin/allin/routing/BetDetailRouter.kt @@ -6,7 +6,6 @@ import allin.entities.ParticipationsEntity.getParticipationEntityFromUserId import allin.ext.hasToken import allin.ext.verifyUserFromToken import allin.model.BetDetail -import allin.model.Participation import allin.model.getBetAnswerDetail import io.ktor.http.* import io.ktor.server.application.* @@ -24,22 +23,22 @@ fun Application.BetDetailRouter() { val participations = getParticipationEntityFromBetId(id) val selectedBet = getBets().find { it.id == id } if (selectedBet != null) { - call.respond( - HttpStatusCode.Accepted, - BetDetail( - selectedBet, - getBetAnswerDetail(participations), - participations.toList(), - getParticipationEntityFromUserId(user.username,id).lastOrNull() - ) + call.respond( + HttpStatusCode.Accepted, + BetDetail( + selectedBet, + getBetAnswerDetail(selectedBet, participations), + participations.toList(), + getParticipationEntityFromUserId(user.username, id).lastOrNull() ) - } else { - call.respond(HttpStatusCode.NotFound, "Bet not found") - } + ) + } else { + call.respond(HttpStatusCode.NotFound, "Bet not found") } } } } } } +}