From f683809f29be8e59f7d1174c3bde219a32fba35e Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 11 Mar 2022 20:37:40 +0600 Subject: [PATCH] continue to adding workaround --- .../common/server/sessions/ModuleLoader.kt | 8 +++++ server/build.gradle | 1 + .../dev/inmo/postssystem/server/Config.kt | 15 +++++++++ .../java/dev/inmo/postssystem/server/DI.kt | 29 +++++++++------- server/test.config.json | 9 ++++- settings.gradle | 2 ++ targets/telegram/loader/client/build.gradle | 18 ++++++++++ .../targets/telegram/loader/client/.gitkeep | 0 .../client/src/main/AndroidManifest.xml | 1 + targets/telegram/loader/common/build.gradle | 17 ++++++++++ .../targets/telegram/loader/common/.gitkeep | 0 .../common/src/main/AndroidManifest.xml | 1 + targets/telegram/loader/server/build.gradle | 18 ++++++++++ .../telegram/loader/server/SubConfig.kt | 21 ++++++++++++ .../server/TelegramTargetModuleLoader.kt | 33 +++++++++++++++++++ 15 files changed, 161 insertions(+), 12 deletions(-) create mode 100644 features/common/server/src/jvmMain/kotlin/dev/inmo/postssystem/features/common/server/sessions/ModuleLoader.kt create mode 100644 targets/telegram/loader/client/build.gradle create mode 100644 targets/telegram/loader/client/src/commonMain/kotlin/dev/inmo/postssystem/targets/telegram/loader/client/.gitkeep create mode 100644 targets/telegram/loader/client/src/main/AndroidManifest.xml create mode 100644 targets/telegram/loader/common/build.gradle create mode 100644 targets/telegram/loader/common/src/commonMain/kotlin/dev/inmo/postssystem/targets/telegram/loader/common/.gitkeep create mode 100644 targets/telegram/loader/common/src/main/AndroidManifest.xml create mode 100644 targets/telegram/loader/server/build.gradle create mode 100644 targets/telegram/loader/server/src/jvmMain/kotlin/dev/inmo/postssystem/targets/telegram/loader/server/SubConfig.kt create mode 100644 targets/telegram/loader/server/src/jvmMain/kotlin/dev/inmo/postssystem/targets/telegram/loader/server/TelegramTargetModuleLoader.kt diff --git a/features/common/server/src/jvmMain/kotlin/dev/inmo/postssystem/features/common/server/sessions/ModuleLoader.kt b/features/common/server/src/jvmMain/kotlin/dev/inmo/postssystem/features/common/server/sessions/ModuleLoader.kt new file mode 100644 index 00000000..ee1c2f10 --- /dev/null +++ b/features/common/server/src/jvmMain/kotlin/dev/inmo/postssystem/features/common/server/sessions/ModuleLoader.kt @@ -0,0 +1,8 @@ +package dev.inmo.postssystem.features.common.server.sessions + +import kotlinx.serialization.json.JsonObject +import org.koin.core.module.Module + +interface ModuleLoader { + fun Module.load(config: JsonObject) +} diff --git a/server/build.gradle b/server/build.gradle index 969ada4b..ac86e9b2 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -25,6 +25,7 @@ dependencies { api project(":postssystem.services.posts.server") + api project(":postssystem.targets.telegram.loader.server") api project(":postssystem.targets.telegram.publication.server") api libs.ktor.server.netty diff --git a/server/src/main/java/dev/inmo/postssystem/server/Config.kt b/server/src/main/java/dev/inmo/postssystem/server/Config.kt index f944bb7a..7c798b1a 100644 --- a/server/src/main/java/dev/inmo/postssystem/server/Config.kt +++ b/server/src/main/java/dev/inmo/postssystem/server/Config.kt @@ -1,5 +1,6 @@ package dev.inmo.postssystem.server +import dev.inmo.postssystem.features.common.server.sessions.ModuleLoader import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import java.io.File @@ -13,11 +14,25 @@ data class Config( @SerialName("auth") val authConfig: AuthConfig = AuthConfig(), val filesFolder: String, + @SerialName("modules") + val modulesClassPaths: List, val debugMode: Boolean = false ) { val filesFolderFile: File get() = File(filesFolder) + @kotlinx.serialization.Transient + val modules by lazy { + modulesClassPaths.mapNotNull { moduleClassPath -> + runCatching { + Class.forName(moduleClassPath).constructors.firstOrNull { it.parameterCount == 0 } ?.newInstance() as ModuleLoader + }.onFailure { + println("Unable to load $moduleClassPath") + it.printStackTrace() + }.getOrNull() + } + } + val commonFilesFolder: File get() = File(filesFolderFile, "common").also { it.mkdirs() } val binaryFilesFolder: File diff --git a/server/src/main/java/dev/inmo/postssystem/server/DI.kt b/server/src/main/java/dev/inmo/postssystem/server/DI.kt index 9c0b1109..9ca2d5fc 100644 --- a/server/src/main/java/dev/inmo/postssystem/server/DI.kt +++ b/server/src/main/java/dev/inmo/postssystem/server/DI.kt @@ -27,14 +27,13 @@ import dev.inmo.micro_utils.repos.exposed.onetomany.ExposedOneToManyKeyValueRepo import dev.inmo.postssystem.features.common.common.* import dev.inmo.postssystem.features.content.binary.server.BinaryServerContentStorage import dev.inmo.postssystem.features.content.common.* -import dev.inmo.postssystem.features.content.server.storage.ServerContentStorage import dev.inmo.postssystem.features.content.server.ServerContentStorageAggregator import dev.inmo.postssystem.features.content.server.ServerContentStorageWrapper +import dev.inmo.postssystem.features.content.server.storage.* import dev.inmo.postssystem.features.content.text.common.TextContent import dev.inmo.postssystem.features.content.text.common.TextContentSerializerModuleConfigurator import dev.inmo.postssystem.features.content.text.server.TextServerContentStorage -import dev.inmo.postssystem.features.posts.server.ExposedServerPostsStorage -import dev.inmo.postssystem.features.posts.server.ServerPostsStorage +import dev.inmo.postssystem.features.posts.server.* import dev.inmo.postssystem.features.publication.server.PublicationManager import dev.inmo.postssystem.features.publication.server.PublicationTarget import dev.inmo.postssystem.services.posts.server.* @@ -50,7 +49,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.serialization.BinaryFormat import kotlinx.serialization.StringFormat import kotlinx.serialization.cbor.Cbor -import kotlinx.serialization.json.Json +import kotlinx.serialization.json.* import kotlinx.serialization.modules.SerializersModule import org.jetbrains.exposed.sql.Database import org.koin.core.module.Module @@ -75,7 +74,8 @@ fun getDIModule( val configJson = Json { ignoreUnknownKeys = true } - val config = configJson.decodeFromString(Config.serializer(), File(args.first()).readText()) + val configJsonElement = configJson.decodeFromString(JsonObject.serializer(), File(args.first()).readText()) + val config = configJson.decodeFromJsonElement(Config.serializer(), configJsonElement) val originalFilesMetasKeyValueRepoQualifier = StringQualifier("OriginalFilesMetaKV") val binaryOriginalFilesMetasKeyValueRepoQualifier = StringQualifier("BinaryOriginalFilesMetaKV") @@ -148,10 +148,7 @@ fun getDIModule( } singleWithBinds> { RolesAggregator(getAll()) } - // Publication targets - singleWithRandomQualifier { PublicationTargetTelegram(get(), get()) } - - single { PublicationManager(getAll(), get(), get(), get()) } + single(createdAtStart = true) { PublicationManager(getAll(), get(), get(), get()) } // Roles checkers single>(StringQualifier(RolesManagerRolesChecker.key)) { RolesManagerRolesChecker } @@ -185,10 +182,16 @@ fun getDIModule( ) } - single> { ServerContentStorageAggregator(getAll(), get()) } + single> { ServerContentStorageAggregator(getAll(), get()) } binds arrayOf( + ServerReadContentStorage::class, + ServerWriteContentStorage::class + ) // Posts storage - single { ExposedServerPostsStorage(get()) } + single { ExposedServerPostsStorage(get()) } binds arrayOf( + ServerReadPostsStorage::class, + ServerWritePostsStorage::class + ) singleWithBinds { ServerPostsService( @@ -254,5 +257,9 @@ fun getDIModule( } } } + + config.modules.forEach { + it.apply { load(configJsonElement) } + } } } diff --git a/server/test.config.json b/server/test.config.json index f29bf545..dd55f00f 100644 --- a/server/test.config.json +++ b/server/test.config.json @@ -5,5 +5,12 @@ "password": "test" }, "filesFolder": "/tmp/files", - "debugMode": true + "debugMode": true, + "modules": [ + "dev.inmo.postssystem.targets.telegram.loader.server.TelegramTargetModuleLoader" + ], + "telegram": { + "botToken": "YOUR BOT TOKEN", + "targetChatId": "YOUR CHAT ID" + } } diff --git a/settings.gradle b/settings.gradle index c19f4e84..cb027810 100644 --- a/settings.gradle +++ b/settings.gradle @@ -54,6 +54,8 @@ String[] includes = [ ":features:publication:server", ":targets:telegram:publication:server", + ":targets:telegram:loader:common", + ":targets:telegram:loader:server", ":server", ":client", diff --git a/targets/telegram/loader/client/build.gradle b/targets/telegram/loader/client/build.gradle new file mode 100644 index 00000000..c2067ab6 --- /dev/null +++ b/targets/telegram/loader/client/build.gradle @@ -0,0 +1,18 @@ +plugins { + id "org.jetbrains.kotlin.multiplatform" + id "org.jetbrains.kotlin.plugin.serialization" + id "com.android.library" +} + +apply from: "$mppProjectWithSerializationPresetPath" + +kotlin { + sourceSets { + commonMain { + dependencies { + api project(":postssystem.targets.telegram.loader.common") + api project(":postssystem.features.common.client") + } + } + } +} diff --git a/targets/telegram/loader/client/src/commonMain/kotlin/dev/inmo/postssystem/targets/telegram/loader/client/.gitkeep b/targets/telegram/loader/client/src/commonMain/kotlin/dev/inmo/postssystem/targets/telegram/loader/client/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/targets/telegram/loader/client/src/main/AndroidManifest.xml b/targets/telegram/loader/client/src/main/AndroidManifest.xml new file mode 100644 index 00000000..51e0df9c --- /dev/null +++ b/targets/telegram/loader/client/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/targets/telegram/loader/common/build.gradle b/targets/telegram/loader/common/build.gradle new file mode 100644 index 00000000..d4a562e5 --- /dev/null +++ b/targets/telegram/loader/common/build.gradle @@ -0,0 +1,17 @@ +plugins { + id "org.jetbrains.kotlin.multiplatform" + id "org.jetbrains.kotlin.plugin.serialization" + id "com.android.library" +} + +apply from: "$mppProjectWithSerializationPresetPath" + +kotlin { + sourceSets { + commonMain { + dependencies { + api project(":postssystem.features.common.common") + } + } + } +} diff --git a/targets/telegram/loader/common/src/commonMain/kotlin/dev/inmo/postssystem/targets/telegram/loader/common/.gitkeep b/targets/telegram/loader/common/src/commonMain/kotlin/dev/inmo/postssystem/targets/telegram/loader/common/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/targets/telegram/loader/common/src/main/AndroidManifest.xml b/targets/telegram/loader/common/src/main/AndroidManifest.xml new file mode 100644 index 00000000..42095171 --- /dev/null +++ b/targets/telegram/loader/common/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/targets/telegram/loader/server/build.gradle b/targets/telegram/loader/server/build.gradle new file mode 100644 index 00000000..a8effff2 --- /dev/null +++ b/targets/telegram/loader/server/build.gradle @@ -0,0 +1,18 @@ +plugins { + id "org.jetbrains.kotlin.multiplatform" + id "org.jetbrains.kotlin.plugin.serialization" +} + +apply from: "$mppJavaProjectPresetPath" + +kotlin { + sourceSets { + commonMain { + dependencies { + api project(":postssystem.targets.telegram.loader.common") + api project(":postssystem.targets.telegram.publication.server") + api project(":postssystem.features.common.server") + } + } + } +} diff --git a/targets/telegram/loader/server/src/jvmMain/kotlin/dev/inmo/postssystem/targets/telegram/loader/server/SubConfig.kt b/targets/telegram/loader/server/src/jvmMain/kotlin/dev/inmo/postssystem/targets/telegram/loader/server/SubConfig.kt new file mode 100644 index 00000000..282a3f61 --- /dev/null +++ b/targets/telegram/loader/server/src/jvmMain/kotlin/dev/inmo/postssystem/targets/telegram/loader/server/SubConfig.kt @@ -0,0 +1,21 @@ +package dev.inmo.postssystem.targets.telegram.loader.server + +import dev.inmo.tgbotapi.bot.Ktor.telegramBot +import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.utils.TelegramAPIUrlsKeeper +import dev.inmo.tgbotapi.utils.telegramBotAPIDefaultUrl +import kotlinx.serialization.Serializable + +@Serializable +data class SubConfig( + private val botToken: String, + val targetChatId: ChatId, + private val hostUrl: String = telegramBotAPIDefaultUrl +) { + val telegramInfo by lazy { + TelegramAPIUrlsKeeper(botToken, hostUrl) + } + val bot by lazy { + telegramBot(telegramInfo) + } +} diff --git a/targets/telegram/loader/server/src/jvmMain/kotlin/dev/inmo/postssystem/targets/telegram/loader/server/TelegramTargetModuleLoader.kt b/targets/telegram/loader/server/src/jvmMain/kotlin/dev/inmo/postssystem/targets/telegram/loader/server/TelegramTargetModuleLoader.kt new file mode 100644 index 00000000..944495a6 --- /dev/null +++ b/targets/telegram/loader/server/src/jvmMain/kotlin/dev/inmo/postssystem/targets/telegram/loader/server/TelegramTargetModuleLoader.kt @@ -0,0 +1,33 @@ +package dev.inmo.postssystem.targets.telegram.loader.server + +import dev.inmo.postssystem.features.common.common.singleWithRandomQualifier +import dev.inmo.postssystem.features.common.server.sessions.ModuleLoader +import dev.inmo.postssystem.features.publication.server.PublicationTarget +import dev.inmo.postssystem.targets.telegram.publication.server.PublicationTargetTelegram +import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.types.ChatId +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject +import org.koin.core.module.Module +import org.koin.core.qualifier.StringQualifier + +/** + * Expects to get a config from a field "telegram" of your config + */ +class TelegramTargetModuleLoader : ModuleLoader { + override fun Module.load(config: JsonObject) { + val configJson = config["telegram"] + + val postingChatIdQualifier = StringQualifier("telegram_postingChatId") + + configJson ?.let { + single { get().decodeFromJsonElement(SubConfig.serializer(), configJson) } + single { get().bot } + single(postingChatIdQualifier) { get().targetChatId } + + singleWithRandomQualifier { + PublicationTargetTelegram(get(), get(postingChatIdQualifier)) + } + } + } +}