User service is now non blocking

This commit is contained in:
2020-06-15 20:57:09 +02:00
parent ebd897093c
commit 6688b35a9b
5 changed files with 92 additions and 70 deletions
+5
View File
@@ -6,3 +6,8 @@ import kotlinx.coroutines.*
fun <T> ioAsync(block: suspend CoroutineScope.() -> T): Deferred<T> {
return CoroutineScope(Dispatchers.IO).async(block = block)
}
suspend inline fun <T> launchIo(crossinline block: () -> T): T =
withContext(Dispatchers.IO) {
block()
}
+37 -29
View File
@@ -1,7 +1,10 @@
package be.vandewalleh.services
import be.vandewalleh.entities.User
import be.vandewalleh.extensions.ioAsync
import be.vandewalleh.extensions.launchIo
import be.vandewalleh.tables.Users
import kotlinx.coroutines.Deferred
import me.liuwj.ktorm.database.*
import me.liuwj.ktorm.dsl.*
import me.liuwj.ktorm.entity.*
@@ -20,8 +23,8 @@ class UserService(override val kodein: Kodein) : KodeinAware {
/**
* returns a user ID if present or null
*/
fun getUserId(userEmail: String): Int? {
return db.from(Users)
suspend fun getUserId(userEmail: String): Int? = launchIo {
db.from(Users)
.select(Users.id)
.where { Users.email eq userEmail }
.map { it[Users.id] }
@@ -31,8 +34,8 @@ class UserService(override val kodein: Kodein) : KodeinAware {
/**
* returns a user email and password from it's username if found or null
*/
fun getFromUsername(username: String): User? {
return db.from(Users)
suspend fun getFromUsername(username: String): User? = launchIo {
db.from(Users)
.select(Users.email, Users.password, Users.id)
.where { Users.username eq username }
.map { row ->
@@ -41,22 +44,22 @@ class UserService(override val kodein: Kodein) : KodeinAware {
.firstOrNull()
}
fun userExists(username: String, email: String): Boolean {
return db.from(Users)
suspend fun userExists(username: String, email: String): Boolean = launchIo {
db.from(Users)
.select(Users.id)
.where { (Users.username eq username) or (Users.email eq email) }
.firstOrNull() != null
}
fun userExists(userId: Int): Boolean {
return db.from(Users)
suspend fun userExists(userId: Int): Boolean = launchIo {
db.from(Users)
.select(Users.id)
.where { Users.id eq userId }
.firstOrNull() != null
}
fun getUserInfo(id: Int): User? {
return db.from(Users)
suspend fun getUserInfo(id: Int): User? = launchIo {
db.from(Users)
.select(Users.email, Users.username)
.where { Users.id eq id }
.map { Users.createEntity(it) }
@@ -67,25 +70,27 @@ class UserService(override val kodein: Kodein) : KodeinAware {
* create a new user
* password should already be hashed
*/
fun createUser(username: String, email: String, hashedPassword: String): User? {
try {
db.useTransaction {
val newUser = User {
this.username = username
this.email = email
this.password = hashedPassword
this.createdAt = LocalDateTime.now()
}
suspend fun createUser(username: String, email: String, hashedPassword: String): User? {
val newUser = User {
this.username = username
this.email = email
password = hashedPassword
createdAt = LocalDateTime.now()
}
db.sequenceOf(Users).add(newUser)
return newUser
return try {
launchIo {
db.useTransaction {
db.sequenceOf(Users).add(newUser)
newUser
}
}
} catch (e: SQLIntegrityConstraintViolationException) {
return null
null
}
}
fun updateUser(userId: Int, username: String, email: String, hashedPassword: String) {
suspend fun updateUser(userId: Int, username: String, email: String, hashedPassword: String): Unit = launchIo {
db.useTransaction {
db.update(Users) {
it.username to username
@@ -98,14 +103,17 @@ class UserService(override val kodein: Kodein) : KodeinAware {
}
}
fun deleteUser(userId: Int): Boolean {
suspend fun deleteUser(userId: Int): Boolean = launchIo {
db.useTransaction {
return when (db.delete(Users) { it.id eq userId }) {
1 -> true
0 -> false
else -> error("??")
}
db.delete(Users) { it.id eq userId }
}
}.let {
when (it) {
1 -> true
0 -> false
else -> error("??")
}
}
}