Class: GraphQL::Schema::RelayClassicMutation
- Defined in:
- lib/graphql/schema/relay_classic_mutation.rb
Overview
Mutations that extend this base class get some conventions added for free:
- An argument called
clientMutationId
is always added, but it's not passed to the resolve method. The value is re-inserted to the response. (It's for client libraries to manage optimistic updates.) - The returned object type always has a field called
clientMutationId
to support that. - The mutation accepts one argument called
input
,argument
s defined in the mutation class are added to that input object, which is generated by the mutation.
These conventions were first specified by Relay Classic, but they come in handy:
clientMutationId
supports optimistic updates and cache rollbacks on the client- using a single
input:
argument makes it easy to post whole JSON objects to the mutation using one GraphQL variable ($input
) instead of making a separate variable for each argument.
Constant Summary
Constants included from Member::HasFields
Member::HasFields::CONFLICT_FIELD_NAMES, Member::HasFields::GRAPHQL_RUBY_KEYWORDS, Member::HasFields::RUBY_KEYWORDS
Constants included from GraphQL::Schema::Resolver::HasPayloadType
GraphQL::Schema::Resolver::HasPayloadType::NO_INTERFACES
Constants included from Member::HasArguments
Member::HasArguments::NO_ARGUMENTS
Constants included from FindInheritedValue::EmptyObjects
FindInheritedValue::EmptyObjects::EMPTY_ARRAY, FindInheritedValue::EmptyObjects::EMPTY_HASH
Constants included from Member::GraphQLTypeNames
Member::GraphQLTypeNames::Boolean, Member::GraphQLTypeNames::ID, Member::GraphQLTypeNames::Int
Instance Attribute Summary
Attributes inherited from Resolver
Class Method Summary collapse
-
.argument(*args, **kwargs, &block) ⇒ Object
Also apply this argument to the input type:.
-
.field_options ⇒ Object
Extend Schema::Mutation.field_options to add the
input
argument. -
.input_object_class(new_class = nil) ⇒ Class
The base class for generated input object types.
-
.input_type(new_input_type = nil) ⇒ Class
The generated InputObject class for this mutation's
input
.
Instance Method Summary collapse
-
#resolve_with_support(**inputs) ⇒ Object
Override GraphQL::Schema::Resolver#resolve_with_support to delete
client_mutation_id
from the kwargs.
Methods inherited from Mutation
Methods included from Member::HasFields
#add_field, #all_field_definitions, #field, #field_class, #fields, #get_field, #global_id_field, #own_fields
Methods included from GraphQL::Schema::Resolver::HasPayloadType
#field, #field_class, #object_class, #payload_type
Methods inherited from Resolver
#arguments, #authorized?, broadcastable, broadcastable?, complexity, #dataloader, extension, extensions, extras, has_max_page_size?, #initialize, max_page_size, null, #ready?, #resolve, resolve_method, type, type_expr, #unauthorized_object
Methods included from Member::BaseDSLMethods
#accessible?, #authorized?, #default_graphql_name, #description, #graphql_name, #introspection, #introspection?, #mutation, #name, #overridden_graphql_name, #to_graphql, #visible?
Methods included from Member::HasArguments
#add_argument, #all_argument_definitions, #argument, #argument_class, #arguments, #arguments_statically_coercible?, #coerce_arguments, #get_argument, #own_arguments, #validate_directive_argument
Methods included from Member::HasValidators
Methods included from Member::HasPath
Constructor Details
This class inherits a constructor from GraphQL::Schema::Resolver
Class Method Details
.argument(*args, **kwargs, &block) ⇒ Object
Also apply this argument to the input type:
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/graphql/schema/relay_classic_mutation.rb', line 86 def argument(*args, **kwargs, &block) it = input_type # make sure any inherited arguments are already added to it arg = super # This definition might be overriding something inherited; # if it is, remove the inherited definition so it's not confused at runtime as having multiple definitions prev_args = it.own_arguments[arg.graphql_name] case prev_args when GraphQL::Schema::Argument if prev_args.owner != self it.own_arguments.delete(arg.graphql_name) end when Array prev_args.reject! { |a| a.owner != self } if prev_args.empty? it.own_arguments.delete(arg.graphql_name) end end it.add_argument(arg) arg end |
.field_options ⇒ Object
Extend Schema::Mutation.field_options to add the input
argument
129 130 131 132 133 134 135 |
# File 'lib/graphql/schema/relay_classic_mutation.rb', line 129 def sig = super # Arguments were added at the root, but they should be nested sig[:arguments].clear sig[:arguments][:input] = { type: input_type, required: true, description: "Parameters for #{graphql_name}" } sig end |
.input_object_class(new_class = nil) ⇒ Class
The base class for generated input object types
112 113 114 115 116 117 |
# File 'lib/graphql/schema/relay_classic_mutation.rb', line 112 def input_object_class(new_class = nil) if new_class @input_object_class = new_class end @input_object_class || (superclass.respond_to?(:input_object_class) ? superclass.input_object_class : GraphQL::Schema::InputObject) end |
.input_type(new_input_type = nil) ⇒ Class
Returns The generated InputObject class for this mutation's input
.
121 122 123 124 125 126 |
# File 'lib/graphql/schema/relay_classic_mutation.rb', line 121 def input_type(new_input_type = nil) if new_input_type @input_type = new_input_type end @input_type ||= generate_input_type end |
Instance Method Details
#resolve_with_support(**inputs) ⇒ Object
Override GraphQL::Schema::Resolver#resolve_with_support to
delete client_mutation_id
from the kwargs.
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/graphql/schema/relay_classic_mutation.rb', line 31 def resolve_with_support(**inputs) # Without the interpreter, the inputs are unwrapped by an instrumenter. # But when using the interpreter, no instrumenters are applied. if context.interpreter? input = inputs[:input].to_kwargs new_extras = field ? field.extras : [] all_extras = self.class.extras + new_extras # Transfer these from the top-level hash to the # shortcutted `input:` object all_extras.each do |ext| # It's possible that the `extra` was not passed along by this point, # don't re-add it if it wasn't given here. if inputs.key?(ext) input[ext] = inputs[ext] end end else input = inputs end if input # This is handled by Relay::Mutation::Resolve, a bit hacky, but here we are. input_kwargs = input.to_h client_mutation_id = input_kwargs.delete(:client_mutation_id) else # Relay Classic Mutations with no `argument`s # don't require `input:` input_kwargs = {} end return_value = if input_kwargs.any? super(**input_kwargs) else super() end # Again, this is done by an instrumenter when using non-interpreter execution. if context.interpreter? context.schema.after_lazy(return_value) do |return_hash| # It might be an error if return_hash.is_a?(Hash) return_hash[:client_mutation_id] = client_mutation_id end return_hash end else return_value end end |