1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 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 82 83 84 85
|
# frozen_string_literal: true
module GraphQL
class Schema
# This base class accepts configuration for a mutation root field,
# then it can be hooked up to your mutation root object type.
#
# If you want to customize how this class generates types, in your base class,
# override the various `generate_*` methods.
#
# @see {GraphQL::Schema::RelayClassicMutation} for an extension of this class with some conventions built-in.
#
# @example Creating a comment
# # Define the mutation:
# class Mutations::CreateComment < GraphQL::Schema::Mutation
# argument :body, String, required: true
# argument :post_id, ID, required: true
#
# field :comment, Types::Comment, null: true
# field :errors, [String], null: false
#
# def resolve(body:, post_id:)
# post = Post.find(post_id)
# comment = post.comments.build(body: body, author: context[:current_user])
# if comment.save
# # Successful creation, return the created object with no errors
# {
# comment: comment,
# errors: [],
# }
# else
# # Failed save, return the errors to the client
# {
# comment: nil,
# errors: comment.errors.full_messages
# }
# end
# end
# end
#
# # Hook it up to your mutation:
# class Types::Mutation < GraphQL::Schema::Object
# field :create_comment, mutation: Mutations::CreateComment
# end
#
# # Call it from GraphQL:
# result = MySchema.execute <<-GRAPHQL
# mutation {
# createComment(postId: "1", body: "Nice Post!") {
# errors
# comment {
# body
# author {
# login
# }
# }
# }
# }
# GRAPHQL
#
class Mutation < GraphQL::Schema::Resolver
extend GraphQL::Schema::Member::HasFields
extend GraphQL::Schema::Resolver::HasPayloadType
class << self
def visible?(context)
true
end
private
def conflict_field_name_warning(field_defn)
"#{self.graphql_name}'s `field :#{field_defn.name}` conflicts with a built-in method, use `hash_key:` or `method:` to pick a different resolve behavior for this field (for example, `hash_key: :#{field_defn.resolver_method}_value`, and modify the return hash). Or use `method_conflict_warning: false` to suppress this warning."
end
# Override this to attach self as `mutation`
def generate_payload_type
payload_class = super
payload_class.mutation(self)
payload_class
end
end
end
end
end
|