diff --git a/build.gradle b/build.gradle index 80d7b89..723a7c4 100644 --- a/build.gradle +++ b/build.gradle @@ -18,6 +18,7 @@ allprojects { mavenLocal() mavenCentral() google() + maven { url "https://git.inmo.dev/api/packages/InsanusMokrassar/maven" } } } diff --git a/common/src/commonMain/kotlin/ShortMessageInfo.kt b/common/src/commonMain/kotlin/ShortMessageInfo.kt index 2426f06..586f893 100644 --- a/common/src/commonMain/kotlin/ShortMessageInfo.kt +++ b/common/src/commonMain/kotlin/ShortMessageInfo.kt @@ -1,13 +1,16 @@ package dev.inmo.plaguposter.common import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.FullChatIdentifierSerializer +import dev.inmo.tgbotapi.types.IdChatIdentifier import dev.inmo.tgbotapi.types.MessageIdentifier import dev.inmo.tgbotapi.types.message.abstracts.Message import kotlinx.serialization.Serializable @Serializable data class ShortMessageInfo( - val chatId: ChatId, + @Serializable(FullChatIdentifierSerializer::class) + val chatId: IdChatIdentifier, val messageId: MessageIdentifier ) diff --git a/common/src/jvmMain/kotlin/CommonPlugin.kt b/common/src/jvmMain/kotlin/CommonPlugin.kt new file mode 100644 index 0000000..e5de8bd --- /dev/null +++ b/common/src/jvmMain/kotlin/CommonPlugin.kt @@ -0,0 +1,20 @@ +package dev.inmo.plaguposter.common + +import dev.inmo.kslog.common.i +import dev.inmo.kslog.common.iS +import dev.inmo.kslog.common.logger +import dev.inmo.plagubot.Plugin +import dev.inmo.tgbotapi.extensions.api.chat.get.getChat +import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import org.koin.core.Koin + +object CommonPlugin : Plugin { + private val Log = logger + override suspend fun BehaviourContext.setupBotPlugin(koin: Koin) { + val config = koin.get() + + Log.iS { "Target chat info: ${getChat(config.targetChatId)}" } + Log.iS { "Source chat info: ${getChat(config.sourceChatId)}" } + Log.iS { "Cache chat info: ${getChat(config.cacheChatId)}" } + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 419af72..c6a0431 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,15 +1,17 @@ [versions] -kotlin = "1.7.20" +kotlin = "1.7.21" kotlin-serialization = "1.4.1" -plagubot = "2.4.0" -tgbotapi = "3.3.0" -microutils = "0.13.1" -kslog = "0.5.2" -krontab = "0.8.1" -tgbotapi-libraries = "0.5.6" -plagubot-plugins = "0.5.0" +plagubot = "3.1.3" +tgbotapi = "4.1.2" +microutils = "0.14.2" +kslog = "0.5.3" +krontab = "0.8.3" +tgbotapi-libraries = "0.6.3" +plagubot-plugins = "0.6.1" + +dokka = "1.7.20" psql = "42.5.0" @@ -39,7 +41,7 @@ psql = { module = "org.postgresql:postgresql", version.ref = "psql" } kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } kotlin-serialization-plugin = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlin" } -kotlin-dokka-plugin = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "kotlin" } +kotlin-dokka-plugin = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "dokka" } [plugins] diff --git a/posts/panel/src/jvmMain/kotlin/Plugin.kt b/posts/panel/src/jvmMain/kotlin/Plugin.kt index b2676fa..2d6622a 100644 --- a/posts/panel/src/jvmMain/kotlin/Plugin.kt +++ b/posts/panel/src/jvmMain/kotlin/Plugin.kt @@ -23,6 +23,7 @@ import dev.inmo.tgbotapi.extensions.utils.extensions.sameMessage import dev.inmo.tgbotapi.extensions.utils.types.buttons.dataButton import dev.inmo.tgbotapi.extensions.utils.types.buttons.flatInlineKeyboard import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.IdChatIdentifier import dev.inmo.tgbotapi.types.MessageIdentifier import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.CallbackDataInlineKeyboardButton import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup @@ -108,7 +109,7 @@ object Plugin : Plugin { suspend fun refreshPostMessage( postId: PostId, - chatId: ChatId, + chatId: IdChatIdentifier, messageId: MessageIdentifier ) { val post = postsRepo.getById(postId) ?: return diff --git a/posts/panel/src/jvmMain/kotlin/repos/PostsMessages.kt b/posts/panel/src/jvmMain/kotlin/repos/PostsMessages.kt index 984a6e2..85f0fbc 100644 --- a/posts/panel/src/jvmMain/kotlin/repos/PostsMessages.kt +++ b/posts/panel/src/jvmMain/kotlin/repos/PostsMessages.kt @@ -5,18 +5,20 @@ import dev.inmo.micro_utils.repos.exposed.keyvalue.ExposedKeyValueRepo import dev.inmo.micro_utils.repos.mappers.withMapper import dev.inmo.plaguposter.posts.models.PostId import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.FullChatIdentifierSerializer +import dev.inmo.tgbotapi.types.IdChatIdentifier import dev.inmo.tgbotapi.types.MessageIdentifier import kotlinx.serialization.builtins.PairSerializer import kotlinx.serialization.builtins.serializer import kotlinx.serialization.json.Json import org.jetbrains.exposed.sql.Database -private val ChatIdToMessageSerializer = PairSerializer(ChatId.serializer(), MessageIdentifier.serializer()) +private val ChatIdToMessageSerializer = PairSerializer(FullChatIdentifierSerializer, MessageIdentifier.serializer()) fun PostsMessages( database: Database, json: Json -): KeyValueRepo> = ExposedKeyValueRepo( +): KeyValueRepo> = ExposedKeyValueRepo( database, { text("postId") }, { text("chatToMessage") }, @@ -25,5 +27,5 @@ fun PostsMessages( { string }, { json.encodeToString(ChatIdToMessageSerializer, this) }, { PostId(this) }, - { json.decodeFromString(ChatIdToMessageSerializer, this) } + { json.decodeFromString(ChatIdToMessageSerializer, this) as Pair } ) diff --git a/posts/src/commonMain/kotlin/models/PostContentInfo.kt b/posts/src/commonMain/kotlin/models/PostContentInfo.kt index 995dfd1..583290e 100644 --- a/posts/src/commonMain/kotlin/models/PostContentInfo.kt +++ b/posts/src/commonMain/kotlin/models/PostContentInfo.kt @@ -1,25 +1,39 @@ package dev.inmo.plaguposter.posts.models -import dev.inmo.tgbotapi.extensions.utils.mediaGroupMessageOrNull +import dev.inmo.tgbotapi.extensions.utils.possiblyMediaGroupMessageOrNull import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.FullChatIdentifierSerializer +import dev.inmo.tgbotapi.types.IdChatIdentifier import dev.inmo.tgbotapi.types.MessageIdentifier import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage -import dev.inmo.tgbotapi.types.message.content.MessageContent +import dev.inmo.tgbotapi.types.message.content.MediaGroupContent import kotlinx.serialization.Serializable @Serializable data class PostContentInfo( - val chatId: ChatId, + @Serializable(FullChatIdentifierSerializer::class) + val chatId: IdChatIdentifier, val messageId: MessageIdentifier, val group: String?, val order: Int ) { companion object { - fun fromMessage(message: ContentMessage<*>, order: Int) = PostContentInfo( + private fun fromMessage(message: ContentMessage<*>, order: Int) = PostContentInfo( message.chat.id, message.messageId, - message.mediaGroupMessageOrNull() ?.mediaGroupId, + message.possiblyMediaGroupMessageOrNull() ?.mediaGroupId, order ) + fun fromMessage(message: ContentMessage<*>): List { + val content = message.content + + return if (content is MediaGroupContent<*>) { + content.group.mapIndexed { i, it -> + fromMessage(it.sourceMessage, i) + } + } else { + listOf(fromMessage(message, 0)) + } + } } } diff --git a/posts/src/commonMain/kotlin/repo/ReadPostsRepo.kt b/posts/src/commonMain/kotlin/repo/ReadPostsRepo.kt index 60bfe1f..b4391a0 100644 --- a/posts/src/commonMain/kotlin/repo/ReadPostsRepo.kt +++ b/posts/src/commonMain/kotlin/repo/ReadPostsRepo.kt @@ -4,9 +4,10 @@ import com.soywiz.klock.DateTime import dev.inmo.micro_utils.repos.ReadCRUDRepo import dev.inmo.plaguposter.posts.models.* import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.IdChatIdentifier import dev.inmo.tgbotapi.types.MessageIdentifier interface ReadPostsRepo : ReadCRUDRepo { - suspend fun getIdByChatAndMessage(chatId: ChatId, messageId: MessageIdentifier): PostId? + suspend fun getIdByChatAndMessage(chatId: IdChatIdentifier, messageId: MessageIdentifier): PostId? suspend fun getPostCreationTime(postId: PostId): DateTime? } diff --git a/posts/src/commonMain/kotlin/sending/PostPublisher.kt b/posts/src/commonMain/kotlin/sending/PostPublisher.kt index 1521c55..b603a3d 100644 --- a/posts/src/commonMain/kotlin/sending/PostPublisher.kt +++ b/posts/src/commonMain/kotlin/sending/PostPublisher.kt @@ -12,6 +12,7 @@ import dev.inmo.tgbotapi.extensions.api.send.send import dev.inmo.tgbotapi.extensions.utils.* import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.message.content.MediaGroupContent +import dev.inmo.tgbotapi.types.message.content.MediaGroupPartContent class PostPublisher( private val bot: TelegramBot, @@ -37,14 +38,26 @@ class PostPublisher( sortedMessagesContents.forEach { (_, contents) -> contents.singleOrNull() ?.also { - bot.copyMessage(targetChatId, it.chatId, it.messageId) + runCatching { + bot.copyMessage(targetChatId, it.chatId, it.messageId) + }.onFailure { _ -> + runCatching { + bot.forwardMessage( + it.chatId, + targetChatId, + it.messageId + ) + }.onSuccess { + bot.copyMessage(targetChatId, it) + } + } return@forEach } val resultContents = contents.mapNotNull { it.order to (bot.forwardMessage(toChatId = cachingChatId, fromChatId = it.chatId, messageId = it.messageId).contentMessageOrNull() ?: return@mapNotNull null) - }.sortedBy { it.first }.mapNotNull { (_, it) -> - it.withContentOrNull() ?: null.also { _ -> - bot.copyMessage(targetChatId, it) + }.sortedBy { it.first }.mapNotNull { (_, forwardedMessage) -> + forwardedMessage.withContentOrNull() ?: null.also { _ -> + bot.copyMessage(targetChatId, forwardedMessage) } } resultContents.singleOrNull() ?.also { diff --git a/posts/src/jvmMain/kotlin/exposed/ExposedContentInfoRepo.kt b/posts/src/jvmMain/kotlin/exposed/ExposedContentInfoRepo.kt index 7738806..52e9c70 100644 --- a/posts/src/jvmMain/kotlin/exposed/ExposedContentInfoRepo.kt +++ b/posts/src/jvmMain/kotlin/exposed/ExposedContentInfoRepo.kt @@ -5,6 +5,7 @@ import dev.inmo.micro_utils.repos.KeyValuesRepo import dev.inmo.micro_utils.repos.exposed.* import dev.inmo.plaguposter.posts.models.* import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.IdChatIdentifier import org.jetbrains.exposed.sql.* internal class ExposedContentInfoRepo( @@ -13,13 +14,14 @@ internal class ExposedContentInfoRepo( ) : ExposedRepo, Table(name = "posts_content") { val postIdColumn = text("post_id").references(postIdColumnReference, ReferenceOption.CASCADE, ReferenceOption.CASCADE) val chatIdColumn = long("chat_id") + val threadIdColumn = long("thread_id").nullable().default(null) val messageIdColumn = long("message_id") val groupColumn = text("group").nullable() val orderColumn = integer("order") val ResultRow.asObject get() = PostContentInfo( - ChatId(get(chatIdColumn)), + IdChatIdentifier(get(chatIdColumn), get(threadIdColumn)), get(messageIdColumn), get(groupColumn), get(orderColumn) diff --git a/posts/src/jvmMain/kotlin/exposed/ExposedPostsRepo.kt b/posts/src/jvmMain/kotlin/exposed/ExposedPostsRepo.kt index 05103a9..17bd698 100644 --- a/posts/src/jvmMain/kotlin/exposed/ExposedPostsRepo.kt +++ b/posts/src/jvmMain/kotlin/exposed/ExposedPostsRepo.kt @@ -9,10 +9,13 @@ 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.IdChatIdentifier import dev.inmo.tgbotapi.types.MessageIdentifier import kotlinx.coroutines.flow.* import kotlinx.serialization.json.Json import org.jetbrains.exposed.sql.* +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.SqlExpressionBuilder.inList import org.jetbrains.exposed.sql.statements.* import org.jetbrains.exposed.sql.transactions.transaction @@ -33,8 +36,8 @@ class ExposedPostsRepo( override val primaryKey: PrimaryKey = PrimaryKey(idColumn) - override val selectById: SqlExpressionBuilder.(PostId) -> Op = { idColumn.eq(it.string) } - override val selectByIds: SqlExpressionBuilder.(List) -> Op = { idColumn.inList(it.map { it.string }) } + override val selectById: ISqlExpressionBuilder.(PostId) -> Op = { idColumn.eq(it.string) } + override val selectByIds: ISqlExpressionBuilder.(List) -> Op = { idColumn.inList(it.map { it.string }) } override val ResultRow.asObject: RegisteredPost get() { val id = PostId(get(idColumn)) @@ -86,6 +89,7 @@ class ExposedPostsRepo( insert { it[postIdColumn] = post.id.string it[chatIdColumn] = contentInfo.chatId.chatId + it[threadIdColumn] = contentInfo.chatId.threadId it[messageIdColumn] = contentInfo.messageId it[groupColumn] = contentInfo.group it[orderColumn] = contentInfo.order @@ -102,14 +106,14 @@ class ExposedPostsRepo( override suspend fun onAfterCreate(values: List>): List { values.forEach { - updateContent(it.second) + updateContent(it.second.copy(content = it.first.content)) } return super.onAfterCreate(values) } override suspend fun onAfterUpdate(value: List>): List { value.forEach { - updateContent(it.second) + updateContent(it.second.copy(content = it.first.content)) } return super.onAfterUpdate(value) } @@ -122,7 +126,7 @@ class ExposedPostsRepo( val existsIds = posts.keys.toList() transaction(db = database) { val deleted = deleteWhere(null, null) { - selectByIds(existsIds) + selectByIds(it, existsIds) } with(contentRepo) { deleteWhere { @@ -142,10 +146,10 @@ class ExposedPostsRepo( } } - override suspend fun getIdByChatAndMessage(chatId: ChatId, messageId: MessageIdentifier): PostId? { + override suspend fun getIdByChatAndMessage(chatId: IdChatIdentifier, messageId: MessageIdentifier): PostId? { return transaction(database) { with(contentRepo) { - select { chatIdColumn.eq(chatId.chatId).and(messageIdColumn.eq(messageId)) }.limit(1).firstOrNull() ?.get(postIdColumn) + select { chatIdColumn.eq(chatId.chatId).and(threadIdColumn.eq(chatId.threadId)).and(messageIdColumn.eq(messageId)) }.limit(1).firstOrNull() ?.get(postIdColumn) } ?.let(::PostId) } } diff --git a/posts_registrar/src/commonMain/kotlin/state/RegistrationState.kt b/posts_registrar/src/commonMain/kotlin/state/RegistrationState.kt index bce4f66..fcaafd6 100644 --- a/posts_registrar/src/commonMain/kotlin/state/RegistrationState.kt +++ b/posts_registrar/src/commonMain/kotlin/state/RegistrationState.kt @@ -3,20 +3,24 @@ package dev.inmo.plaguposter.posts.registrar.state import dev.inmo.micro_utils.fsm.common.State import dev.inmo.plaguposter.posts.models.PostContentInfo import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.FullChatIdentifierSerializer +import dev.inmo.tgbotapi.types.IdChatIdentifier import kotlinx.serialization.Serializable interface RegistrationState : State { - override val context: ChatId + override val context: IdChatIdentifier @Serializable data class InProcess( - override val context: ChatId, + @Serializable(FullChatIdentifierSerializer::class) + override val context: IdChatIdentifier, val messages: List ) : RegistrationState @Serializable data class Finish( - override val context: ChatId, + @Serializable(FullChatIdentifierSerializer::class) + override val context: IdChatIdentifier, val messages: List ) : RegistrationState } diff --git a/posts_registrar/src/jvmMain/kotlin/Plugin.kt b/posts_registrar/src/jvmMain/kotlin/Plugin.kt index 3eef447..e12c72d 100644 --- a/posts_registrar/src/jvmMain/kotlin/Plugin.kt +++ b/posts_registrar/src/jvmMain/kotlin/Plugin.kt @@ -22,12 +22,12 @@ import dev.inmo.tgbotapi.extensions.utils.extensions.raw.text import dev.inmo.tgbotapi.extensions.utils.extensions.sameChat import dev.inmo.tgbotapi.extensions.utils.extensions.sameMessage import dev.inmo.tgbotapi.extensions.utils.formatting.buildEntities -import dev.inmo.tgbotapi.extensions.utils.formatting.regular -import dev.inmo.tgbotapi.extensions.utils.mediaGroupMessageOrNull import dev.inmo.tgbotapi.extensions.utils.textContentOrNull import dev.inmo.tgbotapi.extensions.utils.types.buttons.* import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage +import dev.inmo.tgbotapi.types.message.content.MediaGroupContent import dev.inmo.tgbotapi.types.message.content.MessageContent +import dev.inmo.tgbotapi.utils.regular import kotlinx.coroutines.flow.* import kotlinx.serialization.Serializable import org.koin.core.Koin @@ -43,7 +43,7 @@ object Plugin : Plugin { val messageToDelete = send( state.context, - buildEntities { + dev.inmo.tgbotapi.utils.buildEntities { if (state.messages.isNotEmpty()) { regular("Your message(s) has been registered. You may send new ones or push \"Finish\" to finalize your post") } else { @@ -65,18 +65,11 @@ object Plugin : Plugin { val newMessagesInfo = firstOf { add { listOf( - waitContentMessage( - includeMediaGroups = false - ).filter { + waitContentMessage().filter { it.chat.id == state.context && it.content.textContentOrNull() ?.text != "/finish_post" }.take(1).first() ) } - add { - waitMediaGroupMessages().filter { - it.first().chat.id == state.context - }.take(1).first() - } add { val finishPressed = waitMessageDataCallbackQuery().filter { it.message.sameMessage(messageToDelete) && it.data == buttonUuid @@ -95,8 +88,8 @@ object Plugin : Plugin { state.context, state.messages ) - }.map { - PostContentInfo.fromMessage(it, state.messages.size) + }.flatMap { + PostContentInfo.fromMessage(it) } RegistrationState.InProcess( @@ -121,25 +114,9 @@ object Plugin : Plugin { } onContentMessage( - initialFilter = { it.chat.id == config.sourceChatId && it.mediaGroupMessageOrNull() ?.mediaGroupId == null && !FirstSourceIsCommandsFilter(it) } + initialFilter = { it.chat.id == config.sourceChatId && !FirstSourceIsCommandsFilter(it) } ) { - startChain(RegistrationState.Finish(it.chat.id, listOf(PostContentInfo.fromMessage(it, 0)))) - } - - onMediaGroup( - initialFilter = { it.first().chat.id == config.sourceChatId } - ) { - startChain( - RegistrationState.Finish( - it.first().chat.id, - it.map { - PostContentInfo.fromMessage( - it, - 0 - ) - } - ) - ) + startChain(RegistrationState.Finish(it.chat.id, PostContentInfo.fromMessage(it))) } koin.getOrNull() ?.apply { addTemplate( diff --git a/ratings/source/src/jvmMain/kotlin/repos/ExposedPollsToMessagesInfoRepo.kt b/ratings/source/src/jvmMain/kotlin/repos/ExposedPollsToMessagesInfoRepo.kt index 7f73962..f36cd1d 100644 --- a/ratings/source/src/jvmMain/kotlin/repos/ExposedPollsToMessagesInfoRepo.kt +++ b/ratings/source/src/jvmMain/kotlin/repos/ExposedPollsToMessagesInfoRepo.kt @@ -4,6 +4,7 @@ import dev.inmo.micro_utils.repos.exposed.initTable import dev.inmo.micro_utils.repos.exposed.keyvalue.AbstractExposedKeyValueRepo import dev.inmo.plaguposter.common.ShortMessageInfo import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.IdChatIdentifier import dev.inmo.tgbotapi.types.PollIdentifier import org.jetbrains.exposed.sql.* import org.jetbrains.exposed.sql.statements.* @@ -16,10 +17,11 @@ class ExposedPollsToMessagesInfoRepo( ) { override val keyColumn = text("poll_id") private val chatIdColumn = long("chat_id") + private val threadIdColumn = long("thread_id").nullable().default(null) private val messageIdColumn = long("message_id") - override val selectById: SqlExpressionBuilder.(PollIdentifier) -> Op = { keyColumn.eq(it) } - override val selectByValue: SqlExpressionBuilder.(ShortMessageInfo) -> Op = { - chatIdColumn.eq(it.chatId.chatId).and( + override val selectById: ISqlExpressionBuilder.(PollIdentifier) -> Op = { keyColumn.eq(it) } + override val selectByValue: ISqlExpressionBuilder.(ShortMessageInfo) -> Op = { + chatIdColumn.eq(it.chatId.chatId).and(threadIdColumn.eq(it.chatId.threadId)).and( messageIdColumn.eq(it.messageId) ) } @@ -27,7 +29,7 @@ class ExposedPollsToMessagesInfoRepo( get() = get(keyColumn) override val ResultRow.asObject: ShortMessageInfo get() = ShortMessageInfo( - get(chatIdColumn).let(::ChatId), + IdChatIdentifier(get(chatIdColumn), get(threadIdColumn)), get(messageIdColumn) ) @@ -37,6 +39,7 @@ class ExposedPollsToMessagesInfoRepo( override fun update(k: PollIdentifier, v: ShortMessageInfo, it: UpdateBuilder) { it[chatIdColumn] = v.chatId.chatId + it[threadIdColumn] = v.chatId.threadId it[messageIdColumn] = v.messageId } diff --git a/ratings/source/src/jvmMain/kotlin/repos/ExposedPollsToPostsIdsRepo.kt b/ratings/source/src/jvmMain/kotlin/repos/ExposedPollsToPostsIdsRepo.kt index fce2b48..d68ed9c 100644 --- a/ratings/source/src/jvmMain/kotlin/repos/ExposedPollsToPostsIdsRepo.kt +++ b/ratings/source/src/jvmMain/kotlin/repos/ExposedPollsToPostsIdsRepo.kt @@ -12,8 +12,8 @@ class ExposedPollsToPostsIdsRepo( ) : PollsToPostsIdsRepo, AbstractExposedKeyValueRepo(database, "polls_to_posts") { override val keyColumn = text("poll_id") val postIdColumn = text("postId") - override val selectById: SqlExpressionBuilder.(PollIdentifier) -> Op = { keyColumn.eq(it) } - override val selectByValue: SqlExpressionBuilder.(PostId) -> Op = { postIdColumn.eq(it.string) } + override val selectById: ISqlExpressionBuilder.(PollIdentifier) -> Op = { keyColumn.eq(it) } + override val selectByValue: ISqlExpressionBuilder.(PostId) -> Op = { postIdColumn.eq(it.string) } override val ResultRow.asKey: PollIdentifier get() = get(keyColumn) override val ResultRow.asObject: PostId diff --git a/ratings/src/jvmMain/kotlin/exposed/ExposedRatingsRepo.kt b/ratings/src/jvmMain/kotlin/exposed/ExposedRatingsRepo.kt index 0f0799f..0c7f14e 100644 --- a/ratings/src/jvmMain/kotlin/exposed/ExposedRatingsRepo.kt +++ b/ratings/src/jvmMain/kotlin/exposed/ExposedRatingsRepo.kt @@ -17,8 +17,8 @@ class ExposedRatingsRepo ( ) { override val keyColumn = text("post_id") val ratingsColumn = double("rating") - override val selectById: SqlExpressionBuilder.(PostId) -> Op = { keyColumn.eq(it.string) } - override val selectByValue: SqlExpressionBuilder.(Rating) -> Op = { ratingsColumn.eq(it.double) } + override val selectById: ISqlExpressionBuilder.(PostId) -> Op = { keyColumn.eq(it.string) } + override val selectByValue: ISqlExpressionBuilder.(Rating) -> Op = { ratingsColumn.eq(it.double) } override val ResultRow.asKey: PostId get() = get(keyColumn).let(::PostId) override val ResultRow.asObject: Rating