class JSONAPI::Deserializable::Resource

Attributes

attr_blocks[RW]
default_attr_block[RW]
default_has_many_rel_block[RW]
default_has_one_rel_block[RW]
has_many_rel_blocks[RW]
has_one_rel_blocks[RW]
id_block[RW]
key_formatter[RW]
type_block[RW]
reverse_mapping[R]

Public Class Methods

call(payload) click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 34
def self.call(payload)
  new(payload).to_h
end
inherited(klass) click to toggle source
Calls superclass method
# File lib/jsonapi/deserializable/resource.rb, line 21
def self.inherited(klass)
  super
  klass.type_block          = type_block
  klass.id_block            = id_block
  klass.attr_blocks         = attr_blocks.dup
  klass.has_one_rel_blocks  = has_one_rel_blocks.dup
  klass.has_many_rel_blocks = has_many_rel_blocks.dup
  klass.default_attr_block  = default_attr_block
  klass.default_has_one_rel_block   = default_has_one_rel_block
  klass.default_has_many_rel_block  = default_has_many_rel_block
  klass.key_formatter = key_formatter
end
new(payload, root: '/data') click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 38
def initialize(payload, root: '/data')
  @data = payload || {}
  @root = root
  @type = @data['type']
  @id   = @data['id']
  @attributes    = @data['attributes'] || {}
  @relationships = @data['relationships'] || {}
  deserialize!

  freeze
end

Public Instance Methods

to_h()
Alias for: to_hash
to_hash() click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 50
def to_hash
  @hash
end
Also aliased as: to_h

Private Instance Methods

deserialize!() click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 65
def deserialize!
  @reverse_mapping = {}
  hashes = [deserialize_type, deserialize_id,
            deserialize_attrs, deserialize_rels]
  @hash = hashes.reduce({}, :merge)
end
deserialize_attr(key, val) click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 96
def deserialize_attr(key, val)
  block = self.class.attr_blocks[key] || self.class.default_attr_block
  return {} unless block

  hash = block.call(val, self.class.key_formatter.call(key))
  register_mappings(hash.keys, "/attributes/#{key}")
  hash
end
deserialize_attrs() click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 90
def deserialize_attrs
  @attributes
    .map { |key, val| deserialize_attr(key, val) }
    .reduce({}, :merge)
end
deserialize_has_many_rel(key, val) click to toggle source

rubocop: disable Metrics/AbcSize

# File lib/jsonapi/deserializable/resource.rb, line 134
def deserialize_has_many_rel(key, val)
  block = self.class.has_many_rel_blocks[key] ||
          self.class.default_has_many_rel_block
  return {} unless block && val['data'].is_a?(Array)

  ids   = val['data'].map { |ri| ri['id'] }
  types = val['data'].map { |ri| ri['type'] }
  hash = block.call(val, ids, types, self.class.key_formatter.call(key))
  register_mappings(hash.keys, "/relationships/#{key}")
  hash
end
deserialize_has_one_rel(key, val) click to toggle source

rubocop: disable Metrics/AbcSize

# File lib/jsonapi/deserializable/resource.rb, line 120
def deserialize_has_one_rel(key, val)
  block = self.class.has_one_rel_blocks[key] ||
          self.class.default_has_one_rel_block
  return {} unless block

  id   = val['data'] && val['data']['id']
  type = val['data'] && val['data']['type']
  hash = block.call(val, id, type, self.class.key_formatter.call(key))
  register_mappings(hash.keys, "/relationships/#{key}")
  hash
end
deserialize_id() click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 81
def deserialize_id
  block = self.class.id_block
  return {} unless @id && block

  hash = block.call(@id)
  register_mappings(hash.keys, '/id')
  hash
end
deserialize_rel(key, val) click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 111
def deserialize_rel(key, val)
  if val['data'].is_a?(Array)
    deserialize_has_many_rel(key, val)
  else
    deserialize_has_one_rel(key, val)
  end
end
deserialize_rels() click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 105
def deserialize_rels
  @relationships
    .map { |key, val| deserialize_rel(key, val) }
    .reduce({}, :merge)
end
deserialize_type() click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 72
def deserialize_type
  block = self.class.type_block
  return {} unless block

  hash = block.call(@type)
  register_mappings(hash.keys, '/type')
  hash
end
register_mappings(keys, path) click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 59
def register_mappings(keys, path)
  keys.each do |k|
    @reverse_mapping[k] = @root + path
  end
end