mirror of
https://github.com/InsanusMokrassar/PlaguPoster.git
synced 2025-09-16 13:39:30 +00:00
complete publishing part
This commit is contained in:
@@ -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?
|
||||
}
|
||||
|
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -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)
|
||||
|
@@ -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()
|
||||
|
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user