class JSONApi::Deserializer

Constants

VERSION

Public Class Methods

new(response) click to toggle source
# File lib/jsonapi_deserializer.rb, line 62
def initialize(response)
  @response = response.is_a?(Hash) ? response.with_indifferent_access : response
  @store = Store.new

  all_data = ([] << @response[:data] << @response[:included]).flatten.compact
  store_records(all_data)
  build_associations(all_data)
end

Public Instance Methods

deserialized_hash() click to toggle source
# File lib/jsonapi_deserializer.rb, line 71
def deserialized_hash
  data = @response[:data]
  if data.is_a? Array
    data.map { |datum| @store.get(datum[:type], datum[:id], datum[:lid]) }
  else
    @store.get(data[:type], data[:id], data[:lid])
  end
end

Private Instance Methods

build_associations(data) click to toggle source
# File lib/jsonapi_deserializer.rb, line 94
def build_associations(data)
  data.each do |datum|
    record = @store.get(datum[:type], datum[:id], datum[:lid])

    relationships = datum[:relationships] || {}
    relationships.each do |relationship_name, relationship|
      if relationship[:data].is_a? Array
        record[relationship_name] = relationship[:data].map { |assoc| find_association(assoc) }
      else
        record[relationship_name] = find_association(relationship[:data])
      end
    end
  end
end
find_association(association) click to toggle source
# File lib/jsonapi_deserializer.rb, line 89
def find_association(association)
  return nil unless association
  @store.get(association[:type], association[:id], association[:lid]) || Assocation.new(association)
end
store_records(data) click to toggle source
# File lib/jsonapi_deserializer.rb, line 82
def store_records(data)
  data.each do |datum|
    record = Record.new(id: datum[:id], lid: datum[:lid]).merge(datum[:attributes] || {})
    @store.set(datum[:type], datum[:id], datum[:lid], record)
  end
end