class ShopifyGraphql::Client

Public Class Methods

new(api_version = ShopifyAPI::Base.api_version) click to toggle source
# File lib/shopify_graphql/client.rb, line 3
def initialize(api_version = ShopifyAPI::Base.api_version)
  @api_version = api_version
end

Public Instance Methods

api_url() click to toggle source
# File lib/shopify_graphql/client.rb, line 20
def api_url
  [ShopifyAPI::Base.site, @api_version.construct_graphql_path].join
end
connection() click to toggle source
# File lib/shopify_graphql/client.rb, line 28
def connection
  @connection ||= Faraday.new(url: api_url, headers: request_headers) do |conn|
    conn.request :json
    conn.response :json, parser_options: { object_class: OpenStruct }
  end
end
execute(query, **variables) click to toggle source
# File lib/shopify_graphql/client.rb, line 7
def execute(query, **variables)
  operation_name = variables.delete(:operation_name)
  response = connection.post do |req|
    req.body = {
      query: query,
      operationName: operation_name,
      variables: variables,
    }.to_json
  end
  response = handle_response(response)
  ShopifyGraphql::Response.new(response)
end
handle_graphql_errors(response) click to toggle source
# File lib/shopify_graphql/client.rb, line 70
def handle_graphql_errors(response)
  return response if response.errors.blank?

  error = response.errors.first
  error_message = error.message
  error_code = error.extensions&.code
  error_doc = error.extensions&.documentation

  case error_code
  when "THROTTLED"
    raise TooManyRequests.new(response, error_message, code: error_code, doc: error_doc)
  else
    raise ConnectionError.new(response, error_message, code: error_code, doc: error_doc)
  end
end
handle_response(response) click to toggle source
# File lib/shopify_graphql/client.rb, line 35
def handle_response(response)
  case response.status
  when 200..400
    handle_graphql_errors(response.body)
  when 400
    raise BadRequest.new(response.body, code: response.status)
  when 401
    raise UnauthorizedAccess.new(response.body, code: response.status)
  when 402
    raise PaymentRequired.new(response.body, code: response.status)
  when 403
    raise ForbiddenAccess.new(response.body, code: response.status)
  when 404
    raise ResourceNotFound.new(response.body, code: response.status)
  when 405
    raise MethodNotAllowed.new(response.body, code: response.status)
  when 409
    raise ResourceConflict.new(response.body, code: response.status)
  when 410
    raise ResourceGone.new(response.body, code: response.status)
  when 412
    raise PreconditionFailed.new(response.body, code: response.status)
  when 422
    raise ResourceInvalid.new(response.body, code: response.status)
  when 429
    raise TooManyRequests.new(response.body, code: response.status)
  when 401...500
    raise ClientError.new(response.body, code: response.status)
  when 500...600
    raise ServerError.new(response.body, code: response.status)
  else
    raise ConnectionError.new(response.body, "Unknown response code: #{response.status}")
  end
end
handle_user_errors(response) click to toggle source
# File lib/shopify_graphql/client.rb, line 86
def handle_user_errors(response)
  return response if response.userErrors.blank?

  error = response.userErrors.first
  error_message = error.message
  error_fields = error.field
  error_code = error.code

  raise UserError.new(response, error_message, fields: error_fields, code: error_code)
end
request_headers() click to toggle source
# File lib/shopify_graphql/client.rb, line 24
def request_headers
  ShopifyAPI::Base.headers
end