Implement contracts

This commit is contained in:
Paul-Henri Froidmont 2025-10-06 18:30:22 +02:00
parent 31014d1a0c
commit efdc50eb1d
Signed by: phfroidmont
GPG key ID: BE948AFD7E7873BE
33 changed files with 879 additions and 173 deletions

View file

@ -1,5 +1,6 @@
package lu.foyer
import lu.foyer.JsonApiResponse.One
import zio.*
import zio.Console.*
import zio.http.*
@ -11,34 +12,27 @@ import zio.schema.*
import java.net.URI
import java.time.LocalDate
import java.util.UUID
import lu.foyer.JsonApiResponse.One
trait CommandEngineController[Command: Schema, Event: Schema, State: Schema](
domain: String,
entityName: String)
trait CommandEngineController[Command: Schema, Event: Schema, State: Schema]
extends JsonApiController:
def commandEngine: CommandEngine[Command, Event, State]
val onthology = s"$domain:$entityName"
private val fetchMany =
private lazy val fetchMany =
Endpoint(Method.GET / entityName)
.query(HttpCodec.query[Page])
// .query(HttpCodec.query[Page])
.jsonApiMany[State]
private val fetchOne =
private lazy val fetchOne =
Endpoint(Method.GET / entityName / uuid("entityId"))
.jsonApiOne[State]
private val fetchEventsMany =
private lazy val fetchEventsMany =
Endpoint(Method.GET / entityName / uuid("entityId") / "events")
.query(HttpCodec.query[Page])
// .query(HttpCodec.query[Page])
.jsonApiMany[Event]
private val fetchEventsOne: Endpoint[(UUID, UUID), (UUID, UUID), JsonApiResponse.Error, One[
Event
], zio.http.endpoint.AuthType.None.type] =
private lazy val fetchEventsOne =
Endpoint(Method.GET / entityName / uuid("entityId") / "events" / uuid("eventId"))
.jsonApiOne[Event]
@ -51,7 +45,7 @@ trait CommandEngineController[Command: Schema, Event: Schema, State: Schema](
given Schema[Command] = handler.commandSchema.asInstanceOf[Schema[Command]]
val endpoint = Endpoint(Method.POST / entityName / "commands" / handler.name)
.in[Command]
.jsonApiOne[Event]
.jsonApiOneWithStatus[Event](Status.Created)
val route = endpoint.implementJsonApiOneEvent(command =>
for
entityId <- Random.nextUUID
@ -73,32 +67,36 @@ trait CommandEngineController[Command: Schema, Event: Schema, State: Schema](
)
(endpoint, route)
private val (commands, commandsRoutes) = generateCommands.unzip
private lazy val (commands, commandsRoutes) = generateCommands.unzip
private val fetchManyRoute =
fetchMany.implementJsonApiManyEntity(commandEngine.stateRepo.fetchMany)
private lazy val fetchManyRoute =
fetchMany.implementJsonApiManyEntity(_ =>
commandEngine.stateRepo.fetchMany(Page(None, None, totals = Some(true)))
)
private val fetchOneRoute =
private lazy val fetchOneRoute =
fetchOne.implementJsonApiOneEntity(commandEngine.stateRepo.fetchOne)
private val fetchEventsManyRoute =
fetchEventsMany.implementJsonApiManyEvent(commandEngine.eventRepo.fetchMany(_, _))
private lazy val fetchEventsManyRoute =
fetchEventsMany.implementJsonApiManyEvent(entityId =>
commandEngine.eventRepo.fetchMany(entityId, Page(None, None, totals = Some(true)))
)
private val fetchEventsOneRoute =
private lazy val fetchEventsOneRoute =
fetchEventsOne.implementJsonApiOneEvent(commandEngine.eventRepo.fetchOne(_, _))
val endpoints = List(
lazy val endpoints = List(
fetchMany,
fetchOne,
fetchEventsMany,
fetchEventsOne
) ++ commands
val routes = Routes(
lazy val routes = (Routes(
fetchManyRoute,
fetchOneRoute,
fetchEventsManyRoute,
fetchEventsOneRoute
) ++ Routes.fromIterable(commandsRoutes)
) ++ Routes.fromIterable(commandsRoutes)) @@ proxyHeadersAspect
end CommandEngineController