Merge Stub_Db
continuous-integration/drone/push Build is passing Details

pull/10/head
Arthur VALIN 1 year ago
parent a877762d2d
commit 7ba9d2715d

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

@ -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<UserDTO?, String?> =
@ -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<User>()
}
private val lastGifts by lazy {
mutableMapOf<String, ZonedDateTime>()
}
}

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

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

@ -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<UserEntity> {
val username: String
@ -25,26 +19,3 @@ object UsersEntity : Table<UserEntity>("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
}
*/

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

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

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

Loading…
Cancel
Save