class NiftyServices::BaseService

Constants

CALLBACKS

Attributes

errors[R]
log[R]
logger[R]
options[R]
response_status[R]
response_status_code[R]

Public Class Methods

concern(concern_module) click to toggle source
# File lib/nifty_services/base_service.rb, line 28
def concern(concern_module)
  self.include(concern_module)
end
Also aliased as: include_concern
define_error_response_method(reason_string, status_code) click to toggle source
# File lib/nifty_services/base_service.rb, line 16
def define_error_response_method(reason_string, status_code)
  method_name = Util.normalized_callback_name(reason_string, '_error')

  define_method method_name do |message_key, options = {}|
    error(status_code, message_key, options)
  end

  define_method "#{method_name}!" do |message_key, options = {}|
    error!(status_code, message_key, options)
  end
end
include_concern(concern_module)
Alias for: concern
new(options = {}, initial_response_status = 400) click to toggle source
# File lib/nifty_services/base_service.rb, line 35
def initialize(options = {}, initial_response_status = 400)
  @options = with_default_options(options)
  @errors = []
  @logger = @options[:logger] || default_logger

  @executed = false

  with_before_and_after_callbacks(:initialize) do
    set_response_status(initial_response_status)
  end
end
register_callback(callback_name, method_name, &block) click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 34
def register_callback(callback_name, method_name, &block)
  method_name = Util.normalized_callback_name(method_name)

  @@registered_callbacks[self.name.to_sym][callback_name] ||= []
  @@registered_callbacks[self.name.to_sym][callback_name] << method_name

  register_callback_action(method_name, &block)
end
register_callback_action(callback_name, &block) click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 43
def register_callback_action(callback_name, &block)
  define_method(callback_name, &block)
end
register_error_response_method(reason_string, status_code) click to toggle source
# File lib/nifty_services/base_service.rb, line 11
def register_error_response_method(reason_string, status_code)
  NiftyServices::Configuration.add_response_error_method(reason_string, status_code)
  define_error_response_method(reason_string, status_code)
end

Public Instance Methods

add_error(error) click to toggle source
# File lib/nifty_services/base_service.rb, line 79
def add_error(error)
  add_method = error.is_a?(Array) ? :concat : :push
  @errors.send(add_method, error)
end
callback_called?(callback_name)
Alias for: callback_fired?
callback_fired?(callback_name) click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 59
def callback_fired?(callback_name)
  return (
          callback_fired_in?(@fired_callbacks, callback_name) ||
          callback_fired_in?(@custom_fired_callbacks, callback_name) ||
          callback_fired_in?(@custom_fired_callbacks, "#{callback_name}_callback")
         )
end
Also aliased as: callback_called?
default_logger() click to toggle source
# File lib/nifty_services/base_service.rb, line 84
def default_logger
  NiftyServices.config.logger
end
execute() click to toggle source
# File lib/nifty_services/base_service.rb, line 47
def execute
  not_implemented_exception(__method__)
end
executed?() click to toggle source
# File lib/nifty_services/base_service.rb, line 90
def executed?
  @executed == true
end
Also aliased as: runned?
fail?() click to toggle source
# File lib/nifty_services/base_service.rb, line 59
def fail?
  !success?
end
option_disabled?(key) click to toggle source
# File lib/nifty_services/base_service.rb, line 75
def option_disabled?(key)
  !option_enabled?(key)
end
option_enabled?(key) click to toggle source
# File lib/nifty_services/base_service.rb, line 71
def option_enabled?(key)
  option_exists?(key) && [true, 'true'].member?(@options[key.to_sym])
end
option_exists?(key) click to toggle source
# File lib/nifty_services/base_service.rb, line 67
def option_exists?(key)
  @options && @options.key?(key.to_sym)
end
register_callback(callback_name, method_name, &block) click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 69
def register_callback(callback_name, method_name, &block)
  method_name = normalized_callback_name(method_name).to_sym

  @registered_callbacks[callback_name.to_sym] << method_name
  register_callback_action(callback_name, &block)
end
register_callback_action(callback_name, &block) click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 76
def register_callback_action(callback_name, &block)
  cb_name = normalized_callback_name(callback_name).to_sym
  @callbacks_actions[cb_name.to_sym] = block
end
runned?()
Alias for: executed?
success?() click to toggle source
# File lib/nifty_services/base_service.rb, line 55
def success?
  @success == true && valid?
