Experiment/src/main/kotlin/repositories/UserRepository.kt

45 lines
1.5 KiB
Kotlin

package be.simplenotes.repositories
import be.simplenotes.User
import be.simplenotes.UserId
import be.simplenotes.public_.tables.Users.USERS
import be.simplenotes.security.PasswordHash
import com.github.benmanes.caffeine.cache.Caffeine
import org.jooq.DSLContext
import org.jooq.Record
import org.jooq.exception.DataAccessException
class UserRepository(private val db: DSLContext, private val passwordHash: PasswordHash) {
private val cache = Caffeine.newBuilder()
.maximumSize(10)
.build<UserId, User>()
@Throws(DataAccessException::class)
fun create(user: User) {
db.insertInto(USERS, USERS.USERNAME, USERS.PASSWORD)
.values(user.username, passwordHash.hash(user.password))
.execute()
}
fun find(id: UserId): User? = cache.get(id) {
db.fetchOne(USERS, USERS.ID.eq(id.value))?.map(::userMapper)
}
fun find(username: String, password: String): User? {
val user = db.fetchOne(USERS, USERS.USERNAME.eq(username))?.map(::userMapper) ?: return null
return if (passwordHash.verify(user.password, password))
user
else null
}
private fun userMapper(record: Record): User =
User(UserId(record[USERS.ID]), record[USERS.USERNAME], record[USERS.PASSWORD])
fun delete(id: UserId): Boolean {
val deleted = db.deleteFrom(USERS).where(USERS.ID.eq(id.value)).execute() == 1
if (deleted) cache.invalidate(id)
return deleted
}
}