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.

112 lines
3.6 KiB

package allin.data.postgres
import allin.data.UserDataSource
import allin.data.postgres.entities.*
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) or (it.email eq username) }
?.let { it.toUserDTO(database) to it.password }
?: (null to null)
override fun getUserById(id: String): UserDTO? =
database.users.find { it.id eq id }?.toUserDTO(database)
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) or (it.email eq username) } > 0
override fun addCoins(username: String, amount: Int) {
database.update(UsersEntity) {
set(it.nbCoins, it.nbCoins + amount)
where { it.username eq username }
}
}
override fun removeCoins(username: String, amount: Int) {
database.update(UsersEntity) {
set(it.nbCoins, it.nbCoins - amount)
where { it.username eq username }
}
}
override fun userExists(username: String) =
database.users.filter {
(it.username eq username)
}.totalRecords > 0
override fun emailExists(email: String) =
database.users.filter {
(it.email eq email)
}.totalRecords > 0
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 users 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
}
override fun addImage(userid: String, image: ByteArray) {
database.usersimage.add(UserImageEntity {
id = userid
this.image = image
})
}
override fun removeImage(userid: String) {
database.usersimage.removeIf { it.id eq userid }
}
override fun getImage(userid: String): String? {
val resultSet =
database.executeWithResult(
"""
SELECT encode(image, 'base64') AS image
FROM userimage
WHERE user_id = '${userid}'
""".trimIndent()
) ?: return null
if (resultSet.next()) {
resultSet.getString("image")?.let { return it }
}
return null
}
}