Trip Booking (Saga)
Book multiple services with automatic rollback on failure.
book_tripPending
trip_booking.ex
defmodule MyApp.TripBooking do
use Durable
use Durable.Helpers
workflow "book_trip" do
step :book_flight, [compensate: :cancel_flight], fn ctx ->
booking = Flights.book(ctx["flight"])
{:ok, assign(ctx, :flight, booking)}
end
step :book_hotel, [compensate: :cancel_hotel], fn ctx ->
booking = Hotels.book(ctx["hotel"])
{:ok, assign(ctx, :hotel, booking)}
end
step :charge, fn ctx ->
total = ctx.flight.price + ctx.hotel.price
Payments.charge(ctx["card"], total)
{:ok, assign(ctx, :charged, true)}
end
compensate :cancel_flight, fn ctx ->
Flights.cancel(ctx.flight.id)
{:ok, ctx}
end
compensate :cancel_hotel, fn ctx ->
Hotels.cancel(ctx.hotel.id)
{:ok, ctx}
end
end
endThe code is the README example. The run is simulated in your browser, with time sped up. For the details, read the compensations guide.