core/publishing/exposed/src/jvmMain/kotlin/dev/inmo/postssystem/core/publishing/exposed/ExposedPublishingKeysRepo.kt

60 lines
2.0 KiB
Kotlin

package dev.inmo.postssystem.core.publishing.exposed
import dev.inmo.postssystem.core.post.PostId
import dev.inmo.postssystem.core.publishing.TriggerControlKey
import dev.inmo.postssystem.core.publishing.repos.PublishingKeysRepo
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.transaction
class ExposedPublishingKeysRepo(
private val database: Database
) : PublishingKeysRepo, Table() {
private val postIdColumn: Column<PostId> = text("postId")
private val triggerControlKeyColumn: Column<PostId> = text("triggerControlKey")
override val primaryKey: PrimaryKey = PrimaryKey(postIdColumn, triggerControlKeyColumn)
init {
transaction(
db = database
) {
SchemaUtils.createMissingTablesAndColumns(this@ExposedPublishingKeysRepo)
}
}
override suspend fun getPostIdByTriggerControlKey(key: TriggerControlKey): PostId? = transaction(
db = database
) {
select { triggerControlKeyColumn.eq(key) }.limit(1).firstOrNull() ?.getOrNull(postIdColumn)
}
override suspend fun getTriggerControlKeyByPostId(postId: PostId): TriggerControlKey? = transaction(
db = database
) {
select { postIdColumn.eq(postId) }.limit(1).firstOrNull() ?.getOrNull(triggerControlKeyColumn)
}
override suspend fun setPostTriggerControlKey(postId: PostId, key: TriggerControlKey): Boolean {
unsetPostTriggerControlKey(postId)
return transaction(
db = database
) {
insert {
it[postIdColumn] = postId
it[triggerControlKeyColumn] = triggerControlKeyColumn
}.getOrNull(postIdColumn) == postId
}
}
override suspend fun unsetPostTriggerControlKey(postId: PostId): Boolean = transaction(
db = database
) {
deleteWhere {
postIdColumn.eq(postId)
} > 0
}
}
class DatabasePublishingKeysRepo(
database: Database
): PublishingKeysRepo by ExposedPublishingKeysRepo(database)