class GraphQL::Client::Aws

Public Class Methods

new(uri, **opts, &block) click to toggle source
Calls superclass method
# File lib/graphql/client/aws.rb, line 9
def initialize(uri, **opts, &block)
  if block_given?
    super(uri, &block)
  else
    super(uri)
  end
  appsync_signer_option = opts.merge(service: 'appsync')
  @signer = ::Aws::Sigv4::Signer.new(appsync_signer_option)
end

Public Instance Methods

build_body(document, operation_name, variables) click to toggle source
# File lib/graphql/client/aws.rb, line 39
def build_body(document, operation_name, variables)
  body = { 'query' => document.to_query_string }
  body['variables'] = variables if variables.any?
  body['operationName'] = operation_name if operation_name
  JSON.generate(body)
end
execute(document:, operation_name: nil, variables: {}, context: {}) click to toggle source
# File lib/graphql/client/aws.rb, line 19
def execute(document:, operation_name: nil, variables: {}, context: {})
  request = Net::HTTP::Post.new(uri.request_uri)

  request['Accept'] = 'application/json'
  headers(context).each { |name, value| request[name] = value }

  request.body = build_body(document, operation_name, variables)

  request = sign!(request)

  response = connection.request(request)

  case response
  when Net::HTTPOK, Net::HTTPBadRequest
    JSON.parse(response.body)
  else
    { 'errors' => [{ 'message' => "#{response.code} #{response.message}" }] }
  end
end
sign!(request) click to toggle source
# File lib/graphql/client/aws.rb, line 46
def sign!(request)
  signature = @signer.sign_request(http_method: request.method, url: uri, body: request.body)
  request['Host'] = signature.headers['Host']
  request['X-Amz-Date'] = signature.headers['x-amz-date']
  request['X-Amz-Security-Token'] = signature.headers['x-amz-security-token']
  request['X-Amz-Content-Sha256']= signature.headers['x-amz-content-sha256']
  request['Authorization'] = signature.headers['authorization']
  request['Content-Type'] = 'application/graphql'
  request
end