Class: FService::Base Abstract

Inherits:
Object
  • Object
show all
Defined in:
lib/f_service/base.rb

Overview

This class is abstract.

Abstract base class for services. It provides the basic interface to return and handle results.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.call(*params) ⇒ FService::Result::Success, FService::Result::Failure

Note:

this method shouldn’t be overridden in the subclasses

Initializes and runs a new service.

Examples:

User::UpdateName.(user: user, new_name: new_name)
# or
User::UpdateName.call(user: user, new_name: new_name)

Returns:

Raises:



22
23
24
25
26
27
# File 'lib/f_service/base.rb', line 22

def self.call(*params)
  result = new(*params).run
  raise(FService::Error, 'Services must return a Result') unless result.is_a? Result::Base

  result
end

Instance Method Details

#failure(data = nil) ⇒ FService::Result::Failure

Returns a failed operation. You’ll probably want to return this inside #run.

Examples:

class User::ValidateAge < FService::Base
  def initialize(age:)
    @age = age
  end

  def run
    return failure(status: 'No age given!', data: @age) if age.blank?
    return failure(status: 'Too young!', data: @age) if age < 18

    success(status: 'Valid age.', data: @age)
  end
end

Returns:



97
98
99
# File 'lib/f_service/base.rb', line 97

def failure(data = nil)
  FService::Result::Failure.new(data)
end

#result(condition, data = nil) ⇒ FService::Result::Success, FService::Result::Failure

Return either Success or Failure given the condition.

Examples:

class YearIsLeap < FService::Base
  def initialize(year:)
    @year = year
  end

  def run
    return failure(status: 'No year given!', data: @year) if @year.nil?

    result(leap?, @year)
  end

  private

  def leap?
    ((@year % 4).zero? && @year % 100 != 0) || (@year % 400).zero?
  end
end

Returns:



124
125
126
# File 'lib/f_service/base.rb', line 124

def result(condition, data = nil)
  condition ? success(data) : failure(data)
end

#runFService::Result::Success, FService::Result::Failure

Note:

this method SHOULD be overridden in the subclasses

This method is where the main work of your service must be. It is called after initilizing the service and should return an FService::Result.

Examples:

class User::UpdateName < FService::Base
  def initialize(user:, new_name:)
    @user = user
    @new_name = new_name
  end

  def run
    return failure('Missing user') if user.nil?

    if @user.update(name: @new_name)
      success(status: 'User successfully updated!', data: user)
    else
      failure(status: 'User could not be updated.', data: user.errors)
    end
  end
end

Returns:

Raises:

  • (NotImplementedError)


53
54
55
# File 'lib/f_service/base.rb', line 53

def run
  raise NotImplementedError, 'Services must implement #run'
end

#success(data = nil) ⇒ FService::Result::Success

Returns a successful operation. You’ll probably want to return this inside #run.

Examples:

class User::ValidateAge < FService::Base
  def initialize(age:)
    @age = age
  end

  def run
    return failure(status: 'No age given!', data: @age) if age.blank?
    return failure(status: 'Too young!', data: @age) if age < 18

    success(status: 'Valid age.', data: @age)
  end
end

Returns:



76
77
78
# File 'lib/f_service/base.rb', line 76

def success(data = nil)
  FService::Result::Success.new(data)
end