User service is now non blocking
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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("??")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user