class APIQL::Entity

Attributes

apiql_attributes[R]
object[R]

Public Class Methods

attributes(*attrs) click to toggle source
# File lib/apiql.rb, line 334
def attributes(*attrs)
  @apiql_attributes ||= []
  @apiql_attributes += attrs.map(&:to_sym)
end
inherited(child) click to toggle source
Calls superclass method
# File lib/apiql.rb, line 322
def inherited(child)
  super

  return if self.class == ::APIQL::Entity

  attributes = apiql_attributes&.try(:deep_dup) || []

  child.instance_eval do
    @apiql_attributes = attributes
  end
end
new(object, context) click to toggle source
# File lib/apiql.rb, line 342
def initialize(object, context)
  @object = object
  @context = context
  authorize! :read, object
  @context.inject_delegators(self)
end

Public Instance Methods

render(schema = nil) click to toggle source
# File lib/apiql.rb, line 349
def render(schema = nil)
  return unless @object.present?

  respond = {}

  schema.each do |field|
    if field.is_a? Hash
      field.each do |field, sub_schema|
        reg = field.match(/\A((?<alias>[\w\.\!]+):\s*)?(?<name>[\w\.\!]+)(\((?<params>.*?)\))?\z/)
        raise Error, field unless reg.present?

        name = reg[:alias] || reg[:name]

        if respond[name].is_a? ::Hash
          respond = respond.deep_merge({
            name => render_attribute(reg[:name], reg[:params].presence, sub_schema)
          })
        else
          respond[name] = render_attribute(reg[:name], reg[:params].presence, sub_schema)
        end
      end
    else
      reg = field.match(/\A((?<alias>[\w\.\!]+):\s*)?(?<name>[\w\.\!]+)(\((?<params>.*?)\))?\z/)
      raise Error, field unless reg.present?

      name = reg[:alias] || reg[:name]

      if respond[name].is_a? ::Hash
        respond = respond.deep_merge({
          name => render_attribute(reg[:name], reg[:params].presence)
        })
      else
        respond[name] = render_attribute(reg[:name], reg[:params].presence)
      end
    end
  end

  respond
end

Private Instance Methods

eager_load() click to toggle source
# File lib/apiql.rb, line 432
def eager_load
  result = @eager_load

  @eager_load = nil

  result
end
get_field(field, params = nil) click to toggle source
# File lib/apiql.rb, line 391
def get_field(field, params = nil)
  if params.present?
    params = @context.parse_params(params)
  end

  names = field.split('.')
  if names.count > 1
    o = nil
    names.each do |field|
      if o.nil?
        return unless field.to_sym.in? self.class.apiql_attributes

        if respond_to? field
          o = public_send(field, *params)
        else
          o = object.public_send(field, *params)
        end

        break if o.nil?
      else
        if o.respond_to? field
          o = o.public_send(field, *params)
        else
          o = nil
          break
        end
      end
    end

    o
  else
    return unless field.to_sym.in? self.class.apiql_attributes

    if respond_to? field
      public_send(field, *params)
    else
      object.public_send(field, *params)
    end
  end
end
render_attribute(field, params = nil, schema = nil) click to toggle source
# File lib/apiql.rb, line 440
def render_attribute(field, params = nil, schema = nil)
  @eager_load = APIQL::eager_loads(schema)
  data = get_field(field, params)

  if @eager_load.present? && !data.is_a?(::Hash) && !data.is_a?(::Array)
    if data.respond_to?(:each) && data.respond_to?(:map)
      unless data.loaded?
        data = data.eager_load(eager_load)
      end
    end
  end

  if data.is_a?(Hash) && schema.present?
    HashEntity.new(data, @context).render(schema)
  else
    render_value(data, schema)
  end
end
render_value(value, schema = nil) click to toggle source
# File lib/apiql.rb, line 459
def render_value(value, schema = nil)
  if schema.present?
    @context.render_value(value, schema)
  else
    value
  end
end