class ServicePattern::Service

Public Class Methods

call(*args, &blk) click to toggle source
# File lib/service_pattern/service.rb, line 12
def self.call(*args, &blk)
  execute(*args, &blk)
end
chain(*args, &blk) click to toggle source

The same as execute but doesn't catch FailedError so they are passed on to the parent service call

# File lib/service_pattern/service.rb, line 3
def self.chain(*args, &blk)
  service = new(*args, &blk)

  can_execute_response = service.can_execute?
  ServicePattern::Service.fail!(can_execute_response.errors) unless can_execute_response.success?

  service.perform
end
convert_errors(errors) click to toggle source
# File lib/service_pattern/service.rb, line 24
def self.convert_errors(errors)
  errors = [errors] unless errors.is_a?(Array)
  errors.map do |error|
    error = ServicePattern::FailError.new(message: error) unless error.is_a?(ServicePattern::FailError)
    error
  end
end
execute(*args, &blk) click to toggle source
# File lib/service_pattern/service.rb, line 16
def self.execute(*args, &blk)
  new(*args, &blk).execute
end
execute!(*args, &blk) click to toggle source
# File lib/service_pattern/service.rb, line 20
def self.execute!(*args, &blk)
  new(*args, &blk).execute!
end
fail!(errors) click to toggle source
# File lib/service_pattern/service.rb, line 32
def self.fail!(errors)
  errors = convert_errors(errors)
  error_messages = errors.map(&:message)

  error = ServicePattern::FailedError.new(error_messages.join(". "))
  error.errors = errors

  raise error
end

Public Instance Methods

can_execute?() click to toggle source
# File lib/service_pattern/service.rb, line 42
def can_execute?
  succeed!
end
execute() click to toggle source
# File lib/service_pattern/service.rb, line 46
def execute
  can_execute_response = can_execute?
  return can_execute_response unless can_execute_response.success?

  perform
rescue ServicePattern::FailedError => e
  ServicePattern::Response.new(errors: e.errors)
end
execute!() click to toggle source
# File lib/service_pattern/service.rb, line 55
def execute!
  can_execute_response = can_execute?
  ServicePattern::Service.fail!(can_execute_response.errors) unless can_execute_response.success?
  response = perform
  ServicePattern::Service.fail!(response.errors) unless response.success?
  response.result
end
fail!(errors, type: nil) click to toggle source
# File lib/service_pattern/service.rb, line 67
def fail!(errors, type: nil)
  errors = [ServicePattern::FailError.new(message: errors, type: type)] if type

  ServicePattern::Service.fail!(errors)
end
perform(*_args) click to toggle source
# File lib/service_pattern/service.rb, line 63
def perform(*_args)
  raise NoMethodError, "You should implement the `perform` method on your service"
end
succeed!(result = nil) click to toggle source
# File lib/service_pattern/service.rb, line 73
def succeed!(result = nil)
  ServicePattern::Response.new(result: result)
end