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.live[ClientCommand, ClientEvent, ClientState], CommandEngine.live[ContractCommand, ContractEvent, ContractState], ClientHandlers.live, ContractHandlers.live, ClientReducer.live, ContractReducer.live, ClientEventRepositoryInMemory.live, ContractEventRepositoryInMemory.live, ClientStateRepositoryInMemory.live, ContractStateRepositoryInMemory.live, ClientController.live, ContractController.live, PremiumServiceImpl.live, EmployeeServiceImpl.live ) end App