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