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::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?, complexity, 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, #argument_with_loads, #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
96 97 98 99 100 101 102 |
# File 'lib/graphql/schema/relay_classic_mutation.rb', line 96 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
79 80 81 82 83 84 |
# File 'lib/graphql/schema/relay_classic_mutation.rb', line 79 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
88 89 90 91 92 93 |
# File 'lib/graphql/schema/relay_classic_mutation.rb', line 88 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 |
# 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_h # Transfer these from the top-level hash to the # shortcutted `input:` object self.class.extras.each do |ext| input[ext] = inputs[ext] 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 |