graphql_controller.rb 1.2 KB

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