Skip to content

Introduce ServiceResponse to replace success/error methods in BaseService

This is extracted from https://gitlab.com/gitlab-org/gitlab-ce/issues/56767#note_162465903 so we use something like this:

def execute
  if rand(2) == 0
    ServiceResponse.success
  else
    ServiceResponse.error('This is bad')
  end
end

def run
  status = execute

  if status.success?
    # ...
  else
    # ...
  end
end

class ServiceResponse < Struct.new(:status, :message, keyword_init: true)
  def self.success
    new(status: :success)
  end

  def self.error(message)
    new(status: :error, message: message)
  end

  def success?
    status == :success
  end

  def error?
    status == :error
  end
end

To replace:

def execute
  if rand(2) == 0
    success
  else
    error('This is bad')
  end
end

def run
  status = execute

  if status[:status] == :success
    # ...
  else
    # ...
  end
end

class BaseService
  private

  def error(message, http_status = nil)
    result = {
      message: message,
      status: :error
    }

    result[:http_status] = http_status if http_status
    result
  end

  def success(pass_back = {})
    pass_back[:status] = :success
    pass_back
  end
end