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] :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) }