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