Skip to content

Commit 9de21ed

Browse files
committed
Update Input object handling and spec
1 parent 249c5c9 commit 9de21ed

6 files changed

Lines changed: 147 additions & 57 deletions

File tree

lib/graphql/execution/field_resolve_step.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,11 @@ def execute_field
192192
else
193193
begin
194194
err ||= GraphQL::UnauthorizedFieldError.new(object: o, type: @parent_type, context: ctx, field: @field_definition)
195-
authorized_objects << query.schema.unauthorized_field(err)
196-
authorized_results << @results[i]
195+
new_obj = query.schema.unauthorized_field(err)
196+
if !new_obj.nil?
197+
authorized_objects << new_obj
198+
authorized_results << @results[i]
199+
end
197200
rescue GraphQL::ExecutionError => exec_err
198201
add_graphql_error(exec_err)
199202
end

lib/graphql/execution/input_values.rb

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def argument_value(argument_values, argument_key, argument_definition, arg_value
113113
end
114114

115115
if treat_as_type.kind.list? && !arg_value.nil?
116-
inner_t = treat_as_type.unwrap
116+
inner_t = treat_as_type.of_type
117117
arg_value = if arg_value.is_a?(Array)
118118
values = Array.new(arg_value.size)
119119
arg_value.each_with_index { |inner_v, idx| argument_value(values, idx, argument_definition, inner_v, inner_t, field_resolve_step)}
@@ -221,24 +221,40 @@ def value_from_ast(value_node, type)
221221

222222
elsif type.kind.input_object?
223223
coerced_obj = {}
224-
arg_nodes_by_name = value_node.arguments.each_with_object({}) do |arg_node, acc| # rubocop:disable Development/ContextIsPassedCop
225-
acc[arg_node.name] = arg_node
226-
end
227-
228-
@query.types.arguments(type).each do |arg|
229-
arg_node = arg_nodes_by_name[arg.graphql_name]
230-
arg_key = arg.keyword
231-
if arg_node.nil? || (arg_node.value.is_a?(Language::Nodes::VariableIdentifier) && !variable_values.key?(arg_node.value.name))
232-
if arg.default_value?
233-
coerced_obj[arg_key] = arg.default_value
224+
if value_node.is_a?(Hash)
225+
@query.types.arguments(type).each do |arg|
226+
arg_value = value_node[arg.keyword]
227+
arg_key = arg.keyword
228+
if arg_value.nil?
229+
if arg.default_value?
230+
coerced_obj[arg_key] = arg.default_value
231+
end
232+
next
234233
end
235-
next
234+
235+
coerced_obj[arg_key] = value_from_ast(arg_value, arg.type)
236+
end
237+
else
238+
arg_nodes_by_name = value_node.arguments.each_with_object({}) do |arg_node, acc| # rubocop:disable Development/ContextIsPassedCop
239+
acc[arg_node.name] = arg_node
236240
end
237241

238-
arg_value = value_from_ast(arg_node.value, arg.type)
239-
coerced_obj[arg_key] = arg_value
242+
@query.types.arguments(type).each do |arg|
243+
arg_node = arg_nodes_by_name[arg.graphql_name]
244+
arg_key = arg.keyword
245+
if arg_node.nil? || (arg_node.value.is_a?(Language::Nodes::VariableIdentifier) && !variable_values.key?(arg_node.value.name))
246+
if arg.default_value?
247+
coerced_obj[arg_key] = arg.default_value
248+
end
249+
next
250+
end
251+
252+
arg_value = value_from_ast(arg_node.value, arg.type)
253+
coerced_obj[arg_key] = arg_value
254+
end
240255
end
241256

257+
242258
coerced_obj
243259
elsif type.kind.leaf?
244260
if type.kind.enum?

lib/graphql/schema/argument.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,8 @@ def visible?(context)
165165
true
166166
end
167167

168-
def authorizes?(_context)
169-
self.method(:authorized?).owner != GraphQL::Schema::Argument
168+
def authorizes?(context)
169+
self.method(:authorized?).owner != GraphQL::Schema::Argument || type.unwrap.authorizes?(context)
170170
end
171171

172172
def authorized?(obj, value, ctx)

lib/graphql/schema/input_object.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ def validate_for(context)
113113
end
114114

115115
class << self
116+
def authorizes?(ctx)
117+
self.method(:authorized?).owner != GraphQL::Schema::InputObject
118+
end
119+
116120
def authorized?(obj, value, ctx)
117121
# Authorize each argument (but this doesn't apply if `prepare` is implemented):
118122
if value.respond_to?(:key?)

0 commit comments

Comments
 (0)