class Apiphobic::JsonApi::Relationship

Attributes

data_class[RW]
name[RW]
raw_relationship[RW]

Public Class Methods

new(name:, data:, data_class: nil) click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 14
def initialize(name:, data:, data_class: nil)
  self.name             = name
  self.raw_relationship = data
  self.data_class       = data_class || data.class
end

Public Instance Methods

to_rails_attributes() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 20
def to_rails_attributes
  __send__("#{embedded}_#{type}_to_rails_attributes")
end

Private Instance Methods

data() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 117
def data
  raw_relationship[:data]
end
embedded() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 81
def embedded
  if referenced?
    'referenced'
  elsif embedded?
    'embedded'
  elsif !has_data?
    'empty'
  end
end
embedded?() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 107
def embedded?
  return false unless has_data?

  Array(data)[0][:attributes]
end
embedded_has_many_to_rails_attributes() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 38
def embedded_has_many_to_rails_attributes
  attribute = "#{name.pluralize}_attributes".to_sym

  has_many_attributes = data.map do |datum|
    relationship_attributes_to_rails_attributes(datum)
  end

  with_data_class(attribute, has_many_attributes)
end
embedded_has_one_to_rails_attributes() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 26
def embedded_has_one_to_rails_attributes
  attribute = "#{name.singularize}_attributes".to_sym

  with_data_class(attribute, relationship_attributes_to_rails_attributes(data))
end
empty_empty_to_rails_attributes() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 56
def empty_empty_to_rails_attributes
  attribute = name.to_sym

  with_data_class(attribute, nil)
end
empty_has_many_to_rails_attributes() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 62
def empty_has_many_to_rails_attributes
  attribute = "#{name.singularize}_ids".to_sym

  with_data_class(attribute, [])
end
has_data?() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 113
def has_data?
  @has_data ||= Array(data).compact.any?
end
has_many?() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 91
def has_many?
  data.is_a?(::Array)
end
has_one?() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 95
def has_one?
  data.is_a?(::Hash) || data.is_a?(::ActionController::Parameters)
rescue NameError
  false
end
referenced?() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 101
def referenced?
  return false unless has_data?

  !Array(data)[0][:attributes]
end
referenced_has_many_to_rails_attributes() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 48
def referenced_has_many_to_rails_attributes
  attribute = "#{name.singularize}_ids".to_sym

  has_many_attributes = data.map { |d| d[:id] }

  with_data_class(attribute, has_many_attributes)
end
referenced_has_one_to_rails_attributes() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 32
def referenced_has_one_to_rails_attributes
  attribute = "#{name.singularize}_id".to_sym

  with_data_class(attribute, data[:id])
end
relationship_attributes_to_rails_attributes(other) click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 68
def relationship_attributes_to_rails_attributes(other)
  other[:attributes].dup.tap do |attrs|
    attrs.delete(:__id__)
    attrs[:id] = other[:id] if other[:id]
  end
end
type() click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 75
def type
  return 'has_many' if     has_many?
  return 'has_one'  if     has_one?
  return 'empty'    unless has_data?
end
with_data_class(key, value) click to toggle source
# File lib/apiphobic/json_api/relationship.rb, line 121
def with_data_class(key, value)
  if data_class == ::Hash
    { key => value }
  elsif data_class == ::ActionController::Parameters
    ::ActionController::Parameters.new(key => value).tap(&:permit!)
  end
rescue NameError
  { key => value }
end