package lu.foyer import lu.foyer.clients.* import lu.foyer.contracts.* import zio.* import zio.Console.* import zio.http.* import zio.http.codec.* import zio.http.codec.PathCodec.path import zio.http.endpoint.* import zio.http.endpoint.openapi.OpenAPIGen import zio.http.endpoint.openapi.SwaggerUI import zio.schema.* import zio.http.Middleware.cors import zio.http.Middleware.CorsConfig import zio.http.Header.AccessControlAllowOrigin import java.net.URI import java.time.LocalDate import java.util.UUID 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: 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 )