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() /** * 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? { 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)