@@ -210,6 +210,52 @@ buildDispatchHandler _ handler requestContext body respond = do
210210 respond (errorResponse, responseJson)
211211
212212
213+ buildCommandResponseHandler ::
214+ forall cmd entity event entityName name .
215+ ( Command cmd ,
216+ name ~ NameOf cmd ,
217+ Record. KnownSymbol name ,
218+ Record. KnownHash name ,
219+ Entity entity ,
220+ Event event ,
221+ event ~ EventOf entity ,
222+ entity ~ EntityOf cmd ,
223+ entity ~ EntityOf event ,
224+ IsMultiTenant cmd ~ False ,
225+ StreamId. ToStreamId (EntityIdType entity ),
226+ Eq (EntityIdType entity ),
227+ Ord (EntityIdType entity ),
228+ Show (EntityIdType entity ),
229+ Show event ,
230+ Record. KnownSymbol entityName ,
231+ Json. FromJSON event ,
232+ Json. ToJSON event
233+ ) =>
234+ EventStore event ->
235+ Maybe (SnapshotCache entity ) ->
236+ RequestContext ->
237+ cmd ->
238+ Task Text Response. CommandResponse
239+ buildCommandResponseHandler eventStore maybeCache requestContext cmdInstance = do
240+ fetcher <- case maybeCache of
241+ Just cache ->
242+ EntityFetcher. newWithCache
243+ eventStore
244+ cache
245+ (initialStateImpl @ entity )
246+ (updateImpl @ entity )
247+ |> Task. mapError toText
248+ Nothing ->
249+ EntityFetcher. new
250+ eventStore
251+ (initialStateImpl @ entity )
252+ (updateImpl @ entity )
253+ |> Task. mapError toText
254+ let entityName = EntityName (getSymbolText (Record. Proxy @ entityName ))
255+ result <- CommandExecutor. execute eventStore fetcher entityName requestContext cmdInstance
256+ Task. yield (Response. fromExecutionResult result)
257+
258+
213259instance
214260 ( Command cmd ,
215261 Entity entity ,
@@ -260,48 +306,16 @@ instance
260306 createHandlers _ eventStore maybeCache transportsMap cmd = do
261307 -- Build the handler that will receive RequestContext at call time
262308 let handler :: RequestContext -> cmd -> Task Text Response. CommandResponse
263- handler requestContext cmdInstance = do
264- fetcher <- case maybeCache of
265- Just cache ->
266- EntityFetcher. newWithCache
267- eventStore
268- cache
269- (initialStateImpl @ entity )
270- (updateImpl @ entity )
271- |> Task. mapError toText
272- Nothing ->
273- EntityFetcher. new
274- eventStore
275- (initialStateImpl @ entity )
276- (updateImpl @ entity )
277- |> Task. mapError toText
278- let entityName = EntityName (getSymbolText (Record. Proxy @ (entityName )))
279- result <- CommandExecutor. execute eventStore fetcher entityName requestContext cmdInstance
280- Task. yield (Response. fromExecutionResult result)
309+ handler requestContext cmdInstance =
310+ buildCommandResponseHandler @ cmd @ entity @ event @ entityName eventStore maybeCache requestContext cmdInstance
281311
282312 buildHandlersForAll @ (PublicTransports transports ) transportsMap cmd handler
283313
284314
285315 createDispatchHandler _ eventStore maybeCache cmd = do
286316 let handler :: RequestContext -> cmd -> Task Text Response. CommandResponse
287- handler requestContext cmdInstance = do
288- fetcher <- case maybeCache of
289- Just cache ->
290- EntityFetcher. newWithCache
291- eventStore
292- cache
293- (initialStateImpl @ entity )
294- (updateImpl @ entity )
295- |> Task. mapError toText
296- Nothing ->
297- EntityFetcher. new
298- eventStore
299- (initialStateImpl @ entity )
300- (updateImpl @ entity )
301- |> Task. mapError toText
302- let entityName = EntityName (getSymbolText (Record. Proxy @ (entityName )))
303- result <- CommandExecutor. execute eventStore fetcher entityName requestContext cmdInstance
304- Task. yield (Response. fromExecutionResult result)
317+ handler requestContext cmdInstance =
318+ buildCommandResponseHandler @ cmd @ entity @ event @ entityName eventStore maybeCache requestContext cmdInstance
305319
306320 buildDispatchHandler @ cmd cmd handler
307321
@@ -565,15 +579,22 @@ buildEndpointsByTransport rawEventStore commandDefinitions transportsMap = do
565579 let newSchemas = schemasAcc |> Map. set transportNameText (existingSchemas |> Map. set cmdName endpointSchema)
566580 (newHandlers, newSchemas)
567581
568- let groupDispatch (cmdName, handler) dispatchAcc =
569- case dispatchAcc |> Map. get cmdName of
570- Just _ -> panic [fmt |Duplicate command handler registered for integration dispatch: #{cmdName}|]
571- Nothing -> dispatchAcc |> Map. set cmdName handler
582+ let groupDispatch (cmdName, handler) dispatchResult =
583+ case dispatchResult of
584+ Err err -> Err err
585+ Ok dispatchAcc ->
586+ case dispatchAcc |> Map. get cmdName of
587+ Just _ -> Err [fmt |Duplicate command handler registered for integration dispatch: #{cmdName}|]
588+ Nothing -> Ok (dispatchAcc |> Map. set cmdName handler)
572589
573590 let (handlersByTransport, schemasByTransport) =
574591 endpoints |> Array. reduce groupByTransport (Map. empty, Map. empty)
575592
576- let dispatchMap = dispatchHandlers |> Array. reduce groupDispatch Map. empty
593+ let dispatchMapResult = dispatchHandlers |> Array. reduce groupDispatch (Ok Map. empty)
594+
595+ dispatchMap <- case dispatchMapResult of
596+ Err err -> Task. throw err
597+ Ok mapValue -> Task. yield mapValue
577598
578599 Task. yield (handlersByTransport, schemasByTransport, dispatchMap)
579600
0 commit comments