lib/apisync/rails/model.rb in apisync-rails-0.0.3 vs lib/apisync/rails/model.rb in apisync-rails-0.0.4
- old
+ new
@@ -16,79 +16,111 @@
attr_reader :attributes
def initialize(model)
@model = model
@attributes = {}
+ @payload = {}
@should_sync = true
end
def sync_if(method_name)
@should_sync = @model.send(method_name.to_sym)
end
def attribute(attr_name, from: nil, value: nil)
@attributes.delete(attr_name)
- @attributes[attr_name] = attr_value(attr_name, from: from, value: value)
+ @attributes[attr_name] = { attr_name: attr_name, from: from, value: value }
end
def custom_attribute(attr_name, from: nil, value: nil, name: nil)
@attributes[:custom_attributes] ||= []
@attributes[:custom_attributes] << {
- name: localized_name(name),
- identifier: attr_name.to_s,
- value: attr_value(attr_name, from: from, value: value)
+ attr_name: attr_name,
+ from: from,
+ value: value,
+ name: name
}
end
def sync
if sync?
- set_reference_id
- validate!
- log_warnings
+ payload = generate_payload
+ payload = set_reference_id(payload)
+ validate!(payload)
+ log_warnings(payload)
if defined?(::Sidekiq)
Apisync::Rails::SyncModelJob::Sidekiq.perform_async(
@model.class.name,
@model.id,
- @attributes
+ payload
)
else
Apisync::Rails::Http.post(
- @attributes,
+ payload,
request_concurrency: :synchronous
)
end
end
end
- def validate!
+ def validate!(payload)
return unless sync?
REQUIRED_ATTRS.each do |attr, message|
- if @attributes[attr].blank?
- raise MissingAttribute, "Please specify #{attr}. #{message}"
+ if payload[attr].blank?
+ raise MissingAttribute, "Please specify '#{attr}'. #{message}"
end
end
end
- def log_warnings
+ def log_warnings(payload)
WARNING_ATTRS.each do |attr, message|
- if @attributes[attr].blank?
- ::Rails.logger.warn "Please specify #{attr}. #{message}"
+ if payload[attr].blank?
+ ::Rails.logger.warn "Please specify '#{attr}'. #{message}"
end
end
end
private
+ def generate_payload
+ @payload = {}
+ @attributes.each do |attr, properties|
+ if attr == :custom_attributes
+ custom_attrs = []
+ properties.each do |custom_attr|
+ from = custom_attr[:from]
+ value = custom_attr[:value]
+ attr_name = custom_attr[:attr_name]
+ name = custom_attr[:name]
+
+ custom_attrs << {
+ name: localized_name(name),
+ identifier: attr_name.to_s,
+ value: attr_value(attr_name, from: from, value: value)
+ }
+ end
+ @payload[:custom_attributes] = custom_attrs
+ else
+ from = properties[:from]
+ value = properties[:value]
+ @payload[attr] = attr_value(attr, from: from, value: value)
+ end
+ end
+
+ @payload
+ end
+
def sync?
@should_sync
end
- def set_reference_id
- if @attributes[:reference_id].blank? && @model.id.present?
- @attributes[:reference_id] = @model.id.to_s
+ def set_reference_id(payload)
+ if payload[:reference_id].blank? && @model.id.present?
+ payload[:reference_id] = @model.id.to_s
end
+ payload
end
def attr_value(attr_name, from:, value:)
if value.blank?
if from.present?