class PubSubModelSync::PayloadBuilder
Attributes
action[RW]
as_klass[RW]
data[RW]
headers[RW]
mapping[RW]
model[RW]
Public Class Methods
new(model, action, settings = {})
click to toggle source
@param model (ActiveRecord::Base,PubSubModelSync::PublisherConcern) @param action (@see PublishConcern::ps_publish) @param settings (@see PublishConcern::ps_publish): { data:, mapping:, headers:, as_klass
: }
# File lib/pub_sub_model_sync/payload_builder.rb, line 10 def initialize(model, action, settings = {}) @model = model @action = action @data = settings[:data] || {} @mapping = settings[:mapping] || [] @headers = settings[:headers] || {} @as_klass = settings[:as_klass] || model.class.name end
ordering_key_for(model)
click to toggle source
# File lib/pub_sub_model_sync/payload_builder.rb, line 26 def self.ordering_key_for(model) [model.class.name, model.id || SecureRandom.uuid].join('/') end
parse_mapping_for(model, mapping)
click to toggle source
@param model (ActiveRecord::Base) @param mapping (@see PublishConcern::ps_publish -> mapping) @return (Hash) Hash with the corresponding values for each attribute Sample: parse_mapping_for
(my_model, %w[id name:full_name])
==> { id: 10, full_name: 'model.name value' }
# File lib/pub_sub_model_sync/payload_builder.rb, line 35 def self.parse_mapping_for(model, mapping) mapping.map do |prop| source, target = prop.to_s.split(':') [target || source, model.send(source.to_sym)] end.to_h.symbolize_keys end
Public Instance Methods
call()
click to toggle source
@return (Payload
)
# File lib/pub_sub_model_sync/payload_builder.rb, line 20 def call values = compute_value(data) values = self.class.parse_mapping_for(model, mapping).merge(values) PubSubModelSync::Payload.new(values, settings_data, headers_data) end
Private Instance Methods
compute_value(value)
click to toggle source
# File lib/pub_sub_model_sync/payload_builder.rb, line 51 def compute_value(value) res = value res = model.send(value, action) if value.is_a?(Symbol) # method name res = value.call(model, action) if value.is_a?(Proc) res end
headers_data()
click to toggle source
# File lib/pub_sub_model_sync/payload_builder.rb, line 44 def headers_data klass_name = model.class.name key = [klass_name, action, model.id || SecureRandom.uuid].join('/') def_data = { ordering_key: self.class.ordering_key_for(model), key: key } def_data.merge(compute_value(headers)) end
settings_data()
click to toggle source
# File lib/pub_sub_model_sync/payload_builder.rb, line 58 def settings_data { klass: as_klass, action: action } end