end
valid?() click to toggle source
# File lib/nifty_services/base_service.rb, line 51
def valid?
  return @errors.empty?
end

Protected Instance Methods

not_implemented_exception(method_name) click to toggle source
# File lib/nifty_services/base_service.rb, line 239
def not_implemented_exception(method_name)
  message = "##{method_name} method must be implemented in #{self.class} class"
  raise NotImplementedError, message
end
translate(key, options = {}) click to toggle source
# File lib/nifty_services/base_service.rb, line 244
def translate(key, options = {})
  begin
    I18n.t(key, options)
  rescue => error
    "Can't fecth key #{key} - #{error.message}"
  end
end

Private Instance Methods

call_callback(callback_name) click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 92
def call_callback(callback_name)
  callback_name = callback_name.to_s.underscore.to_sym

  if has_callback?(callback_name)
    @fired_callbacks[callback_name.to_sym] = true

    invoke_callback(method(callback_name))
    call_registered_callbacks_for(callback_name)
  end

  # allow chained methods
  self
end
call_registered_callbacks_for(callback_name) click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 124
def call_registered_callbacks_for(callback_name)
  instance_call_all_custom_registered_callbacks_for(callback_name)
  class_call_all_custom_registered_callbacks_for(callback_name)
end
callback_fired_in?(callback_list, callback_name) click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 161
def callback_fired_in?(callback_list, callback_name)
  return callback_list.key?(callback_name.to_sym)
end
callbacks_setup() click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 82
def callbacks_setup
  return nil if @callbacks_setup

  @fired_callbacks, @custom_fired_callbacks = {}, {}
  @callbacks_actions = {}
  @registered_callbacks = Hash.new {|k,v| k[v] = [] }

  @callbacks_setup = true
end
can_execute?() click to toggle source
# File lib/nifty_services/base_service.rb, line 105
def can_execute?
  not_implemented_exception(__method__)
end
changes(old, current, attributes = {}) click to toggle source
# File lib/nifty_services/base_service.rb, line 192
def changes(old, current, attributes = {})
  changes = []

  return changes if old.nil? || current.nil?

  old_attributes = old.attributes.slice(*attributes.map(&:to_s))
  new_attributes = current.attributes.slice(*attributes.map(&:to_s))

  new_attributes.each do |attribute, value|
    changes << attribute if (old_attributes[attribute] != value)
  end

  changes.map(&:to_sym)
end
class_call_all_custom_registered_callbacks_for(callback_name) click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 142
def class_call_all_custom_registered_callbacks_for(callback_name)
  classes_chain = self.class.ancestors.map(&:to_s).grep /\ANiftyServices/
  klasses = @@registered_callbacks.keys.map(&:to_s) & classes_chain

  klasses.each do |klass|
    class_call_all_custom_registered_callbacks_for_class(klass, callback_name)
  end
end
class_call_all_custom_registered_callbacks_for_class(class_name, callback_name) click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 151
def class_call_all_custom_registered_callbacks_for_class(class_name, callback_name)
  class_callbacks = @@registered_callbacks[class_name.to_sym]
  callbacks = class_callbacks[callback_name.to_sym] || []

  callbacks.each do |cb|
    @custom_fired_callbacks[cb.to_sym] = true
    invoke_callback(method(cb))
  end
end
default_options() click to toggle source
# File lib/nifty_services/base_service.rb, line 101
def default_options
  {}
end
error(status, message_key, options = {}) click to toggle source
# File lib/nifty_services/base_service.rb, line 162
def error(status, message_key, options = {})
  @success = false

  with_before_and_after_callbacks(:error) do
    set_response_status(status)

    error_message = process_error_message_for_key(message_key, options)
    add_error(error_message)

    error_message
  end
end
error!(status, message_key, options = {}) click to toggle source
# File lib/nifty_services/base_service.rb, line 175
def error!(status, message_key, options = {})
  error(status, message_key, options)

  # TODO:
  # maybe throw a Exception making bang(!) semantic
  # raise "NiftyServices::V1::Exceptions::#{status.titleize}".constantize
  return false
end
execute_action() { |block| ... } click to toggle source
# File lib/nifty_services/base_service.rb, line 109
def execute_action(&block)
  return nil if executed?

  with_before_and_after_callbacks(:execute) do
    if can_execute?
      yield(block) if block_given?
    end
  end

  @executed = true
end
filter_hash(hash = {}, whitelist_keys = []) click to toggle source
# File lib/nifty_services/base_service.rb, line 188
def filter_hash(hash = {}, whitelist_keys = [])
  hash.symbolize_keys.slice(*whitelist_keys.map(&:to_sym))
