Sha256: 1316e8a0bfc4e2f3556c5afde12fbcd28703ce6ad16ff2fecf04974a7c695c8a

Contents?: true

Size: 1.62 KB

Versions: 2

Compression:

Stored size: 1.62 KB

Contents

# frozen_string_literal: true

require 'graphql_rails/concerns/service'
require 'graphql_rails/errors/execution_error'
require 'graphql_rails/errors/validation_error'
require 'graphql_rails/errors/custom_execution_error'

module GraphqlRails
  class Controller
    class Request
      # Converts user provided free-form errors in to meaningful graphql error classes
      class FormatErrors
        include Service

        def initialize(not_formatted_errors:)
          @not_formatted_errors = not_formatted_errors
        end

        def call
          if validation_errors?
            formatted_validation_errors
          else
            not_formatted_errors.map { |error| format_error(error) }
          end
        end

        private

        attr_reader :not_formatted_errors

        def validation_errors?
          defined?(ActiveModel) &&
            defined?(ActiveModel::Errors) &&
            not_formatted_errors.is_a?(ActiveModel::Errors)
        end

        def formatted_validation_errors
          not_formatted_errors.map do |field, message|
            ValidationError.new(message, field)
          end
        end

        def format_error(error)
          if error.is_a?(String)
            ExecutionError.new(error)
          elsif error.is_a?(GraphQL::ExecutionError)
            error
          elsif CustomExecutionError.accepts?(error)
            message = error[:message] || error['message']
            CustomExecutionError.new(message, error.except(:message, 'message'))
          elsif error.respond_to?(:message)
            ExecutionError.new(error.message)
          end
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
graphql_rails-3.0.0 lib/graphql_rails/controller/request/format_errors.rb
graphql_rails-2.4.0 lib/graphql_rails/controller/request/format_errors.rb