module SnFoil::Configuration::LazyJsonapiSerializer

Public Class Methods

belongs_to(relationship_name, options = {}, &block) click to toggle source
Calls superclass method
# File lib/sn_foil/configuration/lazy_jsonapi_serializer.rb, line 9
def belongs_to(relationship_name, options = {}, &block)
  block = belongs_to_optimized_block(relationship_name, options, &block)
  super(relationship_name, options, &block)
end
has_many(relationship_name, options = {}, &block) click to toggle source
Calls superclass method
# File lib/sn_foil/configuration/lazy_jsonapi_serializer.rb, line 18
def has_many(relationship_name, options = {}, &block) # rubocop:disable Naming/PredicateName reason: method override
  super(relationship_name, has_relation_optimized_options(relationship_name, options), &block)
end
has_one(relationship_name, options = {}, &block) click to toggle source
Calls superclass method
# File lib/sn_foil/configuration/lazy_jsonapi_serializer.rb, line 14
def has_one(relationship_name, options = {}, &block) # rubocop:disable Naming/PredicateName reason: method override
  super(relationship_name, has_relation_optimized_options(relationship_name, options), &block)
end

Private Class Methods

belongs_to_optimized_block(relationship_name, options = {}, &block) click to toggle source
# File lib/sn_foil/configuration/lazy_jsonapi_serializer.rb, line 46
def belongs_to_optimized_block(relationship_name, options = {}, &block)
  return block if options[:skip_optimization] == true || block

  proc do |record, params|
    if params && params[:include]
      lookup_full_object(record_for_belongs_to, relationship_name, options, params)
    else
      create_substitute_object_for_belongs_to(record, relationship_name, options)
    end
  end
end
create_if_proc_for_has_relation(if_proc, included_proc) click to toggle source
# File lib/sn_foil/configuration/lazy_jsonapi_serializer.rb, line 68
def create_if_proc_for_has_relation(if_proc, included_proc)
  if if_proc.present?
    proc do |record, params|
      FastJsonapi.call_proc(included_proc, record, params) && FastJsonapi.call_proc(if_proc, record, params)
    end
  else
    included_proc
  end
end
create_included_proc_for_has_relation(relationship_name) click to toggle source
# File lib/sn_foil/configuration/lazy_jsonapi_serializer.rb, line 58
def create_included_proc_for_has_relation(relationship_name)
  proc do |_record, params|
    if params && params[:include]
      parse_include(params).include?(relationship_name.to_s.dasherize)
    else
      false
    end
  end
end
create_substitute_object_for_belongs_to(record, relationship_name, options) click to toggle source
# File lib/sn_foil/configuration/lazy_jsonapi_serializer.rb, line 41
def create_substitute_object_for_belongs_to(record, relationship_name, options)
  relationship_id = options[:id_method_name] || "#{relationship_name}_id".to_sym
  OpenStruct.new(id: record.send(relationship_id))
end
has_relation_optimized_options(relationship_name, options) click to toggle source
# File lib/sn_foil/configuration/lazy_jsonapi_serializer.rb, line 78
def has_relation_optimized_options(relationship_name, options) # rubocop:disable Naming/PredicateName reason: method override
  return options if options[:skip_optimization] == true

  options[:if] = create_if_proc_for_has_relation(options[:if], create_included_proc_for_has_relation(relationship_name))
  options
end
lookup_full_object_for_belongs_to(record, relationship_name, options, params) click to toggle source
# File lib/sn_foil/configuration/lazy_jsonapi_serializer.rb, line 35
def lookup_full_object_for_belongs_to(record, relationship_name, options, params)
  return unless parse_include(params).include?(relationship_name.to_s.dasherize)

  record.send(options[:object_method_name] || relationship_name)
end
parse_include(params) click to toggle source

We need to parse the include block because FastJsonAPI does not allow access to the pre-parsed includes

# File lib/sn_foil/configuration/lazy_jsonapi_serializer.rb, line 25
def parse_include(params)
  return [] unless params[:include]

  if params[:include].is_a?(String)
    params[:include].split(',')
  else
    params[:include]
  end.map { |r| r.to_s.dasherize }.join(',')
end