class PubSubModelSync::RunSubscriber

Attributes

model[RW]
payload[RW]
subscriber[RW]

Public Class Methods

new(subscriber, payload) click to toggle source

@param subscriber(Subscriber) @param payload(Payload)

# File lib/pub_sub_model_sync/run_subscriber.rb, line 11
def initialize(subscriber, payload)
  @subscriber = subscriber
  @payload = payload
end

Public Instance Methods

call() click to toggle source
# File lib/pub_sub_model_sync/run_subscriber.rb, line 16
def call
  klass_subscription? ? run_class_message : run_model_message
end

Private Instance Methods

call_action(object) click to toggle source
# File lib/pub_sub_model_sync/run_subscriber.rb, line 51
def call_action(object)
  callback = settings[:to_action]
  callback.is_a?(Proc) ? object.instance_exec(payload.data, &callback) : call_action_method(object)
end
call_action_method(object) click to toggle source
# File lib/pub_sub_model_sync/run_subscriber.rb, line 56
def call_action_method(object)
  method_name = settings[:to_action]
  method_name = :save! if %i[create update].include?(method_name.to_sym)
  method_name = :destroy! if method_name.to_sym == :destroy
  is_crud_action = %i[save! destroy!].include?(method_name)
  is_crud_action ? object.send(method_name) : object.send(method_name, payload.data)
end
ensure_sync(object) click to toggle source
# File lib/pub_sub_model_sync/run_subscriber.rb, line 43
def ensure_sync(object)
  res = true
  res = false if settings[:if] && !parse_condition(settings[:if], object)
  res = false if settings[:unless] && parse_condition(settings[:unless], object)
  log("Cancelled save sync by subscriber condition : #{[payload]}") if !res && debug?
  res
end
find_model() click to toggle source
# File lib/pub_sub_model_sync/run_subscriber.rb, line 74
def find_model
  model_class = subscriber.klass.constantize
  return model_class.ps_find_model(payload.data) if model_class.respond_to?(:ps_find_model)

  error_msg = 'No values provided for identifiers:'
  raise(StandardError, "#{error_msg} #{[settings[:id], payload]}") if model_identifiers.empty?

  model_class.where(model_identifiers).first_or_initialize
end
klass_subscription?() click to toggle source
# File lib/pub_sub_model_sync/run_subscriber.rb, line 22
def klass_subscription?
  subscriber.settings[:mode] == :klass
end
model_identifiers() click to toggle source

@return (Hash) hash including identifiers and its values

# File lib/pub_sub_model_sync/run_subscriber.rb, line 97
def model_identifiers
  @model_identifiers ||= parse_mapping(Array(settings[:id]))
end
parse_condition(condition, object) click to toggle source
# File lib/pub_sub_model_sync/run_subscriber.rb, line 64
def parse_condition(condition, object)
  proc_args = klass_subscription? ? [] : [object]
  case condition
  when Proc then condition.call(*proc_args)
  when Array then condition.all? { |method_name| object.send(method_name) }
  else # method name
    object.send(condition)
  end
end
parse_mapping(mappings) click to toggle source

@param mappings (Array<String,Symbol>) supports aliasing, sample: [“id”, “full_name:name”] @return (Hash) hash with the correct attr names and its values

# File lib/pub_sub_model_sync/run_subscriber.rb, line 86
def parse_mapping(mappings)
  mappings.map do |prop|
    source, target = prop.to_s.split(':')
    key = (target || source).to_sym
    next unless payload.data.key?(source.to_sym)

    [key, payload.data[source.to_sym]]
  end.compact.to_h.symbolize_keys
end
populate_model() click to toggle source
# File lib/pub_sub_model_sync/run_subscriber.rb, line 101
def populate_model
  values = parse_mapping(subscriber.mapping).except(model_identifiers.keys)
  values.each do |attr, value|
    model.send("#{attr}=", value)
  end
end
run_class_message() click to toggle source
# File lib/pub_sub_model_sync/run_subscriber.rb, line 26
def run_class_message
  model_class = subscriber.klass.constantize
  model_class.ps_processing_payload = payload # TODO: review for parallel notifications
  call_action(model_class) if ensure_sync(model_class)
end
run_model_message() click to toggle source

support for: create, update, destroy

# File lib/pub_sub_model_sync/run_subscriber.rb, line 33
def run_model_message
  @model = find_model
  model.ps_processing_payload = payload
  return unless ensure_sync(model)

  populate_model
  model.send(:ps_before_save_sync) if model.respond_to?(:ps_before_save_sync)
  call_action(model)
end