end
has_callback?(callback_name) click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 106
def has_callback?(callback_name)
  _callback_name = normalized_callback_name(callback_name).to_sym
   # include private methods
  respond_to?(callback_name, true) || respond_to?(_callback_name, true)
end
i18n_errors_namespace() click to toggle source
# File lib/nifty_services/base_service.rb, line 211
def i18n_errors_namespace
  "#{i18n_namespace}.errors"
end
i18n_namespace() click to toggle source
# File lib/nifty_services/base_service.rb, line 207
def i18n_namespace
  NiftyServices.configuration.i18n_namespace
end
instance_call_all_custom_registered_callbacks_for(callback_name) click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 129
def instance_call_all_custom_registered_callbacks_for(callback_name)
  @fired_callbacks[callback_name] = true

  callbacks = @registered_callbacks[callback_name.to_sym]

  callbacks.each do |cb|
    if callback = @callbacks_actions[cb.to_sym]
      @custom_fired_callbacks[cb.to_sym] = true
      invoke_callback(callback)
    end
  end
end
invoke_callback(method) click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 169
def invoke_callback(method)
  method.call
end
normalized_callback_name(callback_name, prefix = '_callback') click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 165
def normalized_callback_name(callback_name, prefix = '_callback')
  Util.normalized_callback_name(callback_name, prefix)
end
process_error_message_for_key(message_object, options) click to toggle source
# File lib/nifty_services/base_service.rb, line 215
def process_error_message_for_key(message_object, options)
  if message_object.respond_to?(:messages)
    message = message_object.messages
  elsif message_object.respond_to?(:message)
    message = message_object.message
  elsif message_object.is_a?(Array) && message_object.first.is_a?(Hash)
    message = message_object
  elsif message_object.is_a?(String)
    # if message_object is a string, use it as key to I18n or use pure string content
    message = options[:translate].nil? || options[:translate] == true ?
                translate("#{i18n_errors_namespace}.#{message_object}", options) :
                message_object
  else
    message = message_object
  end

  message
end
response_status_code_for(status) click to toggle source
# File lib/nifty_services/base_service.rb, line 154
def response_status_code_for(status)
  response_status_for(status).values.first
end
response_status_for(status) click to toggle source
# File lib/nifty_services/base_service.rb, line 141
def response_status_for(status)
  error_list = Configuration::ERROR_RESPONSE_STATUS
  success_list = Configuration::SUCCESS_RESPONSE_STATUS

  select_method = [Symbol, String].member?(status.class) ? :key : :value

  response_list = error_list.merge(success_list)

  response_list.select do |status_key, status_code|
    status == (select_method == :key ? status_key : status_code)
  end
end
response_status_reason_for(status) click to toggle source
# File lib/nifty_services/base_service.rb, line 158
def response_status_reason_for(status)
  response_status_for(status).keys.first
end
set_response_status(status) click to toggle source
# File lib/nifty_services/base_service.rb, line 136
def set_response_status(status)
  @response_status = response_status_reason_for(status)
  @response_status_code = response_status_code_for(status)
end
success_created_response() click to toggle source
# File lib/nifty_services/base_service.rb, line 132
def success_created_response
  success_response(:created)
end
success_response(status = :ok) click to toggle source
# File lib/nifty_services/base_service.rb, line 121
def success_response(status = :ok)
  unless Configuration::SUCCESS_RESPONSE_STATUS.key?(status.to_sym)
    raise "#{status} is not a valid success response status"
  end

  with_before_and_after_callbacks(:success) do
    @success = true
    set_response_status(status)
  end
end
valid_object?(record, expected_class) click to toggle source
# File lib/nifty_services/base_service.rb, line 184
def valid_object?(record, expected_class)
  record.class.to_s == expected_class.to_s
end
with_before_and_after_callbacks(callback_basename) { |block| ... } click to toggle source
# File lib/nifty_services/extensions/callbacks.rb, line 112
def with_before_and_after_callbacks(callback_basename, &block)
  callbacks_setup

  call_callback(:"before_#{callback_basename}")

  block_response = yield(block) if block_given?

  call_callback(:"after_#{callback_basename}")

  block_response
end
with_default_options(options) click to toggle source
# File lib/nifty_services/base_service.rb, line 97
def with_default_options(options)
  default_options.merge(options).symbolize_keys
end