Class: GraphQL::Stitching::Request

Inherits:
Object
  • Object
show all
Defined in:
lib/graphql/stitching/request.rb

Constant Summary collapse

SUPPORTED_OPERATIONS =
["query", "mutation"].freeze
SKIP_INCLUDE_DIRECTIVE =
/@(?:skip|include)/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(document, operation_name: nil, variables: nil, context: nil) ⇒ Request

Returns a new instance of Request.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/graphql/stitching/request.rb', line 11

def initialize(document, operation_name: nil, variables: nil, context: nil)
  @string = nil
  @digest = nil
  @normalized_string = nil
  @normalized_digest = nil
  @operation = nil
  @operation_directives = nil
  @variable_definitions = nil
  @fragment_definitions = nil

  @document = if document.is_a?(String)
    @string = document
    GraphQL.parse(document)
  else
    document
  end

  @operation_name = operation_name
  @variables = variables || {}
  @context = context || GraphQL::Stitching::EMPTY_OBJECT
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



9
10
11
# File 'lib/graphql/stitching/request.rb', line 9

def context
  @context
end

#documentObject (readonly)

Returns the value of attribute document.



9
10
11
# File 'lib/graphql/stitching/request.rb', line 9

def document
  @document
end

#operation_nameObject (readonly)

Returns the value of attribute operation_name.



9
10
11
# File 'lib/graphql/stitching/request.rb', line 9

def operation_name
  @operation_name
end

#variablesObject (readonly)

Returns the value of attribute variables.



9
10
11
# File 'lib/graphql/stitching/request.rb', line 9

def variables
  @variables
end

Instance Method Details

#digestObject



41
42
43
# File 'lib/graphql/stitching/request.rb', line 41

def digest
  @digest ||= Digest::SHA2.hexdigest(string)
end

#fragment_definitionsObject



80
81
82
83
84
# File 'lib/graphql/stitching/request.rb', line 80

def fragment_definitions
  @fragment_definitions ||= @document.definitions.each_with_object({}) do |d, memo|
    memo[d.name] = d if d.is_a?(GraphQL::Language::Nodes::FragmentDefinition)
  end
end

#normalized_digestObject



45
46
47
# File 'lib/graphql/stitching/request.rb', line 45

def normalized_digest
  @normalized_digest ||= Digest::SHA2.hexdigest(normalized_string)
end

#normalized_stringObject



37
38
39
# File 'lib/graphql/stitching/request.rb', line 37

def normalized_string
  @normalized_string ||= @document.to_query_string
end

#operationObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/graphql/stitching/request.rb', line 49

def operation
  @operation ||= begin
    operation_defs = @document.definitions.select do |d|
      next unless d.is_a?(GraphQL::Language::Nodes::OperationDefinition)
      next unless SUPPORTED_OPERATIONS.include?(d.operation_type)
      @operation_name ? d.name == @operation_name : true
    end

    if operation_defs.length < 1
      raise GraphQL::ExecutionError, "Invalid root operation for given name and operation type."
    elsif operation_defs.length > 1
      raise GraphQL::ExecutionError, "An operation name is required when sending multiple operations."
    end

    operation_defs.first
  end
end

#operation_directivesObject



67
68
69
70
71
72
# File 'lib/graphql/stitching/request.rb', line 67

def operation_directives
  @operation_directives ||= if operation.directives.any?
    printer = GraphQL::Language::Printer.new
    operation.directives.map { printer.print(_1) }.join(" ")
  end
end

#prepare!Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/graphql/stitching/request.rb', line 86

def prepare!
  operation.variables.each do |v|
    @variables[v.name] = v.default_value if @variables[v.name].nil? && !v.default_value.nil?
  end

  if @string.nil? || @string.match?(SKIP_INCLUDE_DIRECTIVE)
    SkipInclude.render(@document, @variables) do |modified_ast|
      @document = modified_ast
      @string = @normalized_string = nil
      @digest = @normalized_digest = nil
      @operation = @operation_directives = @variable_definitions = nil
    end
  end

  self
end

#stringObject



33
34
35
# File 'lib/graphql/stitching/request.rb', line 33

def string
  @string || normalized_string
end

#variable_definitionsObject



74
75
76
77
78
# File 'lib/graphql/stitching/request.rb', line 74

def variable_definitions
  @variable_definitions ||= operation.variables.each_with_object({}) do |v, memo|
    memo[v.name] = v.type
  end
end