continue to adding workaround

This commit is contained in:
2022-03-11 20:37:40 +06:00
parent a06324568e
commit f683809f29
15 changed files with 161 additions and 12 deletions
features/common/server/src/jvmMain/kotlin/dev/inmo/postssystem/features/common/server/sessions
server
build.gradle
src
main
java
dev
inmo
postssystem
test.config.json
settings.gradle
targets/telegram/loader
client
build.gradle
src
commonMain
kotlin
dev
inmo
postssystem
targets
telegram
loader
client
main
common
build.gradle
src
commonMain
kotlin
dev
inmo
postssystem
targets
telegram
loader
common
main
server
build.gradle
src
jvmMain
kotlin
dev
inmo
postssystem

@ -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)
}

@ -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

@ -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<String>,
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

@ -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<RolesStorage<Role>> { RolesAggregator(getAll()) }
// Publication targets
singleWithRandomQualifier<PublicationTarget> { PublicationTargetTelegram(get(), get()) }
single { PublicationManager(getAll(), get(), get(), get()) }
single(createdAtStart = true) { PublicationManager(getAll(), get(), get(), get()) }
// Roles checkers
single<RolesChecker<Role>>(StringQualifier(RolesManagerRolesChecker.key)) { RolesManagerRolesChecker }
@ -185,10 +182,16 @@ fun getDIModule(
)
}
single<ServerContentStorage<Content>> { ServerContentStorageAggregator(getAll(), get()) }
single<ServerContentStorage<Content>> { ServerContentStorageAggregator(getAll(), get()) } binds arrayOf(
ServerReadContentStorage::class,
ServerWriteContentStorage::class
)
// Posts storage
single<ServerPostsStorage> { ExposedServerPostsStorage(get()) }
single<ServerPostsStorage> { ExposedServerPostsStorage(get()) } binds arrayOf(
ServerReadPostsStorage::class,
ServerWritePostsStorage::class
)
singleWithBinds {
ServerPostsService(
@ -254,5 +257,9 @@ fun getDIModule(
}
}
}
config.modules.forEach {
it.apply { load(configJsonElement) }
}
}
}

@ -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"
}
}

@ -54,6 +54,8 @@ String[] includes = [
":features:publication:server",
":targets:telegram:publication:server",
":targets:telegram:loader:common",
":targets:telegram:loader:server",
":server",
":client",

@ -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")
}
}
}
}

@ -0,0 +1 @@
<manifest package="dev.inmo.postssystem.targets.telegram.loader.client"/>

@ -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")
}
}
}
}

@ -0,0 +1 @@
<manifest package="dev.inmo.postssystem.targets.telegram.loader.common"/>

@ -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")
}
}
}
}

@ -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)
}
}

@ -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<SubConfig> { get<Json>().decodeFromJsonElement(SubConfig.serializer(), configJson) }
single<TelegramBot> { get<SubConfig>().bot }
single<ChatId>(postingChatIdQualifier) { get<SubConfig>().targetChatId }
singleWithRandomQualifier<PublicationTarget> {
PublicationTargetTelegram(get(), get(postingChatIdQualifier))
}
}
}
}