Merge pull request 'daily_gift' (#7) from daily_gift into master
continuous-integration/drone/push Build is passing Details

Reviewed-on: #7
pull/10/head
Lucas EVARD 1 year ago
commit d221ac0b88

@ -83,6 +83,7 @@ steps:
CONTAINERNAME: api CONTAINERNAME: api
COMMAND: create COMMAND: create
OVERWRITE: true OVERWRITE: true
CODEFIRST_CLIENTDRONE_ENV_DATA_SOURCE: postgres
CODEFIRST_CLIENTDRONE_ENV_POSTGRES_DB: CODEFIRST_CLIENTDRONE_ENV_POSTGRES_DB:
from_secret: db_database from_secret: db_database
CODEFIRST_CLIENTDRONE_ENV_POSTGRES_USER: CODEFIRST_CLIENTDRONE_ENV_POSTGRES_USER:

@ -4,9 +4,12 @@ import allin.database
import allin.dto.UserDTO import allin.dto.UserDTO
import allin.model.User import allin.model.User
import allin.utils.Execute import allin.utils.Execute
import allin.utils.ExecuteWithResult
import org.ktorm.database.use
import org.ktorm.dsl.* import org.ktorm.dsl.*
import org.ktorm.entity.* import org.ktorm.entity.*
import org.ktorm.schema.* import org.ktorm.schema.*
import java.time.Instant.now
import java.util.UUID.fromString import java.util.UUID.fromString
interface UserEntity : Entity<UserEntity> { interface UserEntity : Entity<UserEntity> {
@ -21,28 +24,36 @@ object UsersEntity : Table<UserEntity>("utilisateur") {
val password = varchar("password") val password = varchar("password")
val nbCoins = int("coins") val nbCoins = int("coins")
val email = varchar("email") val email = varchar("email")
val lastGift = timestamp("lastgift")
fun getUserToUserDTO(): MutableList<UserDTO> { fun getUserToUserDTO(): MutableList<UserDTO> {
return database.from(UsersEntity).select().map { return database.from(UsersEntity).select().map {
row -> UserDTO( row -> UserDTO(
row[id].toString(), row[id].toString(),
row[username].toString(), row[username].toString(),
row[email].toString(), row[email].toString(),
row[nbCoins]?:0, row[nbCoins]?:0,
null null
) )
}.toMutableList() }.toMutableList()
} }
fun createUserTable(){ fun createUserTable(){
val request="CREATE TABLE IF not exists utilisateur ( id uuid PRIMARY KEY, username VARCHAR(255), password VARCHAR(255),coins double precision,email VARCHAR(255))" val request="CREATE TABLE IF not exists utilisateur ( id uuid PRIMARY KEY, username VARCHAR(255), password VARCHAR(255),coins numeric,email VARCHAR(255), lastgift timestamp)"
database.Execute(request) database.Execute(request)
} }
fun modifyCoins(user: String, cost : Int){ fun modifyCoins(user: String, cost : Int){
val request = "UPDATE utilisateur SET coins = coins - $cost WHERE username = '$user';" val request = "UPDATE utilisateur SET coins = coins - $cost WHERE username = '$user';"
database.Execute(request) database.Execute(request)
}
fun addCoinByUsername(username: String, coins : Int){
database.update(UsersEntity){
set(nbCoins,coins+ nbCoins)
where {it.username eq username}
}
} }
fun getUserByUsernameAndPassword(login: String): Pair<UserDTO?, String?> { fun getUserByUsernameAndPassword(login: String): Pair<UserDTO?, String?> {
@ -55,7 +66,7 @@ object UsersEntity : Table<UserEntity>("utilisateur") {
row[id].toString(), row[id].toString(),
row[username].toString(), row[username].toString(),
row[email].toString(), row[email].toString(),
row[nbCoins]?:0, row[nbCoins] ?: 0,
null null
), ),
row[password].toString() row[password].toString()
@ -71,6 +82,7 @@ object UsersEntity : Table<UserEntity>("utilisateur") {
set(it.username,user.username) set(it.username,user.username)
set(it.password,user.password) set(it.password,user.password)
set(it.email,user.email) set(it.email,user.email)
set(it.lastGift,now())
} }
} }
fun deleteUserByUsername(username: String): Boolean { fun deleteUserByUsername(username: String): Boolean {
@ -79,6 +91,27 @@ object UsersEntity : Table<UserEntity>("utilisateur") {
} }
return deletedCount > 0 return deletedCount > 0
} }
fun canHaveDailyGift(username: String): Boolean {
val request = "SELECT CASE WHEN NOW() - lastgift > INTERVAL '1 day' THEN true ELSE false END AS is_lastgift_greater_than_1_day FROM utilisateur WHERE username = '$username';"
val resultSet = database.ExecuteWithResult(request)
resultSet?.use {
if (resultSet.next()) {
val isDailyGift = resultSet.getBoolean("is_lastgift_greater_than_1_day")
if (isDailyGift) {
database.update(UsersEntity) {
set(lastGift, now())
where { it.username eq username }
}
}
return isDailyGift
}
}
return false
}
} }

