2021-11-24 07:52:27 +00:00
|
|
|
package dev.inmo.postssystem.client
|
|
|
|
|
|
|
|
import dev.inmo.postssystem.client.ui.fsm.*
|
|
|
|
import dev.inmo.postssystem.features.auth.client.installClientAuthenticator
|
|
|
|
import dev.inmo.postssystem.features.auth.common.*
|
2022-01-07 17:38:55 +00:00
|
|
|
import dev.inmo.postssystem.features.files.client.ClientReadFilesStorage
|
|
|
|
import dev.inmo.postssystem.features.files.common.storage.ReadFilesStorage
|
2021-11-27 19:11:04 +00:00
|
|
|
import dev.inmo.postssystem.features.roles.common.Role
|
|
|
|
import dev.inmo.postssystem.features.roles.common.RolesStorage
|
|
|
|
import dev.inmo.postssystem.features.roles.client.ClientRolesStorage
|
2021-11-24 07:52:27 +00:00
|
|
|
import dev.inmo.postssystem.features.roles.manager.common.RolesManagerRoleSerializer
|
|
|
|
import dev.inmo.postssystem.features.users.client.UsersStorageKtorClient
|
|
|
|
import dev.inmo.postssystem.features.users.common.ReadUsersStorage
|
|
|
|
import dev.inmo.postssystem.features.users.common.User
|
|
|
|
import dev.inmo.micro_utils.common.Either
|
|
|
|
import dev.inmo.micro_utils.coroutines.LinkedSupervisorScope
|
|
|
|
import dev.inmo.micro_utils.fsm.common.StatesMachine
|
|
|
|
import dev.inmo.micro_utils.fsm.common.dsl.FSMBuilder
|
|
|
|
import dev.inmo.micro_utils.fsm.common.managers.DefaultStatesManagerRepo
|
|
|
|
import dev.inmo.micro_utils.ktor.client.UnifiedRequester
|
|
|
|
import dev.inmo.micro_utils.repos.KeyValueRepo
|
2021-11-24 09:36:54 +00:00
|
|
|
import dev.inmo.postssystem.client.settings.DefaultSettings
|
|
|
|
import dev.inmo.postssystem.client.settings.Settings
|
|
|
|
import dev.inmo.postssystem.client.settings.auth.AuthSettings
|
|
|
|
import dev.inmo.postssystem.client.settings.auth.DefaultAuthSettings
|
2021-11-24 14:25:05 +00:00
|
|
|
import dev.inmo.postssystem.features.common.common.SerializersModuleConfigurator
|
|
|
|
import dev.inmo.postssystem.features.common.common.singleWithRandomQualifier
|
|
|
|
import dev.inmo.postssystem.features.content.common.ContentSerializersModuleConfigurator
|
|
|
|
import dev.inmo.postssystem.features.content.common.OtherContentSerializerModuleConfigurator
|
2021-11-27 10:19:30 +00:00
|
|
|
import dev.inmo.postssystem.features.content.text.common.TextContentSerializerModuleConfigurator
|
2021-11-24 09:36:54 +00:00
|
|
|
import dev.inmo.postssystem.features.status.client.StatusFeatureClient
|
2022-03-11 16:26:06 +00:00
|
|
|
import dev.inmo.postssystem.publicators.simple.client.SimplePublicatorService
|
|
|
|
import dev.inmo.postssystem.publicators.simple.client.SimplePublicatorServiceClient
|
2022-01-22 07:30:49 +00:00
|
|
|
import dev.inmo.postssystem.services.posts.client.ClientPostsService
|
|
|
|
import dev.inmo.postssystem.services.posts.common.*
|
2021-11-24 07:52:27 +00:00
|
|
|
import io.ktor.client.HttpClient
|
|
|
|
import kotlinx.coroutines.CoroutineScope
|
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
import kotlinx.serialization.BinaryFormat
|
|
|
|
import kotlinx.serialization.StringFormat
|
2021-11-24 14:25:05 +00:00
|
|
|
import kotlinx.serialization.cbor.Cbor
|
2021-11-24 07:52:27 +00:00
|
|
|
import kotlinx.serialization.json.Json
|
2021-11-24 14:25:05 +00:00
|
|
|
import kotlinx.serialization.modules.SerializersModule
|
2021-11-24 07:52:27 +00:00
|
|
|
import org.koin.core.Koin
|
|
|
|
import org.koin.core.context.startKoin
|
|
|
|
import org.koin.core.module.Module
|
|
|
|
import org.koin.core.qualifier.*
|
|
|
|
import org.koin.core.scope.Scope
|
2022-01-22 07:30:49 +00:00
|
|
|
import org.koin.dsl.binds
|
2021-11-24 07:52:27 +00:00
|
|
|
import org.koin.dsl.module
|
|
|
|
|
|
|
|
val UIScopeQualifier = StringQualifier("CoroutineScopeUI")
|
|
|
|
val SettingsQualifier = StringQualifier("Settings")
|
2021-11-27 19:11:04 +00:00
|
|
|
val RolesQualifier = StringQualifier("Roles")
|
2021-11-24 07:52:27 +00:00
|
|
|
private val FSMHandlersBuilderQualifier = StringQualifier("FSMHandlersBuilder")
|
|
|
|
|
|
|
|
val defaultSerialFormat = Json {
|
|
|
|
ignoreUnknownKeys = true
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Entrypoint for getting [org.koin.core.Koin] DI for the client
|
|
|
|
*
|
|
|
|
* @param repoFactory Factory for creating of [DefaultStatesManagerRepo] for [dev.inmo.postssystem.client.ui.fsm.UIFSM]
|
|
|
|
*/
|
|
|
|
fun baseKoin(
|
|
|
|
defaultScope: CoroutineScope,
|
|
|
|
settingsFactory: Scope.() -> KeyValueRepo<String, Any>,
|
|
|
|
repoFactory: Scope.() -> DefaultStatesManagerRepo<UIFSMState>,
|
|
|
|
handlersSetter: Pair<Scope, FSMBuilder<UIFSMState>>.() -> Unit
|
|
|
|
): Koin = startKoin {
|
|
|
|
modules(
|
|
|
|
module {
|
2021-11-24 14:25:05 +00:00
|
|
|
singleWithRandomQualifier<ContentSerializersModuleConfigurator.Element> { OtherContentSerializerModuleConfigurator }
|
2021-11-24 14:32:21 +00:00
|
|
|
singleWithRandomQualifier<ContentSerializersModuleConfigurator.Element> { TextContentSerializerModuleConfigurator }
|
2021-11-24 14:25:05 +00:00
|
|
|
singleWithRandomQualifier<SerializersModuleConfigurator.Element> { ContentSerializersModuleConfigurator(getAll()) }
|
|
|
|
single { SerializersModuleConfigurator(getAll()) }
|
|
|
|
|
|
|
|
single {
|
|
|
|
Json {
|
|
|
|
ignoreUnknownKeys = true
|
|
|
|
serializersModule = SerializersModule { get<SerializersModuleConfigurator>().apply { invoke() } }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
single<StringFormat> { get<Json>() }
|
|
|
|
|
2021-11-24 07:52:27 +00:00
|
|
|
single(SettingsQualifier) { settingsFactory() }
|
2021-11-24 09:36:54 +00:00
|
|
|
single { DBDropper(get(SettingsQualifier)) }
|
2021-11-24 07:52:27 +00:00
|
|
|
single(FSMHandlersBuilderQualifier) { handlersSetter }
|
|
|
|
single { repoFactory() }
|
|
|
|
single { defaultScope }
|
|
|
|
single(UIScopeQualifier) { get<CoroutineScope>().LinkedSupervisorScope(Dispatchers.Main) }
|
|
|
|
single<StatesMachine<UIFSMState>>(UIFSMQualifier) { UIFSM(get()) { (this@single to this@UIFSM).apply(get(
|
|
|
|
FSMHandlersBuilderQualifier
|
|
|
|
)) } }
|
2021-11-24 09:36:54 +00:00
|
|
|
single<AuthSettings> { DefaultAuthSettings(get(SettingsQualifier), get(), koin, get()) }
|
|
|
|
single<Settings> { DefaultSettings(get()) }
|
2021-11-24 07:52:27 +00:00
|
|
|
}
|
|
|
|
)
|
|
|
|
}.koin.apply {
|
|
|
|
loadModules(
|
|
|
|
listOf(
|
|
|
|
module { single<Koin> { this@apply } }
|
|
|
|
)
|
|
|
|
)
|
|
|
|
RolesManagerRoleSerializer // Just to activate it in JS client
|
|
|
|
}
|
|
|
|
|
|
|
|
fun getAuthorizedFeaturesDIModule(
|
|
|
|
serverUrl: String,
|
|
|
|
initialAuthKey: Either<AuthKey, AuthTokenInfo>,
|
|
|
|
onAuthKeyUpdated: suspend (AuthTokenInfo) -> Unit,
|
|
|
|
onUserRetrieved: suspend (User?) -> Unit,
|
|
|
|
onAuthKeyInvalidated: suspend () -> Unit
|
|
|
|
): Module {
|
|
|
|
val serverUrlQualifier = StringQualifier("serverUrl")
|
|
|
|
val credsQualifier = StringQualifier("creds")
|
|
|
|
|
|
|
|
return module {
|
|
|
|
single(createdAtStart = true) {
|
|
|
|
HttpClient {
|
|
|
|
installClientAuthenticator(serverUrl, get(), get(credsQualifier), onAuthKeyUpdated, onUserRetrieved, onAuthKeyInvalidated)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
single(credsQualifier) { initialAuthKey }
|
|
|
|
single(serverUrlQualifier) { serverUrl }
|
2021-11-24 14:25:05 +00:00
|
|
|
single<BinaryFormat> {
|
|
|
|
Cbor {
|
|
|
|
serializersModule = SerializersModule { get<SerializersModuleConfigurator>().apply { invoke() } }
|
|
|
|
}
|
|
|
|
}
|
2021-11-24 07:52:27 +00:00
|
|
|
single { UnifiedRequester(get(), get()) }
|
|
|
|
|
2021-11-24 09:36:54 +00:00
|
|
|
single { StatusFeatureClient(get(serverUrlQualifier), get()) }
|
|
|
|
|
2022-01-07 17:38:55 +00:00
|
|
|
single<ReadFilesStorage> { ClientReadFilesStorage(get(serverUrlQualifier), get(), get()) }
|
2021-11-24 07:52:27 +00:00
|
|
|
single<ReadUsersStorage> { UsersStorageKtorClient(get(serverUrlQualifier), get()) }
|
2021-11-27 19:11:04 +00:00
|
|
|
single<RolesStorage<Role>> { ClientRolesStorage(get(serverUrlQualifier), get(), Role.serializer()) }
|
2022-01-22 07:30:49 +00:00
|
|
|
single<PostsService> { ClientPostsService(get(serverUrlQualifier), get()) } binds arrayOf(
|
|
|
|
ReadPostsService::class,
|
|
|
|
WritePostsService::class
|
|
|
|
)
|
2022-03-11 16:26:06 +00:00
|
|
|
single<SimplePublicatorService> { SimplePublicatorServiceClient(get(serverUrlQualifier), get()) }
|
2021-11-24 07:52:27 +00:00
|
|
|
}
|
|
|
|
}
|