Adrian Devezin
02/01/2022, 5:11 PMCan't init value outside the transaction
, but its in a transaction. Has anyone encountered this before?
override suspend fun createUser(
name: String,
username: String,
bio: String,
igUsername: String?,
tiktokUsername: String?,
imageUrl: String,
imageWidth: Int,
imageHeight: Int
): User = dbQuery {
val avatar = Image.new(UUID.randomUUID()) {
url = imageUrl
height = imageHeight
width = imageWidth
}
val user = User.new(UUID.randomUUID()) {
this.name = name
this.username = username
this.bio = bio
this.igUsername = igUsername
this.tiktokUsername = tiktokUsername
this.avatar = avatar
}
return@dbQuery user
}
internal suspend fun <T> dbQuery(block: () -> T): T =
withContext(<http://Dispatchers.IO|Dispatchers.IO>) {
transaction {
if (System.getenv("environment").contentEquals("debug", ignoreCase = true)) {
addLogger(StdOutSqlLogger)
}
block()
}
}
Emil Kantis
02/01/2022, 7:51 PMAdrian Devezin
02/01/2022, 7:57 PMnewSuspendedTransaction
work in this case to replace transaction
or should I do this?
internal suspend fun <T> dbQuery(block: () -> T): T =
withContext(<http://Dispatchers.IO|Dispatchers.IO>) {
transaction {
if (System.getenv("environment").contentEquals("debug", ignoreCase = true)) {
addLogger(StdOutSqlLogger)
}
suspend {
suspendedTransaction {
block()
}
}
}.invoke()
}
Emil Kantis
02/01/2022, 8:31 PMAdrian Devezin
02/01/2022, 8:44 PMEmil Kantis
02/01/2022, 8:47 PMinternal suspend fun <T> dbQuery(block: () -> T): T =
newSuspendedTransaction(<http://Dispatchers.IO|Dispatchers.IO>) {
if (System.getenv("environment").contentEquals("debug", ignoreCase = true)) {
addLogger(StdOutSqlLogger)
}
block()
}
Adrian Devezin
02/01/2022, 10:08 PMclass User(id: EntityID<UUID>) : UUIDEntity(id) {
companion object : UUIDEntityClass<User>(UsersTable)
var name by UsersTable.name
var username by UsersTable.username
var bio by UsersTable.bio
var igUsername by UsersTable.igUrl
var tiktokUsername by UsersTable.tikTokUrl
val posts by Post referrersOn PostsTable.author
var avatar by Image referencedOn UsersTable.image
}
internal data class UserPresentable(
val uuid: String,
val username: String,
val name: String,
val bio: String,
val igUsername: String?,
val tiktokUsername: String?,
val avatar: ImagePresentable,
) {
data class ImagePresentable(val url: String, val height: Int, val width: Int)
}
internal fun Image.toPresentable(): UserPresentable.ImagePresentable {
return UserPresentable.ImagePresentable(
url = url,
height = height,
width = width
)
}
internal fun User.toPresentable(): UserPresentable {
return UserPresentable(
uuid = id.value.toString(),
username = username,
tiktokUsername = tiktokUsername,
igUsername = igUsername,
name = name,
bio = bio,
avatar = avatar.toPresentable(),
)
}
Emil Kantis
02/01/2022, 10:13 PMavatar.toPresentable()
forces it to load another entity that wasn’t fetched in the initial query?)Adrian Devezin
02/02/2022, 3:14 PM