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
COMMAND: create
OVERWRITE: true
CODEFIRST_CLIENTDRONE_ENV_DATA_SOURCE: postgres
CODEFIRST_CLIENTDRONE_ENV_POSTGRES_DB:
from_secret: db_database
CODEFIRST_CLIENTDRONE_ENV_POSTGRES_USER:

@ -4,9 +4,12 @@ import allin.database
import allin.dto.UserDTO
import allin.model.User
import allin.utils.Execute
import allin.utils.ExecuteWithResult
import org.ktorm.database.use
import org.ktorm.dsl.*
import org.ktorm.entity.*
import org.ktorm.schema.*
import java.time.Instant.now
import java.util.UUID.fromString
interface UserEntity : Entity<UserEntity> {
@ -21,6 +24,8 @@ object UsersEntity : Table<UserEntity>("utilisateur") {
val password = varchar("password")
val nbCoins = int("coins")
val email = varchar("email")
val lastGift = timestamp("lastgift")
fun getUserToUserDTO(): MutableList<UserDTO> {
return database.from(UsersEntity).select().map {
@ -35,14 +40,20 @@ object UsersEntity : Table<UserEntity>("utilisateur") {
}
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)
}
fun modifyCoins(user: String, cost : Int){
val request = "UPDATE utilisateur SET coins = coins - $cost WHERE username = '$user';"
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?> {
@ -71,6 +82,7 @@ object UsersEntity : Table<UserEntity>("utilisateur") {
set(it.username,user.username)
set(it.password,user.password)
set(it.email,user.email)
set(it.lastGift,now())
}
}
fun deleteUserByUsername(username: String): Boolean {
@ -79,6 +91,27 @@ object UsersEntity : Table<UserEntity>("utilisateur") {
}
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,7 +1,7 @@
package allin.model
import kotlinx.serialization.Serializable
import kotlin.random.Random
@Serializable
data class User(
@ -25,3 +25,7 @@ data class CheckUser(
val login: String,
val password: String
)
fun getDailyGift() : Int{
return Random.nextInt(10,150)
}

@ -1,15 +1,14 @@
package allin.routing
import allin.entities.UsersEntity.addCoinByUsername
import allin.entities.UsersEntity.addUserEntity
import allin.entities.UsersEntity.canHaveDailyGift
import allin.entities.UsersEntity.deleteUserByUsername
import allin.entities.UsersEntity.getUserByUsernameAndPassword
import allin.entities.UsersEntity.getUserToUserDTO
import allin.ext.hasToken
import allin.ext.verifyUserFromToken
import allin.model.ApiMessage
import allin.model.CheckUser
import allin.model.User
import allin.model.UserRequest
import allin.model.*
import allin.utils.AppConfig
import io.ktor.http.*
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 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){
if(!request.isNullOrEmpty())

Loading…
Cancel
Save