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() @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 } }