Event-Driven Workflow
Wait for external webhook events.
payment_flowPending
payment_flow.ex
defmodule MyApp.PaymentFlow do
use Durable
use Durable.Helpers
use Durable.Wait
workflow "payment_flow" do
step :create_invoice, fn ctx ->
invoice = Invoices.create(ctx["order_id"], ctx["amount"])
{:ok, %{order_id: ctx["order_id"], invoice_id: invoice.id}}
end
step :await_payment, fn ctx ->
{event, _payload} = wait_for_any(["payment.success", "payment.failed"],
timeout: days(7),
timeout_value: {"payment.expired", nil}
)
{:ok, assign(ctx, :result, event)}
end
branch on: fn ctx -> ctx.result end do
"payment.success" ->
step :fulfill, fn ctx ->
Orders.fulfill(ctx.order_id)
{:ok, assign(ctx, :status, :fulfilled)}
end
_ ->
step :cancel, fn ctx ->
Orders.cancel(ctx.order_id)
{:ok, assign(ctx, :status, :cancelled)}
end
end
end
end
# Webhook handler sends event
Durable.send_event(workflow_id, "payment.success", %{transaction_id: "txn_123"})The code is the README example. The run is simulated in your browser, with time sped up. For the details, read the waiting guide.