graphql_controller.rb 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. # frozen_string_literal: true
  2. class API::GraphqlController < API::ApplicationController
  3. def execute
  4. variables = ensure_hash(params[:variables])
  5. query = params[:query]
  6. operation_name = params[:operationName]
  7. context = {
  8. # Query context goes here, for example:
  9. # current_user: current_user,
  10. }
  11. result = PokemonTradeSchema.execute(query, variables: variables, context: context, operation_name: operation_name)
  12. render json: result
  13. rescue StandardError => e
  14. raise e unless Rails.env.development?
  15. handle_error_in_development(e)
  16. end
  17. private
  18. # Handle form data, JSON body, or a blank value
  19. def ensure_hash(ambiguous_param)
  20. case ambiguous_param
  21. when String
  22. if ambiguous_param.present?
  23. ensure_hash(JSON.parse(ambiguous_param))
  24. else
  25. {}
  26. end
  27. when Hash, ActionController::Parameters
  28. ambiguous_param
  29. when nil
  30. {}
  31. else
  32. raise ArgumentError, "Unexpected parameter: #{ambiguous_param}"
  33. end
  34. end
  35. def handle_error_in_development(err)
  36. logger.error err.message
  37. logger.error err.backtrace.join("\n")
  38. render json: {errors: [{message: err.message, backtrace: err.backtrace}], data: {}}, status: :internal_server_error
  39. end
  40. end