class Netfira::WebConnect::RackApp::Action::Version8::Commit

Public Instance Methods

call() click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit.rb, line 5
def call
  allow :put, Hash
  dispatch_event :before, :commit, shop
  dispatch_event :around, :commit, shop do
    commit_records input['records'] if input['records']
    commit_relations input['relations'] if input['relations']
    [completed(:records), completed(:relations)]
  end
  dispatch_event [:on, :after], :commit, shop, completed(:records), completed(:relations)
  {
      complete: complete,
      filesToSend: files_to_send
  }
end

Private Instance Methods

commit_records(records) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit/records.rb, line 7
def commit_records(records)
  records.each do |class_name, attribute_sets|
    klass = class_for_record_type(class_name)
    attribute_sets.each do |attributes|
      modify_record klass, attributes
    end
  end
end
commit_relations(relations) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit/relations.rb, line 7
def commit_relations(relations)
  relations.each do |class_name, relation_sets|
    klass = class_for_relation_type class_name.sub('&', 'To')
    relation_sets.each do |relation|
      relation_model = update_relation(klass, relation)
      complete_relation class_name, relation, relation_model
    end
  end
end
complete() click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit.rb, line 26
def complete
  @complete ||= {
      records: {},
      relations: {}
  }
end
complete_record(record) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit/records.rb, line 45
def complete_record(record)
  completed(:records) << record
  list = complete[:records][record.class.name.demodulize] ||= {}
  list[record.origin_id.to_s] = record.digest
end
complete_relation(class_name, relation, relation_model) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit/relations.rb, line 41
def complete_relation(class_name, relation, relation_model)
  completed(:relations) << relation_model if relation_model
  list = complete[:relations][class_name] ||= []
  list << relation
end
completed(type) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit.rb, line 33
def completed(type)
  (@completed ||= {})[type] ||= Netfira::WebConnect::HashOfModels.new
end
could_not_save!(record) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit/records.rb, line 63
def could_not_save!(record)
  message = "#{record.class.name.demodulize} record could not be saved"
  errors = record.errors.messages.map { |k, v| [k.to_s.camelize(:lower), v] }.to_h
  raise BadRequest.new message, errors: errors
end
delete_record(record) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit/records.rb, line 41
def delete_record(record)
  record.destroy! if record.persisted?
end
files_to_send() click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit.rb, line 22
def files_to_send
  @files_to_send ||= {}
end
find_record(klass, attributes) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit/records.rb, line 56
def find_record(klass, attributes)
  origin_key = klass.origin_key.to_s.camelize :lower
  origin_id = attributes[origin_key]
  raise BadRequest, "#{klass.name.demodulize} sent with no #{klass.origin_key}" unless origin_id
  klass.find_or_initialize_by_origin_id(shop, origin_id.to_s)
end
modify_record(klass, attributes) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit/records.rb, line 16
def modify_record(klass, attributes)
  record = find_record(klass, attributes)
  if attributes['@delete']
    delete_record record
  else
    update_record record, attributes
  end
  complete_record record
end
relate_records(origin_ids) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit/relations.rb, line 31
def relate_records(origin_ids)
  records = origin_ids.map{ |k, id| k.find_or_create_by_origin_id shop, id }
  records[0] << records[1]
end
request_file(klass, file_name) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit/records.rb, line 51
def request_file(klass, file_name)
  list = files_to_send[klass.name.demodulize] ||= []
  list << file_name unless list.include? file_name
end
unknown_attribute!(klass, key) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit/records.rb, line 69
def unknown_attribute!(klass, key)
  raise BadRequest, "#{klass.name.demodulize.pluralize} don't have #{key} fields"
end
unrelate_records(origin_ids) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit/relations.rb, line 36
def unrelate_records(origin_ids)
  records = origin_ids.map{ |k, id| k.find_by_origin_id shop, id }.reject(&:nil?)
  records[0].unrelate records[1] if records.size == 2
end
update_record(record, attributes) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit/records.rb, line 26
def update_record(record, attributes)
  klass = record.class
  origin_key = klass.origin_key.to_s
  attributes.each do |key, value|
    key = key.underscore
    next if key == origin_key
    if key == 'checksum' && klass < Model::Record::FileRecord && !attributes['remoteLocation']
      request_file klass, attributes['fileName'] if record.checksum != value
      next
    end
    record.write_with_type_casting(key.to_sym, value) or unknown_attribute! klass, key
  end
  record.save or could_not_save! record
end
update_relation(klass, relation) click to toggle source
# File lib/netfira/web_connect/rack_app/actions/version_8/commit/relations.rb, line 17
def update_relation(klass, relation)

  # Make a hash of models => IDs, e.g. {Product => '123', Image => 'file.jpg'}
  origin_ids = [relation['a'], relation['b']].each_with_index.map do |origin_id, index|
    [klass.related_classes[index], origin_id]
  end.to_h

  if relation['x']
    relate_records origin_ids
  else
    unrelate_records origin_ids
  end
end