class JSONAPI::Record::Parser

Attributes

document[R]

Public Class Methods

new(document) click to toggle source

@param document [JSONAPI::Types::Info, JSONAPI::Types::Success, JSONAPI::Types::Failure]

# File lib/jsonapi/record/parser.rb, line 19
def initialize(document)
  @document = document
end
parse(document) click to toggle source

@param document [JSONAPI::Types::Info, JSONAPI::Types::Success, JSONAPI::Types::Failure] @return [Hash]

# File lib/jsonapi/record/parser.rb, line 12
def self.parse(document)
  new(document).send(:parse)
end

Private Instance Methods

included_resources() click to toggle source
# File lib/jsonapi/record/parser.rb, line 91
def included_resources
  (document.included || [])
end
parse() click to toggle source
# File lib/jsonapi/record/parser.rb, line 23
def parse
  case document
  when Types::Info then parse_info_document
  when Types::Success then parse_success_document
  when Types::Failure then parse_failure_document
  end
end
parse_failure_document() click to toggle source
# File lib/jsonapi/record/parser.rb, line 44
def parse_failure_document
  { response_errors: document.errors }
end
parse_info_document() click to toggle source
# File lib/jsonapi/record/parser.rb, line 31
def parse_info_document
  { top_level_meta: document.meta }
end
parse_relationship(relationship) click to toggle source
# File lib/jsonapi/record/parser.rb, line 71
def parse_relationship(relationship)
  case relationship.data
  when Array
    parse_relationship_to_many(relationship)
  when Types::ResourceIdentifier
    parse_relationship_to_one(relationship)
  end
end
parse_relationship_to_many(relationship) click to toggle source
# File lib/jsonapi/record/parser.rb, line 86
def parse_relationship_to_many(relationship)
  related_resources_for(relationship)
    .map { |resource| parse_resource(resource) }
end
parse_relationship_to_one(relationship) click to toggle source
# File lib/jsonapi/record/parser.rb, line 80
def parse_relationship_to_one(relationship)
  if (resource = related_resources_for(relationship).first) # rubocop:disable Style/GuardClause
    parse_resource(resource)
  end
end
parse_relationships(relationships) click to toggle source
# File lib/jsonapi/record/parser.rb, line 63
def parse_relationships(relationships)
  return {} if included_resources.empty? || relationships.nil?

  relationships.each_with_object({}) do |(name, relationship), hash|
    hash[name] = parse_relationship(relationship)
  end
end
parse_resource(resource) click to toggle source
# File lib/jsonapi/record/parser.rb, line 48
def parse_resource(resource)
  {
    top_level_meta: document.meta,
    top_level_links: document.links,
    **resource.attributes.slice(:id, :relationships, :links, :meta),
    **resource.resource_attributes,
    **parse_relationships(resource.relationships),
    persisted: true
  }.compact
end
parse_resource_collection(collection) click to toggle source
# File lib/jsonapi/record/parser.rb, line 59
def parse_resource_collection(collection)
  collection.map { |resource| parse_resource(resource) }
end
parse_success_document() click to toggle source
# File lib/jsonapi/record/parser.rb, line 35
def parse_success_document
  case document.data
  when Array then parse_resource_collection(document.data)
  when Types::Resource then parse_resource(document.data)
  when NilClass
    {}
  end
end