Class: JsonapiCompliable::Deserializer
- Inherits:
-
Object
- Object
- JsonapiCompliable::Deserializer
- Defined in:
- lib/jsonapi_compliable/deserializer.rb
Overview
Responsible for parsing incoming write payloads
Given a PUT payload like:
{
data: {
id: '1',
type: 'posts',
attributes: { title: 'My Title' },
relationships: {
author: {
data: {
id: '1',
type: 'authors'
}
}
}
},
included: [
{
id: '1'
type: 'authors',
attributes: { name: 'Joe Author' }
}
]
}
You can now easily deal with this payload:
deserializer.attributes
# => { id: '1', title: 'My Title' }
deserializer.
# => { type: 'posts', method: :update }
deserializer.relationships
# {
# author: {
# meta: { ... },
# attributes: { ... },
# relationships: { ... }
# }
# }
When creating objects, we accept a temp-id
so that the client
can track the object it just created. Expect this in meta
:
{ type: 'authors', method: :create, temp_id: 'abc123' }
Instance Method Summary collapse
-
#attributes ⇒ Hash
The raw :attributes hash +
id
. -
#attributes=(attrs) ⇒ Object
Override the attributes # @see #attributes.
-
#data ⇒ Hash
The raw :data value of the payload.
-
#id ⇒ String
The raw :id value of the payload.
-
#include_directive(memo = {}, relationship_node = nil) ⇒ Hash
Parses the
relationships
recursively and builds an all-hash include directive like. -
#initialize(payload, env) ⇒ Deserializer
constructor
A new instance of Deserializer.
-
#meta ⇒ Hash
'meta' information about this resource.
-
#relationships ⇒ Hash
The relationships hash.
Constructor Details
#initialize(payload, env) ⇒ Deserializer
Returns a new instance of Deserializer
50 51 52 53 54 |
# File 'lib/jsonapi_compliable/deserializer.rb', line 50 def initialize(payload, env) @payload = payload @payload = @payload[:_jsonapi] if @payload.has_key?(:_jsonapi) @env = env end |
Instance Method Details
#attributes ⇒ Hash
Returns the raw :attributes hash + id
67 68 69 70 71 |
# File 'lib/jsonapi_compliable/deserializer.rb', line 67 def attributes @attributes ||= raw_attributes.tap do |hash| hash[:id] = id if id end end |
#attributes=(attrs) ⇒ Object
Override the attributes # @see #attributes
75 76 77 |
# File 'lib/jsonapi_compliable/deserializer.rb', line 75 def attributes=(attrs) @attributes = attrs end |
#data ⇒ Hash
Returns the raw :data value of the payload
57 58 59 |
# File 'lib/jsonapi_compliable/deserializer.rb', line 57 def data @payload[:data] end |
#id ⇒ String
Returns the raw :id value of the payload
62 63 64 |
# File 'lib/jsonapi_compliable/deserializer.rb', line 62 def id data[:id] end |
#include_directive(memo = {}, relationship_node = nil) ⇒ Hash
Parses the relationships
recursively and builds an all-hash
include directive like
{ posts: { comments: {} } }
Relationships that have been marked for destruction will NOT be part of the include directive.
108 109 110 111 112 113 114 115 116 |
# File 'lib/jsonapi_compliable/deserializer.rb', line 108 def include_directive(memo = {}, relationship_node = nil) relationship_node ||= relationships relationship_node.each_pair do |name, relationship_payload| merge_include_directive(memo, name, relationship_payload) end memo end |
#meta ⇒ Hash
'meta' information about this resource. Includes:
type
: the jsonapi type method
:
create/update/destroy/disassociate. Based on the request env or the
method
within the relationships
hash
temp_id
: the temp-id
, if specified
86 87 88 89 90 91 92 |
# File 'lib/jsonapi_compliable/deserializer.rb', line 86 def { type: data[:type], temp_id: data[:temp-id'], method: method } end |
#relationships ⇒ Hash
Returns the relationships hash
95 96 97 |
# File 'lib/jsonapi_compliable/deserializer.rb', line 95 def relationships @relationships ||= process_relationships(raw_relationships) end |