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 Member::GraphQLTypeNames
Member::GraphQLTypeNames::Boolean, Member::GraphQLTypeNames::ID, Member::GraphQLTypeNames::Int
Instance Attribute Summary
Attributes inherited from Resolver
Class Method Summary collapse
-
.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 GraphQL::Schema::Resolver::HasPayloadType
#field_class, #object_class, #payload_type
Methods included from Member::HasFields
#add_field, #field, #field_class, #fields, #get_field, #global_id_field, #own_fields
Methods inherited from Resolver
argument, arguments_loads_as_type, #authorized?, broadcastable, broadcastable?, complexity, extension, extensions, extras, #initialize, null, #ready?, #resolve, resolve_method, type, type_expr
Methods included from Member::HasPath
Methods included from Member::HasArguments
#add_argument, #argument, #argument_class, #arguments, #arguments_statically_coercible?, #coerce_arguments, #own_arguments
Methods included from Member::BaseDSLMethods
#accessible?, #authorized?, #default_graphql_name, #description, #graphql_name, #introspection, #introspection?, #mutation, #name, #overridden_graphql_name, #to_graphql, #visible?
Constructor Details
This class inherits a constructor from GraphQL::Schema::Resolver
Class Method Details
.field_options ⇒ Object
Extend Schema::Mutation.field_options to add the input
argument
104 105 106 107 108 109 110 |
# File 'lib/graphql/schema/relay_classic_mutation.rb', line 104 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 } sig end |
.input_object_class(new_class = nil) ⇒ Class
The base class for generated input object types
87 88 89 90 91 92 |
# File 'lib/graphql/schema/relay_classic_mutation.rb', line 87 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
.
96 97 98 99 100 101 |
# File 'lib/graphql/schema/relay_classic_mutation.rb', line 96 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 |