45 lines
1.5 KiB
Kotlin
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
|
|
}
|
|
}
|