Class: GraphQL::Client::Aws

Inherits:
HTTP
  • Object
show all
Defined in:
lib/graphql/client/aws.rb

Instance Method Summary collapse

Constructor Details

#initialize(uri, **opts, &block) ⇒ Aws

Returns a new instance of Aws.



9
10
11
12
13
14
15
16
17
# 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

Instance Method Details

#build_body(document, operation_name, variables) ⇒ Object



39
40
41
42
43
44
# 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: {}) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 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) ⇒ Object



46
47
48
49
50
51
52
53
54
55
# 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