module HQ::GraphQL::Ext::ObjectExtensions::PrependMethods

Attributes

authorized_action[W]

Public Instance Methods

authorize_action(action) click to toggle source
# File lib/hq/graphql/ext/object_extensions.rb, line 24
def authorize_action(action)
  self.authorized_action = action
end
authorized?(object, context) click to toggle source
Calls superclass method
# File lib/hq/graphql/ext/object_extensions.rb, line 28
def authorized?(object, context)
  super && ::HQ::GraphQL.authorized?(authorized_action, object, context)
end
with_model(model_name, attributes: true, associations: true, auto_nil: true, enums: true) click to toggle source
# File lib/hq/graphql/ext/object_extensions.rb, line 32
def with_model(model_name, attributes: true, associations: true, auto_nil: true, enums: true)
  self.model_name = model_name
  self.auto_load_attributes = attributes
  self.auto_load_associations = associations
  self.auto_load_enums = enums

  lazy_load do
    model_columns.each do |column|
      field_from_column(column, auto_nil: auto_nil)
    end

    model_associations.each do |association|
      next if resource_reflections[association.name.to_s]
      field_from_association(association, auto_nil: auto_nil)
    end

    resource_reflections.values.each do |resource_reflection|
      reflection = resource_reflection.reflection(model_klass)
      next unless reflection
      field_from_association(reflection, auto_nil: auto_nil, internal_association: true, &resource_reflection.block)
    end
  end
end

Private Instance Methods

association_required?(association) click to toggle source
# File lib/hq/graphql/ext/object_extensions.rb, line 106
def association_required?(association)
  !association.options[:optional] || has_presence_validation?(association)
end
authorized_action() click to toggle source
# File lib/hq/graphql/ext/object_extensions.rb, line 59
def authorized_action
  @authorized_action ||= :read
end
field_exists?(name) click to toggle source
# File lib/hq/graphql/ext/object_extensions.rb, line 102
def field_exists?(name)
  !!fields[camelize(name)]
end
field_from_association(association, auto_nil:, internal_association: false, &block) click to toggle source
# File lib/hq/graphql/ext/object_extensions.rb, line 63
def field_from_association(association, auto_nil:, internal_association: false, &block)
  association_klass = association.klass
  name              = association.name.to_s
  return if field_exists?(name)

  klass = model_klass
  type  = Types[association_klass]

  case association.macro
  when :has_many
    field name, [type], null: false, klass: model_name do
      if ::HQ::GraphQL.use_experimental_associations?
        extension FieldExtension::PaginatedArguments, klass: association_klass
        extension FieldExtension::PaginatedLoader, klass: klass, association: name, internal_association: internal_association
      else
        extension FieldExtension::AssociationLoaderExtension, klass: klass
      end
      instance_eval(&block) if block
    end
  when :has_one
    field name, type, null: !auto_nil || !has_presence_validation?(association), klass: model_name do
      extension FieldExtension::AssociationLoaderExtension, klass: klass
    end
  else
    field name, type, null: !auto_nil || !association_required?(association), klass: model_name do
      extension FieldExtension::AssociationLoaderExtension, klass: klass
    end
  end
rescue Types::Error
  nil
end
field_from_column(column, auto_nil:) click to toggle source
# File lib/hq/graphql/ext/object_extensions.rb, line 95
def field_from_column(column, auto_nil:)
  name = column.name
  return if field_exists?(name)

  field name, Types.type_from_column(column), null: !auto_nil || column.null
end
has_presence_validation?(association) click to toggle source
# File lib/hq/graphql/ext/object_extensions.rb, line 110
def has_presence_validation?(association)
  model_klass.validators.any? do |validation|
    next unless validation.class == ActiveRecord::Validations::PresenceValidator && !(validation.options.include?(:if) || validation.options.include?(:unless))
    validation.attributes.any? { |a| a.to_s == association.name.to_s }
  end
end