Sha256: 61822d92418c977f0808910d4115882225afb3145ae4e1be8df5511d5a468741

Contents?: true

Size: 1.3 KB

Versions: 2

Compression:

Stored size: 1.3 KB

Contents

module JsonApiClient
  class IncludedData
    attr_reader :data

    def initialize(result_set, data)
      record_class = result_set.record_class
      grouped_data = data.group_by{|datum| datum["type"]}
      @data = grouped_data.inject({}) do |h, (type, records)|
        klass = Utils.compute_type(record_class, type.singularize.classify)
        h[type] = records.map do |datum|
          params = klass.parser.parameters_from_resource(datum)
          resource = klass.new(params)
          resource.result_set = result_set
          resource
        end.index_by(&:id)
        h
      end
    end

    def data_for(method_name, definition)
      # If data is defined, pull the record from the included data
      if data = definition["data"]
        if data.is_a?(Array)
          # has_many link
          data.map do |link_def|
            record_for(link_def)
          end
        else
          # has_one link
          record_for(data)
        end
      else
        # TODO: if "related" URI is defined, fetch the delated object and stuff it in data
        nil
      end
    end

    def has_link?(name)
      data.has_key?(name)
    end

    private

    # should return a resource record of some type for this linked document
    def record_for(link_def)
      data[link_def["type"]][link_def["id"]]
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
json_api_client-1.0.0.beta3 lib/json_api_client/included_data.rb
json_api_client-1.0.0.beta2 lib/json_api_client/included_data.rb