ship_order v1

examples/order/temporal/order.flow · dandori doc

For an order in the warehouse's system, ask for the payment, have it shipped, and wait for word of the delivery. The warehouse's system keeps the order's state, which moves as rulec's rule order_state says. Written for Temporal: the warehouse's calls are activities dandori writes, and the notice is an activity you write; the carrier's system tells the workflow of the order about the delivery, by the order's id (an event); and an order the shop cancels on the way is cancelled at the warehouse too (on cancel). The loop over the reminders goes on in a new run when its history grows long

flow
repeat at most 3 timesreceivedon no_recipientpaid, shipped, delivered,cancelledafter 3 roundsreceivedon conflictcancelledshipped, deliveredpaidon conflicttruefalseon timeoutdeliveredshippedship_order v161 order ← get_order(…)GET https://warehouse.example.com/v1/orders/{id}observes · retry 3 times every 1 second on busybusy, timeout, failure → on failure!63 match order.state65 r = notify(…)a task you writeretry 2 times every 5 secondsno_recipient → line 66; timeout, failure → on failure!66 fail NoContactleaving order67 wait 1 day68 order ← get_order(…)GET https://warehouse.example.com/v1/orders/{id}observes · retry 3 times every 1 second on busybusy, timeout, failure → on failure!69 break70 match order.state72 order ← request_cancel(…)POST https://warehouse.example.com/v1/orders/{id}/cancellationssends cancelconflict → line 73; timeout, failure → on failure!74 fail NotPaid"No payment came in three days"75 fail Canceled"The order was canceled"76 fail AlreadyShipped"The order has shipped already"leaving order78 decision = urgency(…)rule urgency.ruletimeout, failure → on failure!79 order ← request_shipment(…)POST https://warehouse.example.com/v1/orders/{id}/shipmentssends shipconflict → line 80; timeout, failure → on failure!80 fail Canceled"The order was canceled before it shipped"81 match decision.urgent82 n = notify(…)a task you writeretry 2 times every 5 secondsno_recipient, timeout, failure → on failure!84 order ← delivered()eventobserves · timeout 7 daystimeout → line 85; failure → on failure!85 fail DeliveryLate"No word of the delivery in seven days"leaving order86 match order.state87 succeed carrier = decision.carrier88 fail DeliveryLate"Still shipped after word of the delivery"leaving order
on failure
90 on failure91 fail Stopped"Stopped on the way; the order stays in the war…leaving order
on cancel
received, paidon conflicton failureshippednone95 on cancel96 match order.state99 order ← request_cancel(…)POST https://warehouse.example.com/v1/orders/{id}/cancellationssends cancel100 fail ShippedAlready"The warehouse refused to cancel order {order.i…leaving order101 fail CancelFailed"Could not cancel order {order.id} at the wareh…leaving order102 fail ShippedAlready"Order {order.id} has shipped already"leaving orderends cancelled

Calls

LineCallCallsRetriesTimeoutWhen it failsCase after
61order ← get_order(…)GET https://warehouse.example.com/v1/orders/{id}, observes, idempotent3 times every 1 second (busy)—busy, timeout, failure → on failureorder: received, paid, shipped, delivered, cancelled
65r = notify(…)a task you write, key2 times every 5 seconds (failure, timeout)—no_recipient → line 66
timeout, failure → on failure
—
68order ← get_order(…)GET https://warehouse.example.com/v1/orders/{id}, observes, idempotent3 times every 1 second (busy)—busy, timeout, failure → on failureorder: received, paid, cancelled
72order ← request_cancel(…)POST https://warehouse.example.com/v1/orders/{id}/cancellations, sends cancel, key——conflict → line 73
timeout, failure → on failure
order: cancelled
78decision = urgency(…)rule urgency.rule2 times, after 1 second and 2 (failure)—timeout, failure → on failure—
79order ← request_shipment(…)POST https://warehouse.example.com/v1/orders/{id}/shipments, sends ship, key——conflict → line 80
timeout, failure → on failure
order: shipped
82n = notify(…)a task you write, key2 times every 5 seconds (failure, timeout)—no_recipient, timeout, failure → on failure—
84order ← delivered()event, observes—7 daystimeout → line 85
failure → on failure
order: shipped, delivered
99order ← request_cancel(…)POST https://warehouse.example.com/v1/orders/{id}/cancellations, sends cancel, key——conflict → line 100
timeout, failure → line 101
order: cancelled

Ends

LineEndorder
66fail NoContact leaving orderhanded over as it is: received, paid, cancelled
74fail NotPaid "No payment came in three days"cancelled
75fail Canceled "The order was canceled"cancelled
76fail AlreadyShipped "The order has shipped already" leaving orderhanded over as it is: shipped, delivered
80fail Canceled "The order was canceled before it shipped"cancelled
85fail DeliveryLate "No word of the delivery in seven days" leaving orderhanded over as it is: shipped, delivered
87succeed carrier = decision.carrierdelivered
88fail DeliveryLate "Still shipped after word of the delivery" leaving orderhanded over as it is: shipped, delivered
91fail Stopped "Stopped on the way; the order stays in the warehouse's system as it is" leaving orderhanded over as it is: not started, or received, paid, shipped, delivered, cancelled
100fail ShippedAlready "The warehouse refused to cancel order {order.id}; it may have shipped" leaving orderhanded over as it is: shipped, delivered, cancelled
101fail CancelFailed "Could not cancel order {order.id} at the warehouse" leaving orderhanded over as it is: received, paid, shipped, delivered, cancelled
102fail ShippedAlready "Order {order.id} has shipped already" leaving orderhanded over as it is: shipped, delivered
102on cancel runs to its end, and the workflow ends cancellednot started, or cancelled