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 lu.foyer.clients.* import lu.foyer.contracts.* import zio.schema.codec.JsonCodec.ExplicitConfig 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) @@ cors(corsConfig) @@ Middleware.debug ++ SwaggerUI.routes("docs" / "openapi", openAPI) object App extends ZIOAppDefault: override val bootstrap = CodecConfig.configLayer( CodecConfig(explicitNulls = ExplicitConfig(encoding = false, decoding = false)) ) val app = for routes <- HttpServer.routes server <- Server.serve(routes).provide(Server.default) yield server override def run = app.provide( 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 )