1const reserveStock = createStep(
2 { name: 'reserve-stock', maxRetries: 3 },
3 async (items, { container }) => {
4 const inventory = container.resolve('inventory')
5 const claim = await inventory.reserve(items)
6 return new StepResponse(claim, claim.id)
7 },
8 // rollback: release the claim
9 async (claimId, { container }) => {
10 await container
11 .resolve('inventory')
12 .release(claimId)
13 }
14)
15
16export const checkoutFlow = createWorkflow(
17 'checkout-flow',
18 (input: { cartId: string }) => {
✓19 const cart = loadCart({ id: input.cartId })
✓20 const claim = reserveStock(cart.items)
✓21 const charge = capturePayment({
22 amount: cart.total,
23 currency: cart.currency,
24 })
✓25 const order = persistOrder({ cart, charge })
26
27 when(cart, c => c.sameDay).then(() =>
28 dispatchCourier({ orderId: order.id })
29 )
30
31 return new WorkflowResponse({
32 order, claim, charge,
33 })
34 }
35)