# frozen_string_literal: true class API::AuthController < DeviseTokenAuth::ApplicationController attr_accessor :client_id, :token, :resource def execute # result = if params[:_json] # PokemonTradeSchema.multiplex( # params[:_json].map do |param| # {query: param[:query]}.merge(execute_params(param)) # end, # ) # else # PokemonTradeSchema.execute(params[:query], execute_params(params)) # end # render json: result unless performed? result = PokemonTradeSchema.execute( params[:query], execute_params(params), ) render json: result unless performed? rescue StandardError => e raise e unless Rails.env.development? handle_error_in_development(e) end private def execute_params(item) { operation_name: item[:operationName], variables: ensure_hash(item[:variables]), context: {controller: self}, } end 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(err) logger.error err.message logger.error err.backtrace.join("\n") render json: { errors: [{message: err.message, backtrace: err.backtrace}], data: {}, }, status: :internal_server_error end end