SimpleNotes/api/src/services/UserService.kt

71 lines
2.0 KiB
Kotlin

package be.vandewalleh.services
import be.vandewalleh.entities.User
import be.vandewalleh.tables.Users
import me.liuwj.ktorm.database.Database
import me.liuwj.ktorm.dsl.*
import me.liuwj.ktorm.entity.add
import me.liuwj.ktorm.entity.sequenceOf
import org.kodein.di.Kodein
import org.kodein.di.KodeinAware
import org.kodein.di.generic.instance
import java.time.LocalDateTime
/**
* service to handle database queries for users.
*/
class UserService(override val kodein: Kodein) : KodeinAware {
private val db by instance<Database>()
/**
* returns a user ID if present or null
*/
fun getUserId(userEmail: String): Int? {
return db.from(Users)
.select(Users.id)
.where { Users.email eq userEmail }
.limit(0, 1)
.map { it[Users.id] }
.firstOrNull()
}
/**
* returns a user email and password from it's email if found or null
*/
fun getEmailAndPasswordFromUsername(username: String): Pair<String, String>? {
return db.from(Users)
.select(Users.email, Users.password)
.where { Users.username eq username }
.limit(0, 1)
.map { row -> row[Users.email]!! to row[Users.password]!! }
.firstOrNull()
}
fun userExists(username: String, email: String): Boolean {
return db.from(Users)
.select(Users.id)
.where { (Users.username eq username) or (Users.email eq email) }
.limit(0, 1)
.firstOrNull() != null
}
/**
* create a new user
* password should already be hashed
*/
fun createUser(user: UserRegistrationDto) {
db.useTransaction {
val newUser = User {
this.username = user.username
this.email = user.email
this.password = user.password
this.createdAt = LocalDateTime.now()
}
db.sequenceOf(Users).add(newUser)
}
}
}
data class UserRegistrationDto(val username: String, val email: String, val password: String)