diff --git a/.drone.yml b/.drone.yml index 76a7bb8..d86e2e8 100644 --- a/.drone.yml +++ b/.drone.yml @@ -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: diff --git a/Sources/src/main/kotlin/allin/entities/UserEntity.kt b/Sources/src/main/kotlin/allin/entities/UserEntity.kt index 9e1614f..1bb82ea 100644 --- a/Sources/src/main/kotlin/allin/entities/UserEntity.kt +++ b/Sources/src/main/kotlin/allin/entities/UserEntity.kt @@ -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 { @@ -21,28 +24,36 @@ object UsersEntity : Table("utilisateur") { val password = varchar("password") val nbCoins = int("coins") val email = varchar("email") + val lastGift = timestamp("lastgift") + fun getUserToUserDTO(): MutableList { return database.from(UsersEntity).select().map { - row -> UserDTO( - row[id].toString(), - row[username].toString(), - row[email].toString(), - row[nbCoins]?:0, - null - ) + row -> UserDTO( + row[id].toString(), + row[username].toString(), + row[email].toString(), + row[nbCoins]?:0, + null + ) }.toMutableList() } 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 { @@ -55,7 +66,7 @@ object UsersEntity : Table("utilisateur") { row[id].toString(), row[username].toString(), row[email].toString(), - row[nbCoins]?:0, + row[nbCoins] ?: 0, null ), row[password].toString() @@ -71,6 +82,7 @@ object UsersEntity : Table("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("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 + } + } + diff --git a/Sources/src/main/kotlin/allin/model/User.kt b/Sources/src/main/kotlin/allin/model/User.kt index 70a74be..9930da7 100644 --- a/Sources/src/main/kotlin/allin/model/User.kt +++ b/Sources/src/main/kotlin/allin/model/User.kt @@ -1,9 +1,9 @@ - package allin.model +package allin.model import kotlinx.serialization.Serializable +import kotlin.random.Random - -@Serializable + @Serializable data class User( val id: String, val username: String, @@ -24,4 +24,8 @@ data class UserRequest( data class CheckUser( val login: String, val password: String -) \ No newline at end of file +) + + fun getDailyGift() : Int{ + return Random.nextInt(10,150) + } diff --git a/Sources/src/main/kotlin/allin/routing/UserRouter.kt b/Sources/src/main/kotlin/allin/routing/UserRouter.kt index ff7f92a..88bd746 100644 --- a/Sources/src/main/kotlin/allin/routing/UserRouter.kt +++ b/Sources/src/main/kotlin/allin/routing/UserRouter.kt @@ -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é") + } + } + } } } } diff --git a/Sources/src/main/kotlin/allin/utils/DatabaseUtil.kt b/Sources/src/main/kotlin/allin/utils/DatabaseUtil.kt index 033afe4..28fefea 100644 --- a/Sources/src/main/kotlin/allin/utils/DatabaseUtil.kt +++ b/Sources/src/main/kotlin/allin/utils/DatabaseUtil.kt @@ -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())