class GraphqlRails::Controller

base class for all graphql_rails controllers

Attributes

action_name[R]
controller_name[R]
graphql_request[R]

Public Class Methods

action(action_name) click to toggle source
# File lib/graphql_rails/controller.rb, line 33
def action(action_name)
  controller_configuration.action(action_name)
end
action_default() click to toggle source
# File lib/graphql_rails/controller.rb, line 37
def action_default
  controller_configuration.action_default
end
after_action(*args, **kwargs, &block) click to toggle source
# File lib/graphql_rails/controller.rb, line 29
def after_action(*args, **kwargs, &block)
  controller_configuration.add_action_hook(:after, *args, **kwargs, &block)
end
around_action(*args, **kwargs, &block) click to toggle source
# File lib/graphql_rails/controller.rb, line 25
def around_action(*args, **kwargs, &block)
  controller_configuration.add_action_hook(:around, *args, **kwargs, &block)
end
before_action(*args, **kwargs, &block) click to toggle source
# File lib/graphql_rails/controller.rb, line 21
def before_action(*args, **kwargs, &block)
  controller_configuration.add_action_hook(:before, *args, **kwargs, &block)
end
controller_configuration() click to toggle source
# File lib/graphql_rails/controller.rb, line 45
def controller_configuration
  @controller_configuration ||= Controller::Configuration.new(self)
end
inherited(subclass) click to toggle source
Calls superclass method
# File lib/graphql_rails/controller.rb, line 15
def inherited(subclass)
  super
  new_config = controller_configuration.dup_with(controller: subclass)
  subclass.instance_variable_set(:@controller_configuration, new_config)
end
model(*args) click to toggle source
# File lib/graphql_rails/controller.rb, line 41
def model(*args)
  controller_configuration.model(*args)
end
new(graphql_request) click to toggle source
# File lib/graphql_rails/controller.rb, line 52
def initialize(graphql_request)
  @graphql_request = graphql_request
end

Public Instance Methods

call(method_name) click to toggle source
# File lib/graphql_rails/controller.rb, line 56
def call(method_name)
  @action_name = method_name
  with_controller_action_logging do
    call_with_rendering
    graphql_request.object_to_return
  end
ensure
  @action_name = nil
end

Protected Instance Methods

params() click to toggle source
# File lib/graphql_rails/controller.rb, line 78
def params
  @params ||= graphql_request.params.deep_transform_keys { |key| key.to_s.underscore }.with_indifferent_access
end
render(object_or_errors) click to toggle source
# File lib/graphql_rails/controller.rb, line 70
def render(object_or_errors)
  errors = graphql_errors_from_render_params(object_or_errors)
  object = errors.empty? ? object_or_errors : nil

  graphql_request.errors = errors
  graphql_request.object_to_return = object
end

Private Instance Methods

call_with_rendering() click to toggle source
# File lib/graphql_rails/controller.rb, line 84
def call_with_rendering
  hooks_runner = ActionHooksRunner.new(action_name: action_name, controller: self)
  response = hooks_runner.call { public_send(action_name) }

  render response if graphql_request.no_object_to_return?
rescue StandardError => error
  if error.is_a?(GraphQL::ExecutionError)
    render error: error
  else
    render error: SystemError.new(error.message)
  end
end
default_payload() click to toggle source
# File lib/graphql_rails/controller/log_controller_action.rb, line 36
def default_payload
  {
    controller: controller_name,
    action: action_name,
    params: filtered_params
  }
end
filter_parameters() click to toggle source
# File lib/graphql_rails/controller/log_controller_action.rb, line 58
def filter_parameters
  return [] if !defined?(Rails) || Rails.application.nil?

  Rails.application.config.filter_parameters || []
end
filtered_params() click to toggle source
# File lib/graphql_rails/controller/log_controller_action.rb, line 48
def filtered_params
  @filtered_params ||=
    if filter_parameters.empty?
      params
    else
      filter_options = Rails.configuration.filter_parameters
      parameter_filter_class.new(filter_options).filter(params)
    end
end
graphql_errors_from_render_params(rendering_params) click to toggle source
# File lib/graphql_rails/controller.rb, line 97
def graphql_errors_from_render_params(rendering_params)
  return [] unless rendering_params.is_a?(Hash)
  return [] if rendering_params.keys.count != 1

  errors = rendering_params[:error] || rendering_params[:errors]
  errors.is_a?(Enumerable) ? errors : Array(errors)
end
parameter_filter_class() click to toggle source
# File lib/graphql_rails/controller/log_controller_action.rb, line 64
def parameter_filter_class
  return ActiveSupport::ParameterFilter if Object.const_defined?('ActiveSupport::ParameterFilter')

  ActionDispatch::Http::ParameterFilter
end
status() click to toggle source
# File lib/graphql_rails/controller/log_controller_action.rb, line 44
def status
  graphql_request.errors.present? ? 500 : 200
end
with_controller_action_logging(&block) click to toggle source
# File lib/graphql_rails/controller.rb, line 105
def with_controller_action_logging(&block)
  LogControllerAction.call(
    controller_name: self.class.name,
    action_name: action_name,
    params: params,
    graphql_request: graphql_request,
    &block
  )
end