Add BetDetail and BetAnswerDetail
continuous-integration/drone/push Build is passing Details

pull/5/head
luevard 1 year ago
parent 20ce4c152b
commit 131d7b56be

@ -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()

@ -39,6 +39,36 @@ object ParticipationsEntity : Table<BetEntity>("participation") {
}
}
fun getParticipationEntityFromBetId(betid: String): MutableList<Participation> {
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<Participation> {
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<Participation> {
return database.from(ParticipationsEntity).select().map {
row -> Participation(

@ -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<UserEntity> {
@ -40,6 +39,11 @@ object UsersEntity : Table<UserEntity>("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<UserDTO?, String?> {
return database.from(UsersEntity)

@ -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)

@ -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<BetAnswerDetail>, // Pour chaque réponse possible du bet les détails
val answers: List<BetAnswerDetail>?, // Pour chaque réponse possible du bet les détails
val participations: List<Participation>, // La liste des participations
val userParticipation: Participation? // La participation du User current
)
)
fun getBetAnswerDetail(participations: List<Participation>): List<BetAnswerDetail> {
val groupedParticipations = participations.groupBy { it.answer }
val betAnswerDetails = mutableListOf<BetAnswerDetail>()
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
}

@ -1,11 +0,0 @@
package allin.routing
import io.ktor.server.application.*
import io.ktor.server.routing.*
fun Application.BetActionRouter(){
routing {
route("/BetAction/add"){
}
}
}

@ -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")
}
}
}
}
}
}
}

@ -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

@ -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<String>()
getParticipationEntity().find { it.id == participationId }?.let { participation ->
verifyUserFromToken(principal) { _, _ ->
// user.nbCoins += participation.stake
//participations.remove(participation)
deleteParticipation(participation)
call.respond(HttpStatusCode.NoContent)
}

Loading…
Cancel
Save