class AbcJsonapi::IncludedResource

Attributes

includes[R]
includes_result[R]
resource[R]
serializer_namespace[R]

Public Class Methods

new(resource:, includes:, serializer_namespace:) click to toggle source
# File lib/abc_jsonapi/included_resource.rb, line 5
def initialize(resource:, includes:, serializer_namespace:)
  @includes_result = []
  @resource = resource
  @includes = includes
  @serializer_namespace = serializer_namespace
end

Public Instance Methods

get_included_records(resource, include_chain) click to toggle source
# File lib/abc_jsonapi/included_resource.rb, line 20
def get_included_records(resource, include_chain)
  return if resource.blank? || include_chain.empty?

  # Get first include name of include_chain and delete it from include_chain
  inc_resource_name = include_chain.shift

  # Check if include name is exist in relationships array. Take it or return nil
  resource_class_name = resource.is_a?(Enumerable) ? resource[0].class.name : resource.class.name
  relationship = serializer(resource_class_name).relationships.find { |h| h[:name] == inc_resource_name.to_sym }
  return if relationship.blank?

  # Get included resource
  if resource.is_a?(Enumerable)
    resource = resource.map{ |res| res.public_send(inc_resource_name) }.flatten.reject(&:blank?).uniq{ |item| item.id }
  else
    resource = resource.public_send(inc_resource_name)
  end
  return if resource.blank?
  
  @includes_result << serializer(inc_resource_name).new(resource).serializable_hash[:data]
  
  # If resource is a collection call get_included_records for each. Otherwise send whole resource
  if resource.is_a?(Enumerable)
    resource.each do |single_res|
      get_included_records(single_res, include_chain.dup)
    end
  else
    get_included_records(resource, include_chain)
  end
end
serializable_hash() click to toggle source
# File lib/abc_jsonapi/included_resource.rb, line 12
def serializable_hash
  includes.each do |include_path|
    include_chain = include_path.split('.')
    get_included_records(resource, include_chain.dup)
  end
  includes_result.flatten
end
serializer(included_resource_name) click to toggle source
# File lib/abc_jsonapi/included_resource.rb, line 51
def serializer(included_resource_name)
  (serializer_namespace + included_resource_name.to_s.classify + 'Serializer').constantize
end