class LukitaService::Base

Base class

Public Class Methods

done() click to toggle source

Run services in pipeline

Example:

>> LukitaService::Base.pipe(SimpleSumService, {a: 1, b: 2}).pipe(SimpleSumService, {a: 5, b: 1}).done
=> #<LukitaService::Result:0x00000002af4950 @valid=true, @result={:sum=>9}, @error=nil, @exception=nil>
# File lib/lukita_service/base.rb, line 68
def self.done
  final_outcome = @outcome
  @outcome = nil
  final_outcome
end
execute() click to toggle source
# File lib/lukita_service/base.rb, line 4
def self.execute; end
execute!() click to toggle source
# File lib/lukita_service/base.rb, line 5
def self.execute!; end
pipe(service, params = {}) click to toggle source

Run services in pipeline

Example:

>> LukitaService::Base.pipe(SimpleSumService, {a: 1, b: 2}).pipe(LogService).done
=> #<LukitaService::Result:0x00000002af4950 @valid=true, @result={:sum=>3}, @error=nil, @exception=nil>
# File lib/lukita_service/base.rb, line 49
def self.pipe(service, params = {})
  if @outcome != nil && @outcome.valid?
    prev_result = @outcome.result

    @outcome = service.run(params.merge(prev_result))
    @outcome.result ||= {}
    @outcome.result = prev_result.merge(@outcome.result)
  elsif @outcome == nil
    @outcome = service.run(params)
  end

  self
end
run(params = {}) click to toggle source

Run service with params

Example:

>> SumServiceExample.run(num1: 1, num2: 2)
=> #<LukitaService::Result:0x0000000368b110 @valid?=true, @result={:sum=>3}, @error=nil, @exception=nil>
# File lib/lukita_service/base.rb, line 12
def self.run(params = {})
  outcome = self.execute(params)
  outcome = self.fill_outcome(outcome)

  if outcome[:valid?]
    Result.new(valid?: outcome[:valid?], result: outcome[:result], error: nil)
  else
    Result.new(valid?: outcome[:valid?], result: outcome[:result], error: outcome[:error])
  end  
end
run!(params = {}) click to toggle source

Run service with params, rescue an exception if there is exception

Example:

>> SumServiceExample.run(num1: 1, num2: 2)
=> #<LukitaService::Result:0x0000000368b110 @valid?=true, @result={:sum=>3}, @error=nil, @exception=nil>
# File lib/lukita_service/base.rb, line 28
def self.run!(params = {})
  ActiveRecord::Base.transaction do
    outcome = self.execute(params)
  end
  outcome = self.fill_outcome(outcome)

  if outcome[:valid?]
    Result.new(valid?: outcome[:valid?], result: outcome[:result], error: nil, exception: nil)
  else
    Result.new(valid?: outcome[:valid?], result: outcome[:result], error: outcome[:error], exception: outcome[:exception])
  end

  rescue Exception => e 
    Result.new(valid?: outcome[:valid?], result: outcome[:result], error: e.message, exception: e)
end

Private Class Methods

fill_outcome(outcome) click to toggle source
# File lib/lukita_service/base.rb, line 76
def self.fill_outcome(outcome)
  if outcome != nil && outcome.class == Hash
    if outcome[:valid?].nil?
      outcome[:valid?] = true
    end 

    outcome[:result] ||= {}
  else
    prev_values = outcome
    if prev_values.nil?
      prev_values = {}
    end
    outcome = {valid?: true, result: prev_values}
  end

  outcome
end