106 lines
4.4 KiB
Kotlin
106 lines
4.4 KiB
Kotlin
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.*
|
|
import dev.inmo.postssystem.features.files.client.ClientFilesStorage
|
|
import dev.inmo.postssystem.features.files.common.storage.FilesStorage
|
|
import dev.inmo.postssystem.features.roles.common.UserRole
|
|
import dev.inmo.postssystem.features.roles.common.UsersRolesStorage
|
|
import dev.inmo.postssystem.features.roles.client.ClientUsersRolesStorage
|
|
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.ktor.common.standardKtorSerialFormat
|
|
import dev.inmo.micro_utils.repos.KeyValueRepo
|
|
import io.ktor.client.HttpClient
|
|
import kotlinx.coroutines.CoroutineScope
|
|
import kotlinx.coroutines.Dispatchers
|
|
import kotlinx.serialization.BinaryFormat
|
|
import kotlinx.serialization.StringFormat
|
|
import kotlinx.serialization.json.Json
|
|
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
|
|
import org.koin.dsl.module
|
|
|
|
val UIScopeQualifier = StringQualifier("CoroutineScopeUI")
|
|
val SettingsQualifier = StringQualifier("Settings")
|
|
val UserRolesQualifier = StringQualifier("UserRoles")
|
|
private val DBDropperQualifier = StringQualifier("DBDropper")
|
|
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 {
|
|
single<StringFormat> { defaultSerialFormat }
|
|
single(SettingsQualifier) { settingsFactory() }
|
|
single<DBDropper>(DBDropperQualifier) { DBDropper(get(SettingsQualifier)) }
|
|
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
|
|
)) } }
|
|
}
|
|
)
|
|
}.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 }
|
|
single<BinaryFormat> { standardKtorSerialFormat }
|
|
single { UnifiedRequester(get(), get()) }
|
|
|
|
single<FilesStorage> { ClientFilesStorage(get(serverUrlQualifier), get(), get()) }
|
|
single<ReadUsersStorage> { UsersStorageKtorClient(get(serverUrlQualifier), get()) }
|
|
single<UsersRolesStorage<UserRole>> { ClientUsersRolesStorage(get(serverUrlQualifier), get(), UserRole.serializer()) }
|
|
}
|
|
}
|