graphql_controller.rb 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. render json: PokemonTradeSchema.execute(
  12. query,
  13. variables: variables,
  14. context: context,
  15. operation_name: operation_name,
  16. )
  17. rescue StandardError => e
  18. raise e unless Rails.env.development?
  19. handle_error_in_development(e)
  20. end
  21. private
  22. # Handle form data, JSON body, or a blank value
  23. def ensure_hash(ambiguous_param)
  24. case ambiguous_param
  25. when String
  26. if ambiguous_param.present?
  27. ensure_hash(JSON.parse(ambiguous_param))
  28. else
  29. {}
  30. end
  31. when Hash, ActionController::Parameters
  32. ambiguous_param
  33. when nil
  34. {}
  35. else
  36. raise ArgumentError, "Unexpected parameter: #{ambiguous_param}"
  37. end
  38. end
  39. def handle_error_in_development(err)
  40. logger.error err.message
  41. logger.error err.backtrace.join("\n")
  42. render json: {
  43. errors: [{message: err.message, backtrace: err.backtrace}],
  44. data: {},
  45. }, status: :internal_server_error
  46. end
  47. end