datacite/volpino

View on GitHub
app/controllers/graphql_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

class GraphqlController < ApplicationController
  skip_before_action :verify_authenticity_token

  def execute
    variables = ensure_hash(params[:variables])
    query = params[:query]
    operation_name = params[:operationName]
    context = {
      tracing_enabled: ApolloFederation::Tracing.should_add_traces(headers),
    }
    result = VolpinoSchema.execute(query, variables: variables, context: context, operation_name: operation_name)
    render json: ApolloFederation::Tracing.attach_trace_to_result(result)
  rescue StandardError => e
    raise e unless Rails.env.development?

    handle_error_in_development e
  end

  private
    # Handle form data, JSON body, or a blank value
    def ensure_hash(ambiguous_param)
      case ambiguous_param
      when String
        if ambiguous_param.present?
          ensure_hash(JSON.parse(ambiguous_param))
        else
          {}
        end
      when Hash, ActionController::Parameters
        ambiguous_param
      when nil
        {}
      else
        raise ArgumentError, "Unexpected parameter: #{ambiguous_param}"
      end
    end

    def handle_error_in_development(e)
      logger.error e.message
      logger.error e.backtrace.join("\n")

      render json: { error: { message: e.message, backtrace: e.backtrace }, data: {} }, status: :internal_server_error
    end
end