Skip to content

Commit 80e5e58

Browse files
authored
Merge pull request rmosolgo#348 from rmosolgo/ctx-middleware-fix
fix(Middleware) add ast_node and irep_node to query context for middlewares
2 parents 3872c32 + dd22ef5 commit 80e5e58

File tree

2 files changed

+32
-35
lines changed

2 files changed

+32
-35
lines changed

lib/graphql/query/serial_execution/field_resolution.rb

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -61,44 +61,40 @@ def get_finished_value(raw_value)
6161
# is added to the "errors" key.
6262
def get_raw_value
6363
middlewares = execution_context.query.schema.middleware
64-
field_resolve_step = FieldResolveStep.new(irep_node)
65-
resolve_arguments = [parent_type, target, field, arguments, execution_context.query.context]
66-
# only run a middleware chain if there are any middleware
67-
if middlewares.any?
68-
chain = GraphQL::Schema::MiddlewareChain.new(
69-
steps: middlewares + [field_resolve_step],
70-
arguments: resolve_arguments
71-
)
72-
chain.call
73-
else
74-
field_resolve_step.call(*resolve_arguments)
75-
end
76-
rescue GraphQL::ExecutionError => err
77-
err
64+
query_context = execution_context.query.context
65+
# setup
66+
query_context.ast_node = @irep_node.ast_node
67+
query_context.irep_node = @irep_node
68+
69+
resolve_arguments = [parent_type, target, field, arguments, query_context]
70+
71+
resolve_value = begin
72+
# only run a middleware chain if there are any middleware
73+
if middlewares.any?
74+
chain = GraphQL::Schema::MiddlewareChain.new(
75+
steps: middlewares + [FieldResolveStep],
76+
arguments: resolve_arguments
77+
)
78+
chain.call
79+
else
80+
FieldResolveStep.call(*resolve_arguments)
81+
end
82+
rescue GraphQL::ExecutionError => err
83+
err
84+
end
85+
ensure
86+
# teardown
87+
query_context.ast_node = nil
88+
query_context.irep_node = nil
89+
resolve_value
7890
end
7991

8092

8193
# A `.call`-able suitable to be the last step in a middleware chain
82-
class FieldResolveStep
83-
def initialize(irep_node)
84-
@irep_node = irep_node
85-
end
86-
94+
module FieldResolveStep
8795
# Execute the field's resolve method
88-
def call(_parent_type, parent_object, field_definition, field_args, context, _next = nil)
89-
# setup
90-
context.ast_node = @irep_node.ast_node
91-
context.irep_node = @irep_node
92-
93-
# resolve
94-
value = field_definition.resolve(parent_object, field_args, context)
95-
96-
# teardown
97-
context.ast_node = nil
98-
context.irep_node = nil
99-
100-
# return
101-
value
96+
def self.call(_parent_type, parent_object, field_definition, field_args, context, _next = nil)
97+
field_definition.resolve(parent_object, field_args, context)
10298
end
10399
end
104100
end

spec/graphql/schema/timeout_middleware_spec.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@
166166
describe "with a custom block" do
167167
let(:timeout_middleware) {
168168
GraphQL::Schema::TimeoutMiddleware.new(max_seconds: max_seconds) do |err, query|
169-
raise("Query timed out after 2s: #{query.class.name}")
169+
raise("Query timed out after 2s: #{query.class.name} on #{query.context.ast_node.alias}")
170170
end
171171
}
172172
let(:query_string) {%|
@@ -180,7 +180,8 @@
180180
|}
181181

182182
it "calls the block" do
183-
assert_raises(RuntimeError) { result }
183+
err = assert_raises(RuntimeError) { result }
184+
assert_equal "Query timed out after 2s: GraphQL::Query on d", err.message
184185
end
185186
end
186187
end

0 commit comments

Comments
 (0)