Sha256: 0d9c126fca59d46abbe44d4f9dae0da618b24a63f850e4c68f88c69869a443c6

Contents?: true

Size: 1.47 KB

Versions: 5

Compression:

Stored size: 1.47 KB

Contents

# frozen_string_literal: true

require_relative '../operation'
require_relative 'resource'

module LedgerSync
  module Domains
    class Operation
      class Transition < Resource
        class Contract < LedgerSync::Ledgers::Contract
          params do
            required(:model_name).filled(:string)
            required(:id).filled(:integer)
            required(:event).value(:string)
            required(:attrs).maybe(:hash)
            required(:attrs).maybe(:array)
          end
        end

        private

        def operate
          if resource.present?
            if resource.send(guard_method, params[:attrs]) &&
               resource.send(event_method, params[:attrs])
              success
            else
              failure('Unable to transition')
            end
          else
            failure('Not found')
          end
        end

        def guard_method
          "may_#{params[:event]}?"
        end

        def event_method
          "#{params[:event]}!"
        end

        def resource
          @resource ||= resource_class.find_by(id: params[:id])
        end

        def resource_class
          @resource_class ||= Object.const_get(params[:model_name])
        end

        def success
          super(resource)
        end

        def failure(message)
          super(
            LedgerSync::Error::OperationError.new(
              operation: self,
              message: message
            )
          )
        end
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
ledger_sync-domains-1.0.2 lib/ledger_sync/domains/operation/transition.rb
ledger_sync-domains-1.0.1 lib/ledger_sync/domains/operation/transition.rb
ledger_sync-domains-1.0.0 lib/ledger_sync/domains/operation/transition.rb
ledger_sync-domains-1.0.0.rc10 lib/ledger_sync/domains/operation/transition.rb
ledger_sync-domains-1.0.0.rc9 lib/ledger_sync/domains/operation/transition.rb