jsonapi-deserializable/lib/jsonapi/deserializable/relationship.rb
2016-11-20 03:31:16 +01:00

64 lines
1.4 KiB
Ruby

require 'jsonapi/deserializable/relationship_dsl'
module JSONAPI
module Deserializable
class Relationship
include RelationshipDSL
class << self
attr_accessor :has_one_block, :has_many_block
end
def self.inherited(klass)
klass.has_one_block = has_one_block
klass.has_many_block = has_many_block
end
def self.call(payload)
new(payload).to_h
end
def initialize(payload)
@document = payload
@data = payload['data']
deserialize!
end
def to_hash
@hash
end
alias to_h to_hash
private
def deserialize!
@hash = {}
return unless @document.key?('data')
if @data.is_a?(Array)
deserialize_has_many!
elsif @data.nil? || @data.is_a?(Hash)
deserialize_has_one!
end
end
def deserialize_has_one!
return unless self.class.has_one_block
id = @data && @data['id']
type = @data && @data['type']
instance_exec(@document, id, type, &self.class.has_one_block)
end
def deserialize_has_many!
return unless self.class.has_many_block
ids = @data.map { |ri| ri['id'] }
types = @data.map { |ri| ri['type'] }
instance_exec(@document, ids, types, &self.class.has_many_block)
end
def field(hash)
@hash.merge!(hash)
end
end
end
end