Class: JsonapiCompliable::Deserializer

Inherits:
Object
  • Object
show all
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.meta
# => { 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

Constructor Details

#initialize(payload, env) ⇒ Deserializer

Returns a new instance of Deserializer

Parameters:

  • payload (Hash)

    The incoming payload with symbolized keys

  • env (Hash)

    the Rack env (e.g. request.env).



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

#attributesHash

Returns the raw :attributes hash + id

Returns:

  • (Hash)

    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

#dataHash

Returns the raw :data value of the payload

Returns:

  • (Hash)

    the raw :data value of the payload



57
58
59
# File 'lib/jsonapi_compliable/deserializer.rb', line 57

def data
  @payload[:data]
end

#idString

Returns the raw :id value of the payload

Returns:

  • (String)

    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.

Returns:

  • (Hash)

    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

#metaHash

'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

Returns:

  • (Hash)


86
87
88
89
90
91
92
# File 'lib/jsonapi_compliable/deserializer.rb', line 86

def meta
  {
    type: data[:type],
    temp_id: data[:temp-id'],
    method: method
  }
end

#relationshipsHash

Returns the relationships hash

Returns:

  • (Hash)

    the relationships hash



95
96
97
# File 'lib/jsonapi_compliable/deserializer.rb', line 95

def relationships
  @relationships ||= process_relationships(raw_relationships)
end