class Graphiti::Serializer

Public Class Methods

inherited(klass) click to toggle source
Calls superclass method
# File lib/graphiti/serializer.rb, line 21
def self.inherited(klass)
  super
  klass.class_eval do
    extend JSONAPI::Serializable::Resource::ConditionalFields

    # See #requested_relationships
    def self.relationship(name, options = {}, &block)
      prev = Util::Hash.deep_dup(field_condition_blocks)
      super
      self.field_condition_blocks = prev
      _register_condition(relationship_condition_blocks, name, options)
    end

    # NB - avoid clobbering includes when sparse fieldset
    # https://github.com/jsonapi-rb/jsonapi-serializable/pull/102
    #
    # We also override this method to ensure attributes and relationships
    # have separate condition blocks. This way an attribute and
    # relationship can have the same name, and the attribute can be
    # conditional without affecting the relationship.
    def requested_relationships(fields)
      @_relationships.select do |k, _|
        _conditionally_included?(self.class.relationship_condition_blocks, k)
      end
    end
  end
end
relationship(name, options = {}, &block) click to toggle source

See requested_relationships

Calls superclass method
# File lib/graphiti/serializer.rb, line 27
def self.relationship(name, options = {}, &block)
  prev = Util::Hash.deep_dup(field_condition_blocks)
  super
  self.field_condition_blocks = prev
  _register_condition(relationship_condition_blocks, name, options)
end

Public Instance Methods

as_jsonapi(kwargs = {}) click to toggle source
Calls superclass method
# File lib/graphiti/serializer.rb, line 66
def as_jsonapi(kwargs = {})
  super(**kwargs).tap do |hash|
    strip_relationships!(hash) if strip_relationships?
    add_links!(hash)
  end
end
cursor() click to toggle source
# File lib/graphiti/serializer.rb, line 49
def cursor
  starting_offset = 0
  page_param = @proxy.query.pagination
  if (page_number = page_param[:number])
    page_size = page_param[:size] || @resource.default_page_size
    starting_offset = (page_number - 1) * page_size
  end

  if (cursor = page_param[:after])
    starting_offset = cursor[:offset]
  end

  current_offset = @object.instance_variable_get(:@__graphiti_index)
  offset = starting_offset + current_offset + 1 # (+ 1 b/c o-base index)
  Base64.encode64({offset: offset}.to_json).chomp
end
method_missing(id, ...) click to toggle source

Allow access to resource methods

Calls superclass method
# File lib/graphiti/serializer.rb, line 74
def method_missing(id, ...)
  if @resource.respond_to?(id, true)
    @resource.send(id, ...)
  else
    super
  end
end
requested_relationships(fields) click to toggle source

NB - avoid clobbering includes when sparse fieldset github.com/jsonapi-rb/jsonapi-serializable/pull/102

We also override this method to ensure attributes and relationships have separate condition blocks. This way an attribute and relationship can have the same name, and the attribute can be conditional without affecting the relationship.

# File lib/graphiti/serializer.rb, line 41
def requested_relationships(fields)
  @_relationships.select do |k, _|
    _conditionally_included?(self.class.relationship_condition_blocks, k)
  end
end
respond_to_missing?(method_name, include_private = true) click to toggle source
Calls superclass method
# File lib/graphiti/serializer.rb, line 82
def respond_to_missing?(method_name, include_private = true)
  @resource.respond_to?(method_name, include_private) || super
end

Private Instance Methods

strip_relationships!(hash) click to toggle source
# File lib/graphiti/serializer.rb, line 94
def strip_relationships!(hash)
  hash[:relationships]&.select! do |name, payload|
    payload.key?(:data)
  end
end
strip_relationships?() click to toggle source
# File lib/graphiti/serializer.rb, line 100
def strip_relationships?
  return false unless Graphiti.config.links_on_demand
  params = Graphiti.context[:object]&.params || {}
  [false, nil, "false"].include?(params[:links])
end