module GraphQL::Sugar

Constants

GRAPHQL_TYPE_MAPPING
VERSION

Public Class Methods

get_association_name(field_name) click to toggle source
# File lib/graphql/sugar.rb, line 73
def self.get_association_name(field_name)
  field_name.to_s.underscore
end
get_column_details(model_class, column_name) click to toggle source
# File lib/graphql/sugar.rb, line 40
def self.get_column_details(model_class, column_name)
  column_details = model_class.columns_hash[column_name]
  raise "The attribute '#{column_name}' doesn't exist in model '#{model_class}'." if column_details.blank?
  column_details
end
get_column_name(field_name) click to toggle source
# File lib/graphql/sugar.rb, line 36
def self.get_column_name(field_name)
  field_name.to_s.underscore
end
get_graphql_type(model_class, column_name, enforce_non_null: true) click to toggle source
# File lib/graphql/sugar.rb, line 46
def self.get_graphql_type(model_class, column_name, enforce_non_null: true) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
  return GraphQL::ID_TYPE.to_non_null_type if column_name == model_class.primary_key

  column_details = get_column_details(model_class, column_name)

  belongs_to_association = model_class.reflect_on_all_associations(:belongs_to).find { |a| a.foreign_key == column_name }

  type = if model_class.defined_enums.key?(column_name)
           GraphQL::STRING_TYPE
         elsif belongs_to_association.present?
           GraphQL::ID_TYPE
         else
           GRAPHQL_TYPE_MAPPING[column_details.type] || GraphQL::STRING_TYPE
         end

  type = type.to_list_type if column_details.respond_to?(:array?) && column_details.array?

  if enforce_non_null
    is_not_null = !column_details.null
    is_not_null ||= Sugar.validates_presence?(model_class, column_name)
    is_not_null ||= Sugar.validates_presence?(model_class, belongs_to_association.name) if belongs_to_association.present?
    type = type.to_non_null_type if is_not_null
  end

  type
end
get_model_class(type_defn) click to toggle source
# File lib/graphql/sugar.rb, line 30
def self.get_model_class(type_defn)
  model_class = type_defn.metadata[:model_class]
  raise "You must define a `model_class` first in `#{type_defn.class}`." if model_class.blank?
  model_class
end
get_mutator_function(field_name) click to toggle source
# File lib/graphql/sugar.rb, line 26
def self.get_mutator_function(field_name)
  "#{field_name.to_s.camelize}Mutator".constantize
end
get_resolver_function(field_name) click to toggle source
# File lib/graphql/sugar.rb, line 17
def self.get_resolver_function(field_name)
  "#{field_name.to_s.camelize}Resolver".constantize
end
get_resolver_graphql_type(field_name) click to toggle source
# File lib/graphql/sugar.rb, line 13
def self.get_resolver_graphql_type(field_name)
  "Types::#{field_name.to_s.classify}Type".constantize
end
get_resolver_plural(field_name) click to toggle source
# File lib/graphql/sugar.rb, line 21
def self.get_resolver_plural(field_name)
  field_string = field_name.to_s
  field_string.pluralize == field_string
end
validates_presence?(model_class, column_name) click to toggle source
# File lib/graphql/sugar.rb, line 77
def self.validates_presence?(model_class, column_name)
  column_validators = model_class.validators_on(column_name)
  column_validators.any? do |validator|
    validator.class == ActiveRecord::Validations::PresenceValidator &&
      !validator.options[:allow_nil] &&
      !validator.options[:allow_blank] &&
      !validator.options.key?(:if) &&
      !validator.options.key?(:unless)
  end
end