complete publishing part

This commit is contained in:
2022-08-20 22:26:38 +06:00
parent 941505df42
commit c4e7f338a9
13 changed files with 146 additions and 9 deletions

View File

@@ -2,5 +2,9 @@ package dev.inmo.plaguposter.posts.repo
import dev.inmo.micro_utils.repos.ReadCRUDRepo
import dev.inmo.plaguposter.posts.models.*
import dev.inmo.tgbotapi.types.ChatId
import dev.inmo.tgbotapi.types.MessageIdentifier
interface ReadPostsRepo : ReadCRUDRepo<RegisteredPost, PostId>
interface ReadPostsRepo : ReadCRUDRepo<RegisteredPost, PostId> {
suspend fun getIdByChatAndMessage(chatId: ChatId, messageId: MessageIdentifier): PostId?
}

View File

@@ -2,6 +2,7 @@ package dev.inmo.plaguposter.posts.sending
import dev.inmo.kslog.common.logger
import dev.inmo.kslog.common.w
import dev.inmo.micro_utils.repos.deleteById
import dev.inmo.plaguposter.posts.models.PostId
import dev.inmo.plaguposter.posts.repo.PostsRepo
import dev.inmo.tgbotapi.bot.TelegramBot
@@ -14,12 +15,13 @@ import dev.inmo.tgbotapi.types.message.content.MediaGroupContent
class PostPublisher(
private val bot: TelegramBot,
private val repo: PostsRepo,
private val postsRepo: PostsRepo,
private val cachingChatId: ChatId,
private val targetChatId: ChatId
private val targetChatId: ChatId,
private val deleteAfterPosting: Boolean = true
) {
suspend fun publish(postId: PostId) {
val messagesInfo = repo.getById(postId) ?: let {
val messagesInfo = postsRepo.getById(postId) ?: let {
logger.w { "Unable to get post with id $postId for publishing" }
return
}
@@ -56,5 +58,9 @@ class PostPublisher(
}
}
if (deleteAfterPosting) {
postsRepo.deleteById(postId)
}
}
}

View File

@@ -30,7 +30,7 @@ object Plugin : Plugin {
return
}
single { get<Json>().decodeFromJsonElement(Config.serializer(), configJson) }
single<PostsRepo> { ExposedPostsRepo(database, get()) }
single<PostsRepo> { ExposedPostsRepo(database) }
single {
val config = get<Config>()
PostPublisher(get(), get(), config.cacheChatId, config.targetChatId)

View File

@@ -11,7 +11,7 @@ internal class ExposedContentInfoRepo(
override val database: Database,
postIdColumnReference: Column<String>
) : ExposedRepo, Table(name = "posts_content") {
val postIdColumn = (text("post_id") references postIdColumnReference).index()
val postIdColumn = text("post_id").references(postIdColumnReference, ReferenceOption.CASCADE, ReferenceOption.CASCADE)
val chatIdColumn = long("chat_id")
val messageIdColumn = long("message_id")
val groupColumn = text("group").nullable()

View File

@@ -6,14 +6,16 @@ import dev.inmo.micro_utils.repos.exposed.AbstractExposedCRUDRepo
import dev.inmo.micro_utils.repos.exposed.initTable
import dev.inmo.plaguposter.posts.models.*
import dev.inmo.plaguposter.posts.repo.PostsRepo
import dev.inmo.tgbotapi.types.ChatId
import dev.inmo.tgbotapi.types.MessageIdentifier
import kotlinx.serialization.json.Json
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.statements.InsertStatement
import org.jetbrains.exposed.sql.statements.UpdateStatement
import org.jetbrains.exposed.sql.transactions.transaction
class ExposedPostsRepo(
override val database: Database,
json: Json
override val database: Database
) : PostsRepo, AbstractExposedCRUDRepo<RegisteredPost, PostId, NewPost>(
tableName = "posts"
) {
@@ -88,4 +90,35 @@ class ExposedPostsRepo(
}
override fun insert(value: NewPost, it: InsertStatement<Number>) {}
override suspend fun deleteById(ids: List<PostId>) {
onBeforeDelete(ids)
transaction(db = database) {
val deleted = deleteWhere(null, null) {
selectByIds(ids)
}
with(contentRepo) {
deleteWhere {
postIdColumn.inList(ids.map { it.string })
}
}
if (deleted == ids.size) {
ids
} else {
ids.filter {
select { selectById(it) }.limit(1).none()
}
}
}.forEach {
_deletedObjectsIdsFlow.emit(it)
}
}
override suspend fun getIdByChatAndMessage(chatId: ChatId, messageId: MessageIdentifier): PostId? {
return transaction(database) {
with(contentRepo) {
select { chatIdColumn.eq(chatId.chatId).and(messageIdColumn.eq(messageId)) }.limit(1).firstOrNull() ?.get(postIdColumn)
} ?.let(::PostId)
}
}
}