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 = text("postId") private val triggerControlKeyColumn: Column = 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)