From 7ba9d2715d181d5e217547d80d2322a2596803f8 Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Mon, 5 Feb 2024 18:53:51 +0100 Subject: [PATCH] Merge Stub_Db --- .../main/kotlin/allin/data/UserDataSource.kt | 4 ++- .../allin/data/mock/MockUserDataSource.kt | 21 +++++++++++- .../allin/data/postgres/PostgresDataSource.kt | 3 +- .../data/postgres/PostgresUserDataSource.kt | 34 ++++++++++++++++++- .../main/kotlin/allin/entities/UserEntity.kt | 29 ---------------- .../allin/routing/ParticipationRouter.kt | 2 +- .../main/kotlin/allin/routing/UserRouter.kt | 11 +++--- .../main/kotlin/allin/utils/DatabaseUtil.kt | 6 ++-- 8 files changed, 67 insertions(+), 43 deletions(-) diff --git a/Sources/src/main/kotlin/allin/data/UserDataSource.kt b/Sources/src/main/kotlin/allin/data/UserDataSource.kt index 98c5eec..48680df 100644 --- a/Sources/src/main/kotlin/allin/data/UserDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/UserDataSource.kt @@ -14,8 +14,10 @@ interface UserDataSource { fun deleteUser(username: String): Boolean - fun modifyUserCoins(username: String, amount: Int) + fun addCoins(username: String, amount: Int) + fun removeCoins(username: String, amount: Int) fun userExists(username: String, email: String): Boolean + fun canHaveDailyGift(username: String): Boolean } \ No newline at end of file diff --git a/Sources/src/main/kotlin/allin/data/mock/MockUserDataSource.kt b/Sources/src/main/kotlin/allin/data/mock/MockUserDataSource.kt index 9a92856..b6e7a2b 100644 --- a/Sources/src/main/kotlin/allin/data/mock/MockUserDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/mock/MockUserDataSource.kt @@ -3,6 +3,7 @@ package allin.data.mock import allin.data.UserDataSource import allin.dto.UserDTO import allin.model.User +import java.time.ZonedDateTime class MockUserDataSource : UserDataSource { override fun getUserByUsername(username: String): Pair = @@ -26,16 +27,34 @@ class MockUserDataSource : UserDataSource { override fun deleteUser(username: String): Boolean = users.removeIf { it.username == username } - override fun modifyUserCoins(username: String, amount: Int) { + override fun addCoins(username: String, amount: Int) { users.find { it.username == username }?.let { it.nbCoins += amount } } + override fun removeCoins(username: String, amount: Int) { + users.find { it.username == username }?.let { + it.nbCoins -= amount + } + } + override fun userExists(username: String, email: String): Boolean = users.any { it.username == username && it.email == email } + override fun canHaveDailyGift(username: String): Boolean { + val value = lastGifts[username]?.let { + it.plusDays(1) <= ZonedDateTime.now() + } ?: true + lastGifts[username] = ZonedDateTime.now() + return value + } + private val users by lazy { mutableListOf() } + + private val lastGifts by lazy { + mutableMapOf() + } } \ No newline at end of file diff --git a/Sources/src/main/kotlin/allin/data/postgres/PostgresDataSource.kt b/Sources/src/main/kotlin/allin/data/postgres/PostgresDataSource.kt index fdc5e73..02e18ad 100644 --- a/Sources/src/main/kotlin/allin/data/postgres/PostgresDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/postgres/PostgresDataSource.kt @@ -30,7 +30,8 @@ class PostgresDataSource : AllInDataSource() { username VARCHAR(255), password VARCHAR(255), coins double precision, - email VARCHAR(255) + email VARCHAR(255), + lastgift timestamp )""".trimIndent() ) diff --git a/Sources/src/main/kotlin/allin/data/postgres/PostgresUserDataSource.kt b/Sources/src/main/kotlin/allin/data/postgres/PostgresUserDataSource.kt index 65124cf..e3bb91e 100644 --- a/Sources/src/main/kotlin/allin/data/postgres/PostgresUserDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/postgres/PostgresUserDataSource.kt @@ -4,8 +4,11 @@ import allin.data.UserDataSource import allin.dto.UserDTO import allin.entities.UsersEntity import allin.model.User +import allin.utils.ExecuteWithResult import org.ktorm.database.Database +import org.ktorm.database.use import org.ktorm.dsl.* +import java.time.Instant.now import java.util.* class PostgresUserDataSource(private val database: Database) : UserDataSource { @@ -34,6 +37,7 @@ class PostgresUserDataSource(private val database: Database) : UserDataSource { set(it.username, user.username) set(it.password, user.password) set(it.email, user.email) + set(it.lastGift, now()) } } @@ -50,10 +54,38 @@ class PostgresUserDataSource(private val database: Database) : UserDataSource { }.totalRecords > 0 } - override fun modifyUserCoins(username: String, amount: Int) { + override fun addCoins(username: String, amount: Int) { + database.update(UsersEntity) { + set(UsersEntity.nbCoins, UsersEntity.nbCoins + amount) + where { UsersEntity.username eq username } + } + } + + override fun removeCoins(username: String, amount: Int) { database.update(UsersEntity) { set(UsersEntity.nbCoins, UsersEntity.nbCoins - amount) where { UsersEntity.username eq username } } } + + override 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(UsersEntity.lastGift, now()) + where { it.username eq username } + } + } + return isDailyGift + } + } + return false + } + } \ No newline at end of file diff --git a/Sources/src/main/kotlin/allin/entities/UserEntity.kt b/Sources/src/main/kotlin/allin/entities/UserEntity.kt index 907b361..6009cdc 100644 --- a/Sources/src/main/kotlin/allin/entities/UserEntity.kt +++ b/Sources/src/main/kotlin/allin/entities/UserEntity.kt @@ -1,13 +1,7 @@ package allin.entities -import allin.database -import allin.utils.ExecuteWithResult -import org.ktorm.database.use -import org.ktorm.dsl.eq -import org.ktorm.dsl.update import org.ktorm.entity.Entity import org.ktorm.schema.* -import java.time.Instant interface UserEntity : Entity { val username: String @@ -25,26 +19,3 @@ object UsersEntity : Table("utilisateur") { val lastGift = timestamp("lastgift") } - -/*CREATE TABLE IF not exists utilisateur ( id uuid PRIMARY KEY, username VARCHAR(255), password VARCHAR(255),coins numeric,email VARCHAR(255), lastgift timestamp)*/ -/* -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(UsersEntity.lastGift, Instant.now()) - where { it.username eq username } - } - } - return isDailyGift - } - } - return false -} -*/ - diff --git a/Sources/src/main/kotlin/allin/routing/ParticipationRouter.kt b/Sources/src/main/kotlin/allin/routing/ParticipationRouter.kt index bab948b..e96d19e 100644 --- a/Sources/src/main/kotlin/allin/routing/ParticipationRouter.kt +++ b/Sources/src/main/kotlin/allin/routing/ParticipationRouter.kt @@ -37,7 +37,7 @@ fun Application.ParticipationRouter() { ) ) - userDataSource.modifyUserCoins(username = user.username, amount = participation.stake) + userDataSource.removeCoins(username = user.username, amount = participation.stake) call.respond(HttpStatusCode.Created) } else { diff --git a/Sources/src/main/kotlin/allin/routing/UserRouter.kt b/Sources/src/main/kotlin/allin/routing/UserRouter.kt index e6c3180..fd7172d 100644 --- a/Sources/src/main/kotlin/allin/routing/UserRouter.kt +++ b/Sources/src/main/kotlin/allin/routing/UserRouter.kt @@ -91,13 +91,12 @@ fun Application.UserRouter() { } get("/users/gift") { hasToken { principal -> - verifyUserFromToken(principal) { userDto, _ -> - if(canHaveDailyGift(userDto.username)){ + verifyUserFromToken(userDataSource, principal) { userDto, _ -> + if (userDataSource.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é") + userDataSource.addCoins(userDto.username, dailyGift) + call.respond(HttpStatusCode.OK, dailyGift) + } else call.respond(HttpStatusCode.MethodNotAllowed, "Can't get daily gift.") } } } diff --git a/Sources/src/main/kotlin/allin/utils/DatabaseUtil.kt b/Sources/src/main/kotlin/allin/utils/DatabaseUtil.kt index 90a176e..37a5329 100644 --- a/Sources/src/main/kotlin/allin/utils/DatabaseUtil.kt +++ b/Sources/src/main/kotlin/allin/utils/DatabaseUtil.kt @@ -5,14 +5,14 @@ import java.sql.ResultSet fun Database.ExecuteWithResult(request: String): ResultSet? { try { - if (!request.isNullOrEmpty()) { - return database.useTransaction { transaction -> + if (request.isNotEmpty()) { + return this.useTransaction { transaction -> val connection = transaction.connection val resultSet = connection.prepareStatement(request).executeQuery() resultSet } } - } catch (e: Exception){ + } catch (e: Exception) { println(e.message) return null }