core/server/src/main/java/dev/inmo/postssystem/server/DI.kt

219 lines
9.4 KiB
Kotlin
Raw Normal View History

2021-11-24 07:52:27 +00:00
package dev.inmo.postssystem.server
import dev.inmo.postssystem.features.auth.server.AuthenticationRoutingConfigurator
import dev.inmo.postssystem.features.auth.server.SessionAuthenticationConfigurator
import dev.inmo.postssystem.features.auth.server.tokens.*
2022-05-19 18:15:49 +00:00
import dev.inmo.postssystem.features.common.server.ApplicationAuthenticationConfigurator
2021-11-24 07:52:27 +00:00
import dev.inmo.postssystem.features.files.common.*
import dev.inmo.postssystem.features.files.common.storage.*
import dev.inmo.postssystem.features.files.server.FilesRoutingConfigurator
import dev.inmo.postssystem.features.roles.common.*
2021-11-27 19:11:04 +00:00
import dev.inmo.postssystem.features.roles.common.keyvalue.KeyValuesRolesOriginalRepo
2021-11-24 07:52:27 +00:00
import dev.inmo.postssystem.features.roles.manager.common.RolesManagerRole
import dev.inmo.postssystem.features.roles.manager.common.RolesManagerRoleStorage
import dev.inmo.postssystem.features.roles.manager.server.RolesManagerRolesChecker
2021-11-27 19:11:04 +00:00
import dev.inmo.postssystem.features.roles.manager.server.RolesManagerRolesStorageServerRoutesConfigurator
2021-11-24 07:52:27 +00:00
import dev.inmo.postssystem.features.roles.server.*
import dev.inmo.postssystem.features.status.server.StatusRoutingConfigurator
import dev.inmo.postssystem.features.users.common.ExposedUsersStorage
import dev.inmo.postssystem.features.users.server.UsersStorageServerRoutesConfigurator
import dev.inmo.micro_utils.coroutines.LinkedSupervisorScope
2021-11-24 14:25:05 +00:00
import dev.inmo.micro_utils.ktor.server.UnifiedRouter
2021-11-24 07:52:27 +00:00
import dev.inmo.micro_utils.ktor.server.configurators.*
import dev.inmo.micro_utils.ktor.server.createKtorServer
import dev.inmo.micro_utils.repos.exposed.keyvalue.ExposedKeyValueRepo
import dev.inmo.micro_utils.repos.exposed.onetomany.ExposedOneToManyKeyValueRepo
2021-11-24 14:25:05 +00:00
import dev.inmo.postssystem.features.common.common.*
2022-05-19 18:15:49 +00:00
import dev.inmo.postssystem.features.common.server.Qualifiers
2022-01-07 17:38:55 +00:00
import dev.inmo.postssystem.features.content.common.*
import dev.inmo.postssystem.features.content.server.ServerContentStorageAggregator
2022-03-11 14:37:40 +00:00
import dev.inmo.postssystem.features.content.server.storage.*
import dev.inmo.postssystem.features.posts.server.*
2022-01-07 15:35:11 +00:00
import dev.inmo.postssystem.features.publication.server.PublicationManager
2022-01-22 07:37:56 +00:00
import dev.inmo.postssystem.services.posts.server.*
2022-05-18 17:32:37 +00:00
import io.ktor.server.application.pluginOrNull
import io.ktor.server.application.log
import io.ktor.server.routing.Route
import io.ktor.server.routing.Routing
2021-11-24 07:52:27 +00:00
import io.ktor.server.engine.ApplicationEngine
import io.ktor.server.netty.Netty
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
2021-11-24 14:25:05 +00:00
import kotlinx.serialization.BinaryFormat
2021-11-24 07:52:27 +00:00
import kotlinx.serialization.StringFormat
2021-11-24 14:25:05 +00:00
import kotlinx.serialization.cbor.Cbor
2022-03-11 14:37:40 +00:00
import kotlinx.serialization.json.*
2021-11-24 14:25:05 +00:00
import kotlinx.serialization.modules.SerializersModule
2021-11-24 07:52:27 +00:00
import org.jetbrains.exposed.sql.Database
import org.koin.core.module.Module
import org.koin.core.parameter.ParametersHolder
import org.koin.core.qualifier.StringQualifier
2022-05-19 18:15:49 +00:00
import org.koin.core.qualifier.named
2021-11-24 07:52:27 +00:00
import org.koin.dsl.*
import java.io.File
private fun Route.print() {
println(this)
children.forEach {
it.print()
}
}
fun getDIModule(
vararg args: String,
baseScope: CoroutineScope = CoroutineScope(Dispatchers.IO)
): Module {
2021-11-24 14:25:05 +00:00
val configJson = Json {
2021-11-24 07:52:27 +00:00
ignoreUnknownKeys = true
}
2022-03-11 14:37:40 +00:00
val configJsonElement = configJson.decodeFromString(JsonObject.serializer(), File(args.first()).readText())
val config = configJson.decodeFromJsonElement(Config.serializer(), configJsonElement)
2021-11-24 07:52:27 +00:00
return module {
2021-11-24 14:25:05 +00:00
singleWithRandomQualifier<ContentSerializersModuleConfigurator.Element> { OtherContentSerializerModuleConfigurator }
singleWithRandomQualifier<SerializersModuleConfigurator.Element> { ContentSerializersModuleConfigurator(getAll()) }
single { SerializersModuleConfigurator(getAll()) }
single {
Json {
ignoreUnknownKeys = true
serializersModule = SerializersModule { get<SerializersModuleConfigurator>().apply { invoke() } }
}
}
2021-11-24 07:52:27 +00:00
single<StringFormat> { get<Json>() }
2021-11-24 14:25:05 +00:00
single<BinaryFormat> {
Cbor {
serializersModule = SerializersModule { get<SerializersModuleConfigurator>().apply { invoke() } }
}
}
single { UnifiedRouter(get()) }
2021-11-24 07:52:27 +00:00
singleWithBinds { config }
singleWithBinds { get<Config>().databaseConfig }
singleWithBinds { get<Config>().authConfig }
singleWithBinds(Qualifiers.filesFolderQualifier) { get<Config>().filesFolderFile }
2022-05-19 18:15:49 +00:00
singleWithBinds(Qualifiers.commonFilesFolderQualifier) { File(get<Config>().filesFolderFile, "common").apply { mkdirs() } }
2021-11-24 07:52:27 +00:00
singleWithBinds { get<DatabaseConfig>().database }
singleWithBinds { ExposedUsersStorage(get()) }
singleWithBinds { exposedUsersAuthenticator(get(), get()) }
factory<KeyValuesRolesOriginalRepo>(Qualifiers.usersRolesKeyValueFactoryQualifier) { (tableName: String) ->
2021-11-27 19:11:04 +00:00
ExposedOneToManyKeyValueRepo(get(), { text("subject") }, { text("role") }, tableName)
2021-11-24 07:52:27 +00:00
}
single {
RolesManagerRoleStorage(get(Qualifiers.usersRolesKeyValueFactoryQualifier) { ParametersHolder(mutableListOf("rolesManager")) })
2021-11-24 07:52:27 +00:00
}
2021-11-27 19:11:04 +00:00
single<RolesStorage<RolesManagerRole>>(StringQualifier("RolesManagerRoleStorage")) { get<RolesManagerRoleStorage>() }
2021-11-24 07:52:27 +00:00
singleWithBinds {
2021-11-27 19:11:04 +00:00
RolesStorageHolder(
2021-11-24 07:52:27 +00:00
RolesManagerRole::class,
get<RolesManagerRoleStorage>()
)
}
2021-11-27 19:11:04 +00:00
singleWithBinds<RolesStorage<Role>> { RolesAggregator(getAll()) }
2021-11-24 07:52:27 +00:00
2022-03-11 14:37:40 +00:00
single(createdAtStart = true) { PublicationManager(getAll(), get(), get(), get()) }
2022-01-07 15:35:11 +00:00
2021-11-24 07:52:27 +00:00
// Roles checkers
2021-11-27 19:11:04 +00:00
single<RolesChecker<Role>>(StringQualifier(RolesManagerRolesChecker.key)) { RolesManagerRolesChecker }
2021-11-24 07:52:27 +00:00
factory<CoroutineScope> { baseScope.LinkedSupervisorScope() }
2022-01-07 17:38:55 +00:00
// Content storages
2022-03-11 14:37:40 +00:00
single<ServerContentStorage<Content>> { ServerContentStorageAggregator(getAll(), get()) } binds arrayOf(
ServerReadContentStorage::class,
ServerWriteContentStorage::class
)
2022-01-07 17:38:55 +00:00
// Posts storage
2022-03-11 14:37:40 +00:00
single<ServerPostsStorage> { ExposedServerPostsStorage(get()) } binds arrayOf(
ServerReadPostsStorage::class,
ServerWritePostsStorage::class
)
2022-01-22 07:37:56 +00:00
singleWithBinds {
ServerPostsService(
DefaultExposedReadPostsService(get<ServerPostsStorage>()),
DefaultWritePostsService(get<ServerPostsStorage>(), get<ServerContentStorage<Content>>())
)
}
2022-05-19 18:15:49 +00:00
singleWithBinds<FilesStorage> {
val metasRepo = MetasKeyValueRepo(
get(),
ExposedKeyValueRepo(get(), { text("fileid") }, { text("metaInfo") }, "CommonFilesMetaInfoTable")
)
DefaultFilesStorage(
DiskReadFilesStorage(get(Qualifiers.commonFilesFolderQualifier), metasRepo),
WriteDistFilesStorage(get(Qualifiers.commonFilesFolderQualifier), metasRepo)
)
}
2021-11-24 07:52:27 +00:00
// Routing configurators
2021-11-24 14:25:05 +00:00
singleWithBinds { FilesRoutingConfigurator(get(), null, get()) }
2021-11-24 07:52:27 +00:00
singleWithBinds { StatusRoutingConfigurator }
2021-11-24 14:25:05 +00:00
singleWithBinds { UsersStorageServerRoutesConfigurator(get(), get()) }
2021-11-27 19:11:04 +00:00
singleWithBinds { RolesStorageReadServerRoutesConfigurator<Role>(get(), RoleSerializer, get()) }
singleWithBinds { RolesManagerRolesStorageServerRoutesConfigurator(get(), get()) }
singleWithBinds { ServerPostsServiceRoutingConfigurator(get(), get(), get(), get()) }
2021-11-24 07:52:27 +00:00
2022-01-25 09:21:01 +00:00
singleWithBinds { ClientStaticRoutingConfiguration("web") }
2021-11-24 07:52:27 +00:00
singleWithBinds {
2021-11-27 19:11:04 +00:00
RolesAuthenticationConfigurator<Role>(
2021-11-24 07:52:27 +00:00
get(),
get(),
getAll()
)
}
// Session and auth configurators
singleWithBinds { SessionAuthenticationConfigurator(get<AuthConfig>().sessionAge) }
singleWithBinds {
DefaultAuthTokensService(
get<Database>(),
get(),
get(),
get<AuthConfig>().sessionAge,
get()
)
}
2021-11-24 14:25:05 +00:00
singleWithBinds { AuthenticationRoutingConfigurator(get(), get(), get()) }
2022-03-10 15:35:32 +00:00
singleWithBinds { NotFoundStatusPageRedirectToIndex("/") }
2021-11-24 07:52:27 +00:00
if (config.debugMode) {
single<ApplicationRoutingConfigurator.Element>(StringQualifier("Tracer")) { ApplicationRoutingConfigurator.Element {(this as Routing).trace { application.log.trace(it.buildText()) } } }
}
singleWithBinds { ApplicationRoutingConfigurator(getAllDistinct()) }
singleWithBinds { ApplicationCachingHeadersConfigurator(getAllDistinct()) }
singleWithBinds { ApplicationSessionsConfigurator(getAllDistinct()) }
singleWithBinds { StatusPagesConfigurator(getAllDistinct()) }
singleWithBinds { ApplicationAuthenticationConfigurator(getAllDistinct()) }
singleWithBinds { WebSocketsConfigurator }
factory<ApplicationEngine> {
val config = get<Config>()
createKtorServer(
Netty,
config.host,
config.port
) {
getAllDistinct<KtorApplicationConfigurator>().also(::println).forEach {
it.apply { configure() }
}
if (config.debugMode) {
2022-05-18 17:32:37 +00:00
pluginOrNull(Routing) ?.print()
2021-11-24 07:52:27 +00:00
}
}
}
2022-03-11 14:37:40 +00:00
config.modules.forEach {
it.apply { load(configJsonElement) }
}
2021-11-24 07:52:27 +00:00
}
}