You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.7 KiB
80 lines
2.7 KiB
package allin.data.postgres
|
|
|
|
import allin.data.UserDataSource
|
|
import allin.data.postgres.entities.UserEntity
|
|
import allin.data.postgres.entities.UsersEntity
|
|
import allin.data.postgres.entities.users
|
|
import allin.dto.UserDTO
|
|
import allin.ext.executeWithResult
|
|
import allin.model.User
|
|
import org.ktorm.database.Database
|
|
import org.ktorm.database.use
|
|
import org.ktorm.dsl.*
|
|
import org.ktorm.entity.add
|
|
import org.ktorm.entity.filter
|
|
import org.ktorm.entity.find
|
|
import org.ktorm.entity.removeIf
|
|
import java.time.Instant.now
|
|
|
|
class PostgresUserDataSource(private val database: Database) : UserDataSource {
|
|
override fun getUserByUsername(username: String): Pair<UserDTO?, String?> =
|
|
database.users
|
|
.find { it.username eq username }
|
|
?.let { it.toUserDTO() to it.password }
|
|
?: (null to null)
|
|
|
|
override fun addUser(user: User) {
|
|
database.users.add(
|
|
UserEntity {
|
|
this.id = user.id
|
|
this.nbCoins = user.nbCoins
|
|
this.username = user.username
|
|
this.password = user.password
|
|
this.email = user.email
|
|
this.lastGift = now()
|
|
}
|
|
)
|
|
}
|
|
|
|
override fun deleteUser(username: String): Boolean =
|
|
database.users.removeIf { it.username eq username } > 0
|
|
|
|
override fun userExists(username: String, email: String): Boolean {
|
|
return database.users.filter {
|
|
(it.username eq username) and (it.email eq email)
|
|
}.totalRecords > 0
|
|
}
|
|
|
|
override fun addCoins(username: String, amount: Int) {
|
|
database.users
|
|
.find { it.username eq username }
|
|
?.set(UsersEntity.nbCoins.name, UsersEntity.nbCoins + amount)
|
|
}
|
|
|
|
override fun removeCoins(username: String, amount: Int) {
|
|
database.users
|
|
.find { it.username eq username }
|
|
?.set(UsersEntity.nbCoins.name, UsersEntity.nbCoins - amount)
|
|
}
|
|
|
|
override fun canHaveDailyGift(username: String): Boolean {
|
|
val request =
|
|
"SELECT CASE WHEN DATE(NOW()) > DATE(lastgift) 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
|
|
}
|
|
|
|
} |