All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.com.paoapps.fifi.auth.di.Koin.kt Maven / Gradle / Ivy

package com.paoapps.fifi.auth.di

import com.paoapps.fifi.auth.AuthApi
import com.paoapps.fifi.auth.Claims
import com.paoapps.fifi.auth.IdentifiableClaims
import com.paoapps.fifi.auth.SettingsTokenStore
import com.paoapps.fifi.auth.TokenDecoder
import com.paoapps.fifi.auth.TokenStore
import com.paoapps.fifi.auth.api.AuthClientApi
import com.paoapps.fifi.auth.model.AuthModel
import com.paoapps.fifi.auth.model.AuthModelImpl
import com.paoapps.fifi.di.AppDefinition
import com.paoapps.fifi.model.Model
import com.paoapps.fifi.model.ModelEnvironment
import org.koin.core.logger.Logger
import org.koin.core.module.Module
import org.koin.core.qualifier.named
import org.koin.core.scope.Scope
import org.koin.dsl.KoinAppDeclaration
import org.koin.dsl.module

internal expect fun platformInjections(serviceName: String, module: Module)

enum class PlatformModuleQualifier {
    ENCRYPTED_SETTINGS,
    SETTINGS
}

data class Authentication, RefreshTokenClaims: Claims>(
    val tokenDecoder: TokenDecoder,
    val authApi: (scope: Scope) -> AuthApi
)

fun , RefreshTokenClaims: Claims, Api: AuthClientApi> initKoinApp(
    authAppDefinition: AuthAppDefinition,
    additionalModules: List = emptyList(),
    logger: Logger? = null,
    appDeclaration: KoinAppDeclaration = {},
) = com.paoapps.fifi.di.initKoinApp(
    authAppDefinition,
    additionalModules + module {
        single> {
            val model: Model = get()
            authAppDefinition.authModel (model)
        }
        single { SettingsTokenStore(get(named(PlatformModuleQualifier.ENCRYPTED_SETTINGS))) }
        single {
            authAppDefinition.authentication.tokenDecoder
        }

        single {
            authAppDefinition.authentication.authApi.invoke(this)
        }

        platformInjections(authAppDefinition.serviceName, this)

    },
    logger,
    appDeclaration
)

interface AuthAppDefinition, RefreshTokenClaims: Claims, Api: AuthClientApi>: AppDefinition {
    val serviceName: String
    val authentication: Authentication

    fun authModel(model: Model): AuthModel {
        return AuthModelImpl(model)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy