package lu.foyer import zio.* import zio.http.* import zio.http.Header.AccessControlAllowOrigin import zio.http.Middleware.CorsConfig import zio.http.Middleware.cors import zio.http.codec.* import zio.http.codec.PathCodec.path import zio.http.endpoint.openapi.OpenAPIGen import zio.http.endpoint.openapi.SwaggerUI import zio.logging.ConsoleLoggerConfig import zio.logging.LogColor import zio.logging.LogFilter import zio.logging.LogFormat.* import zio.logging.consoleLogger import zio.schema.codec.JsonCodec.ExplicitConfig import lu.foyer.auth.AuthMiddleware.jwtAuthentication import lu.foyer.auth.JwtScalaTokenService import lu.foyer.clients.* import lu.foyer.contracts.* object HttpServer: val corsConfig = CorsConfig(_ => Some(AccessControlAllowOrigin.All)) def routes = for client <- ZIO.service[ClientController] contract <- ZIO.service[ContractController] openAPI = OpenAPIGen.fromEndpoints(client.endpoints ++ contract.endpoints) yield (client.routes ++ contract.routes) @@ jwtAuthentication("Insurance") @@ cors(corsConfig) @@ Middleware.debug ++ SwaggerUI.routes("docs" / "openapi", openAPI) object App extends ZIOAppDefault: private val logFormat = label("timestamp", timestamp.fixed(32)).color(LogColor.BLUE) |-| label("level", level.fixed(5)).highlight |-| label("thread", fiberId).color(LogColor.WHITE) |-| label("message", quoted(line)).highlight |-| cause val logFilter = LogFilter.LogLevelByNameConfig(LogLevel.Debug) override val bootstrap = Runtime.removeDefaultLoggers >>> consoleLogger(ConsoleLoggerConfig(logFormat, logFilter)) >>> CodecConfig.configLayer( CodecConfig(explicitNulls = ExplicitConfig(encoding = false, decoding = false)) ) val app = for routes <- HttpServer.routes server <- Server.serve(routes) yield server override def run = app.provide( Server.default, JwtScalaTokenService.live, CommandEngine.layer[ClientCommand, ClientEvent, ClientState], CommandEngine.layer[ContractCommand, ContractEvent, ContractState], ClientHandlers.layer, ContractHandlers.layer, ClientReducer.layer, ContractReducer.layer, ClientEventRepositoryInMemory.layer, ContractEventRepositoryInMemory.layer, ClientStateRepositoryInMemory.layer, ContractStateRepositoryInMemory.layer, ClientController.layer, ContractController.layer, PremiumServiceImpl.layer, EmployeeServiceImpl.layer ) end App