Sha256: f1155f8366142274fd1cb6df66a65d1bf1bfe06121a253bd5baff568b6efd890

Contents?: true

Size: 1.75 KB

Versions: 3

Compression:

Stored size: 1.75 KB

Contents

module Aggro
  # Public: Mixin to turn a PORO into an Aggro saga.
  module Saga
    extend ActiveSupport::Concern

    include AttributeDSL
    include BindingDSL
    include EventDSL

    included do
      generate_id :causation_id
      generate_id :correlation_id
    end

    def bindings
      @runner.bindings
    end

    def default_filters
      { correlation_id: correlation_id }
    end

    def saga_id
      @saga_id ||= SecureRandom.uuid
    end

    def start
      fail 'Saga is not valid' unless valid?

      promise = SagaStatus.new(saga_id)

      message = Message::StartSaga.new Aggro.local_node.id, saga_id, to_details
      response = primary_node.client.post message

      if response.is_a? Message::OK
        promise
      else
        fail 'Saga could not be started'
      end
    end

    private

    def primary_node
      @primary_node ||= Locator.new(saga_id).primary_node
    end

    def to_details
      { name: model_name.name, args: serialized_attributes }
    end

    def reject(reason = nil)
      fail 'Runner not set' unless @runner

      @runner.reject reason
    end

    def resolve(value = nil)
      fail 'Runner not set' unless @runner

      @runner.resolve value
    end

    def transition(step_name, *args)
      fail 'Runner not set' unless @runner

      @runner.transition step_name, *args
    end

    class_methods do
      def handler_for_step(step_name)
        steps[step_name]
      end

      def handles_step?(step_name)
        steps.key? step_name
      end

      def initial(step_name = nil)
        step_name ? @initial = step_name : @initial
      end

      def step(step_name, &block)
        steps[step_name] = block
      end

      private

      def steps
        Aggro.step_handlers[name]
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
aggro-0.0.4 lib/aggro/saga.rb
aggro-0.0.3 lib/aggro/saga.rb
aggro-0.0.2 lib/aggro/saga.rb