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

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