SimpleNotes/src/Dependencies.kt

101 lines
4.5 KiB
Kotlin

package be.vandewalleh
import be.vandewalleh.auth.AuthenticationModule
import be.vandewalleh.auth.SimpleJWT
import be.vandewalleh.controllers.api.ApiNoteController
import be.vandewalleh.controllers.api.ApiTagController
import be.vandewalleh.controllers.api.ApiUserController
import be.vandewalleh.controllers.web.BaseController
import be.vandewalleh.controllers.web.NoteController
import be.vandewalleh.controllers.web.UserController
import be.vandewalleh.extensions.ApplicationBuilder
import be.vandewalleh.extensions.RoutingBuilder
import be.vandewalleh.factories.*
import be.vandewalleh.features.*
import be.vandewalleh.markdown.Markdown
import be.vandewalleh.repositories.NoteRepository
import be.vandewalleh.repositories.UserRepository
import be.vandewalleh.routing.api.ApiDocRoutes
import be.vandewalleh.routing.api.ApiNoteRoutes
import be.vandewalleh.routing.api.ApiTagRoutes
import be.vandewalleh.routing.api.ApiUserRoutes
import be.vandewalleh.routing.web.BaseRoutes
import be.vandewalleh.routing.web.NoteRoutes
import be.vandewalleh.routing.web.StaticRoutes
import be.vandewalleh.routing.web.UserRoutes
import com.soywiz.korte.TemplateProvider
import com.soywiz.korte.Templates
import io.ktor.features.*
import org.kodein.di.*
import org.kodein.di.DI
import org.slf4j.LoggerFactory
val mainModule = DI.Module("main") {
bind() from singleton { NoteRepository(instance()) }
bind() from singleton { UserRepository(instance(), instance()) }
bind() from singleton { configurationFactory() }
bind() from setBinding<ApplicationBuilder>()
bind<ApplicationBuilder>().inSet() with singleton { ErrorHandler(instance()) }
bind<ApplicationBuilder>().inSet() with singleton { ContentNegotiationFeature() }
bind<ApplicationBuilder>().inSet() with singleton { CorsFeature(instance<Config>().server.cors) }
bind<ApplicationBuilder>().inSet() with singleton { AuthenticationModule(instance(tag = "auth")) }
bind<ApplicationBuilder>().inSet() with singleton { MigrationHook(instance()) }
bind<ApplicationBuilder>().inSet() with singleton { ShutdownDatabaseConnection(instance()) }
bind<ApplicationBuilder>().inSet() with singleton { SecurityReport() }
bind<ApplicationBuilder>().inSet() with singleton { CachingHeadersFeature() }
bind<ApplicationBuilder>().inSet() with singleton { CompressionFeature() }
bind<ApplicationBuilder>().inSet() with singleton { CallLoggingFeature() }
bind() from setBinding<RoutingBuilder>()
bind<RoutingBuilder>().inSet() with singleton { ApiDocRoutes() }
bind<RoutingBuilder>().inSet() with singleton { ApiNoteRoutes(instance()) }
bind<RoutingBuilder>().inSet() with singleton { ApiTagRoutes(instance()) }
bind<RoutingBuilder>().inSet() with singleton { ApiUserRoutes(instance()) }
// API
bind() from singleton { ApiNoteController(instance(), instance()) }
bind() from singleton { ApiTagController(instance()) }
bind() from singleton {
ApiUserController(
userRepository = instance(),
authJWT = instance(tag = "auth"),
refreshJWT = instance(tag = "refresh"),
passwordHash = instance()
)
}
// web
bind<RoutingBuilder>().inSet() with singleton { BaseRoutes(instance()) }
bind<RoutingBuilder>().inSet() with singleton { UserRoutes(instance()) }
bind<RoutingBuilder>().inSet() with singleton { NoteRoutes(instance()) }
bind<RoutingBuilder>().inSet() with singleton { StaticRoutes() }
bind() from singleton { NoteController(instance(), instance(), instance()) }
bind() from singleton { BaseController(instance()) }
bind() from singleton {
UserController(
userRepository = instance(),
authJWT = instance(tag = "auth"),
templates = instance(),
passwordHash = instance()
)
}
bind<TemplateProvider>() with singleton { ResourceTemplateProvider() }
bind<Templates>() with singleton { templatesFactory(instance()) }
bind<SimpleJWT>(tag = "auth") with singleton { simpleJwtFactory(instance<Config>().jwt.auth) }
bind<SimpleJWT>(tag = "refresh") with singleton { simpleJwtFactory(instance<Config>().jwt.refresh) }
bind() from singleton { LoggerFactory.getLogger("Application") }
bind() from singleton { dataSourceFactory(instance<Config>().database) }
bind() from singleton { databaseFactory(instance()) }
bind() from singleton { Migration(instance()) }
bind<PasswordHash>() with singleton { BcryptPasswordHash() }
bind() from singleton { Markdown() }
}