Sha256: 3eb1506c93aa54d3ad0056a78c74f010909d67fc3ae3a1b8f12e13c7243e772c

Contents?: true

Size: 1.64 KB

Versions: 1

Compression:

Stored size: 1.64 KB

Contents

require 'xing/services/locator'

module Xing
  module Builders
    class ListDifferenceBuilder
      include Services::Locator

      # list_data is is an array of JSON objects passed in by the mapper (the new list of records)
      # collection is the ActiveRecord collection of existing records (i.e. person.pets, rainbow.colors, book.chapters)
      def initialize(list_data, collection, mapper_class)
        @list_data = list_data
        @collection = collection
        @mapper_class = mapper_class

        @errors = Hash.new { |hash, key| hash[key] = {} }
      end

      attr_reader :errors

      def build
        sort_json_items
        map_items

        { save: @new_list, delete: @delete_ids }
      end

      def sort_json_items
        @existing_ids = @collection.map{|item| item.send(@mapper_class.locator_attribute_name)}

        @list_data = @list_data.map do |data|
          { :locator => set_locator(data), :incoming => data}
        end

        @delete_ids = @existing_ids - @list_data.map { |item| item[:locator] }
      end

      def set_locator(data)
        locator_for(data) unless (data[:links] || {})[:self].blank?
      end

      def locator_for(data)
       route_to(data[:links][:self])[:id].to_i
      end

      def map_items
        @new_list = []
        @list_data.each_with_index do |item, index|

          mapper = @mapper_class.new(item[:incoming], item[:locator])

          # Sets association, attributes
          @collection << mapper.record
          mapper.perform_mapping

          @new_list << mapper
          @errors[index] = mapper.errors[:data] unless mapper.errors[:data].blank?
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
xing-backend-0.0.16 lib/xing/builders/list_difference_builder.rb