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