@ -1,9 +1,9 @@
package allin.model package allin.model
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlin.random.Random
@Serializable
@Serializable
data class User( data class User(
val id: String, val id: String,
val username: String, val username: String,
@ -24,4 +24,8 @@ data class UserRequest(
data class CheckUser( data class CheckUser(
val login: String, val login: String,
val password: String val password: String
) )
fun getDailyGift() : Int{
return Random.nextInt(10,150)
}

@ -1,15 +1,14 @@
package allin.routing package allin.routing
import allin.entities.UsersEntity.addCoinByUsername
import allin.entities.UsersEntity.addUserEntity import allin.entities.UsersEntity.addUserEntity
import allin.entities.UsersEntity.canHaveDailyGift
import allin.entities.UsersEntity.deleteUserByUsername import allin.entities.UsersEntity.deleteUserByUsername
import allin.entities.UsersEntity.getUserByUsernameAndPassword import allin.entities.UsersEntity.getUserByUsernameAndPassword
import allin.entities.UsersEntity.getUserToUserDTO import allin.entities.UsersEntity.getUserToUserDTO
import allin.ext.hasToken import allin.ext.hasToken
import allin.ext.verifyUserFromToken import allin.ext.verifyUserFromToken
import allin.model.ApiMessage import allin.model.*
import allin.model.CheckUser
import allin.model.User
import allin.model.UserRequest
import allin.utils.AppConfig import allin.utils.AppConfig
import io.ktor.http.* import io.ktor.http.*
import io.ktor.server.application.* import io.ktor.server.application.*
@ -93,6 +92,18 @@ fun Application.UserRouter() {
} }
} }
} }
get("/users/gift") {
hasToken { principal ->
verifyUserFromToken(principal) { userDto, _ ->
if(canHaveDailyGift(userDto.username)){
val dailyGift = getDailyGift()
addCoinByUsername(userDto.username,dailyGift)
call.respond(HttpStatusCode.OK,dailyGift)
}
else call.respond(HttpStatusCode.MethodNotAllowed,"Le cadeau ne peut pas être récupéré")
}
}
}
} }
} }
} }

@ -2,6 +2,23 @@ package allin.utils
import allin.database import allin.database
import org.ktorm.database.Database import org.ktorm.database.Database
import java.sql.ResultSet
fun Database.ExecuteWithResult(request: String): ResultSet? {
try {
if (!request.isNullOrEmpty()) {
return database.useTransaction { transaction ->
val connection = transaction.connection
val resultSet = connection.prepareStatement(request).executeQuery()
resultSet
}
}
} catch (e: Exception){
println(e.message)
return null
}
return null
}
fun Database.Execute(request: String){ fun Database.Execute(request: String){
if(!request.isNullOrEmpty()) if(!request.isNullOrEmpty())

Loading…
Cancel
Save