class JSONAPI::Consumer::Parsers::Parser
Public Class Methods
parameters_from_resource(params)
click to toggle source
Given a resource hash, returns a Resource.new
friendly hash which flattens the attributes in w/ id and type.
Example:
Given:
{ id: 1. type: 'person', attributes: { first_name: 'Jeff', last_name: 'Ching' }, links: {...}, relationships: {...} }
Returns:
{ id: 1, type: 'person', first_name: 'Jeff', last_name: 'Ching' links: {...}, relationships: {...} }
# File lib/jsonapi/consumer/parsers/parser.rb, line 51 def parameters_from_resource(params) attrs = params.slice('id', 'links', 'meta', 'type', 'relationships') attrs.merge(params.fetch('attributes', {})) end
parse(klass, response)
click to toggle source
# File lib/jsonapi/consumer/parsers/parser.rb, line 5 def parse(klass, response) data = response.body.present? ? response.body : {} ResultSet.new.tap do |result_set| result_set.record_class = klass result_set.uri = response.env[:url] handle_json_api(result_set, data) handle_data(result_set, data) handle_errors(result_set, data) handle_meta(result_set, data) handle_links(result_set, data) handle_relationships(result_set, data) handle_pagination(result_set, data) handle_included(result_set, data) end end
Private Class Methods
choose_model_for(result_set, res)
click to toggle source
Accept mixed-content from an endpoint.
TODO: add ability to configure a model namespace
# File lib/jsonapi/consumer/parsers/parser.rb, line 80 def choose_model_for(result_set, res) return result_set.record_class unless res['type'] res_type_name = res['type'].underscore.classify (res_type_name.safe_constantize) ? res_type_name.safe_constantize : result_set.record_class end
handle_data(result_set, data)
click to toggle source
# File lib/jsonapi/consumer/parsers/parser.rb, line 62 def handle_data(result_set, data) # all data lives under the "data" attribute results = data.fetch("data", []) # we will treat everything as an Array results = [results] unless results.is_a?(Array) resources = results.compact.map do |res| record_class = choose_model_for(result_set, res) resource = record_class.load(parameters_from_resource(res)) resource.last_result_set = result_set resource end result_set.concat(resources) end
handle_errors(result_set, data)
click to toggle source
# File lib/jsonapi/consumer/parsers/parser.rb, line 87 def handle_errors(result_set, data) result_set.errors = ErrorCollector.new(data.fetch("errors", [])) end
handle_included(result_set, data)
click to toggle source
# File lib/jsonapi/consumer/parsers/parser.rb, line 107 def handle_included(result_set, data) result_set.included = IncludedData.new(result_set, data.fetch("included", [])) end
handle_json_api(result_set, data)
click to toggle source
# File lib/jsonapi/consumer/parsers/parser.rb, line 58 def handle_json_api(result_set, data) result_set.implementation = Implementation.new(data.fetch("jsonapi", {})) end
handle_links(result_set, data)
click to toggle source
# File lib/jsonapi/consumer/parsers/parser.rb, line 95 def handle_links(result_set, data) result_set.links = Linking::TopLevelLinks.new(result_set.record_class, data.fetch("links", {})) end
handle_meta(result_set, data)
click to toggle source
# File lib/jsonapi/consumer/parsers/parser.rb, line 91 def handle_meta(result_set, data) result_set.meta = MetaData.new(data.fetch("meta", {}), result_set.record_class) end
handle_pagination(result_set, data)
click to toggle source
# File lib/jsonapi/consumer/parsers/parser.rb, line 103 def handle_pagination(result_set, data) result_set.pages = result_set.record_class.paginator.new(result_set, data) end
handle_relationships(result_set, data)
click to toggle source
# File lib/jsonapi/consumer/parsers/parser.rb, line 99 def handle_relationships(result_set, data) result_set.relationships = Relationships::TopLevelRelations.new(result_set.record_class, data.fetch("relationships", {})) end