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