package be.simplenotes.app.modules import be.simplenotes.app.Server import be.simplenotes.app.filters.AuthFilter import be.simplenotes.app.filters.AuthType import be.simplenotes.app.filters.ErrorFilter import be.simplenotes.app.filters.TransactionFilter import be.simplenotes.app.routes.Router import be.simplenotes.app.utils.StaticFileResolver import be.simplenotes.app.utils.StaticFileResolverImpl import be.simplenotes.app.views.ErrorView import be.simplenotes.shared.config.ServerConfig import org.eclipse.jetty.server.ServerConnector import org.http4k.core.Filter import org.http4k.core.RequestContexts import org.http4k.routing.RoutingHttpHandler import org.http4k.server.ConnectorBuilder import org.http4k.server.Jetty import org.http4k.server.asServer import org.koin.core.qualifier.named import org.koin.core.qualifier.qualifier import org.koin.dsl.module import org.koin.dsl.onClose import org.http4k.server.ServerConfig as Http4kServerConfig val serverModule = module { single(createdAtStart = true) { Server(get(), get()).start() } onClose { it?.stop() } single { get().asServer(get()) } single { val config = get() val builder: ConnectorBuilder = { server: org.eclipse.jetty.server.Server -> ServerConnector(server).apply { port = config.port host = config.host } } Jetty(config.port, builder) } single { StaticFileResolverImpl(get()) } single { Router( get(), get(), get(), get(), get(), get(), get(), requiredAuth = get(AuthType.Required.qualifier), optionalAuth = get(AuthType.Optional.qualifier), apiAuth = get(named("apiAuthFilter")), get(), get(), get(), )() } single { RequestContexts() } single(AuthType.Optional.qualifier) { AuthFilter(get(), AuthType.Optional, get()) } single(AuthType.Required.qualifier) { AuthFilter(get(), AuthType.Required, get()) } single { ErrorFilter(get()) } single { TransactionFilter(get()) } single { ErrorView(get()) } }