Module: GraphQL::Rails::ActiveReflection::Types

Defined in:
lib/graphql/rails/active_reflection/types/validator_type.rb,
lib/graphql/rails/active_reflection/types/model_reflection_type.rb,
lib/graphql/rails/active_reflection/types/validation_result_type.rb,
lib/graphql/rails/active_reflection/types/attribute_reflection_type.rb

Constant Summary collapse

ValidatorType =
::GraphQL::ObjectType.define do
  name ValidatorReflection.schema_name
  # TODO NumericalityValidator

  field :abscence, types.Boolean do
    resolve ->(obj, _args, _ctx) do
      obj < ActiveModel::Validations::AbsenceValidator
    end
  end

  field :prescence, types.Boolean do
    resolve ->(obj, _args, _ctx) do
      obj < ActiveModel::Validations::PrescenceValidator
    end
  end

  field :uniqueness, types.Boolean do
    resolve ->(obj, _args, _ctx) do
      obj < ActiveModel::Validations::UniquenessValidator
    end
  end

  field :with_format, types.String do
    resolve ->(obj, _args, _ctx) do
      return nil unless obj < ActiveModel::Validations::FormatValidator
      obj.options[:with]
    end
  end

  field :without_format, types.String do
    resolve ->(obj, _args, _ctx) do
      return nil unless obj < ActiveModel::Validations::FormatValidator
      obj.options[:without]
    end
  end

  field :min_length, types.Int do
    resolve ->(obj, _args, _ctx) do
      return nil unless obj < ActiveModel::Validations::LengthValidator
      obj.options[:minimum]
    end
  end

  field :max_length, types.Int do
    resolve ->(obj, _args, _ctx) do
      return nil unless obj < ActiveModel::Validations::LengthValidator
      obj.options[:maximum]
    end
  end

  field :inclusion, types.String.to_list_type do
    resolve ->(obj, _args, _ctx) do
      return nil unless obj < ActiveModel::Validations::InclusionValidator
      return nil if obj.options[:in].respond_to? :call
      obj.options[:in]
    end
  end

  field :exclusion, types.String.to_list_type do
    resolve ->(obj, _args, _ctx) do
      return nil unless obj < ActiveModel::Validations::ExclusionValidator
      return nil if obj.options[:in].respond_to? :call
      obj.options[:in]
    end
  end

  # TODO AcceptanceValidator (is this relevant anymore?)

end
ModelReflectionType =
::GraphQL::ObjectType.define do
  name ModelReflection.schema_name
  field :attributes, AttributeReflectionType.to_list_type
end
ValidationResultType =
::GraphQL::ObjectType.define do
  name ValidationResult.schema_name

  field :valid, types.Boolean
  field :errors, types.String.to_list_type
end
AttributeReflectionType =
::GraphQL::ObjectType.define do
  name AttributeReflection.schema_name

  field :name, !types.String
  field :validators, ValidatorType.to_list_type
  field :validate, ValidationResultType do
    argument :int, types.Int
    argument :str, types.String
    argument :float, types.Float
    argument :bool, types.Boolean

    resolve ->(obj, args, _ctx) do
      values = [args['int'], args['str'], args['float'], args['bool']]
      raise ArgumentError, "Must specify at least one argument" if values.compact.empty?
      raise ArgumentError, "Too many arguments, one expected" if values.compact.size > 1

      value = values.compact.first

      model = obj.klass.new
      model[obj.name] = value

      model.validate!
      ValidationResult.new(model.valid?, model.errors[obj.name])
    end
  end
end