Module: BetterService::Workflows

Defined in:
lib/better_service/workflows/base.rb,
lib/better_service/workflows/dsl.rb,
lib/better_service/workflows/branch.rb,
lib/better_service/workflows/execution.rb,
lib/better_service/workflows/branch_dsl.rb,
lib/better_service/workflows/branch_group.rb,
lib/better_service/workflows/result_builder.rb,
lib/better_service/workflows/rollback_support.rb,
lib/better_service/workflows/transaction_support.rb

Overview

Workflow - Base class for composing multiple services into a pipeline

Workflows allow you to chain multiple services together with explicit data mapping, conditional execution, rollback support, and lifecycle hooks.

Example:

class OrderPurchaseWorkflow < BetterService::Workflow
with_transaction true

before_workflow :validate_cart
after_workflow :clear_cart

step :create_order,
     with: Order::CreateService,
     input: ->(ctx) { { items: ctx.cart_items, total: ctx.total } }

step :charge_payment,
     with: Payment::ChargeService,
     input: ->(ctx) { { amount: ctx.order.total } },
     rollback: ->(ctx) { Payment::RefundService.new(ctx.user, params: { charge_id: ctx.charge.id }).call }

step :send_email,
     with: Email::ConfirmationService,
     input: ->(ctx) { { order_id: ctx.order.id } },
     optional: true,
     if: ->(ctx) { ctx.user.notifications_enabled? }

private

def validate_cart(context)
  context.fail!("Cart is empty") if context.cart_items.empty?
end

def clear_cart(context)
  context.user.clear_cart! if context.success?
end
end

# Usage:
result = OrderPurchaseWorkflow.new(current_user, params: { cart_items: [...] }).call
if result[:success]
order = result[:context].order
else
errors = result[:errors]
end

Defined Under Namespace

Modules: DSL, Execution, ResultBuilder, RollbackSupport, TransactionSupport Classes: Base, Branch, BranchDSL, BranchGroup