💬

How to GraphQLを試す(Mutation)

2024/09/22に公開

前記事

この記事は、以下の続きです。
https://zenn.dev/tossy21/articles/b954107df8d544

Mutation

mutationでデータを追加、変更、削除を行います。

app/graphql/types/mutation_type.rbは自動で作成されています。

module Types
  class MutationType < Types::BaseObject
    # TODO: remove me
    field :test_field, String, null: false,
      description: "An example field added by the generator"
    def test_field
      "Hello World"
    end
  end
end

また、graphql_tutorial_schema.rbは、以下のようになっています。

class GraphqlTutorialSchema < GraphQL::Schema
  mutation(Types::MutationType)
  query(Types::QueryType)
end

引数付きリゾルバ

次に、createLinkのリゾルバを追加します。
app/graphql/mutations/base_mutation.rbは以下となっています。

module Mutations
  class BaseMutation < GraphQL::Schema::RelayClassicMutation
    argument_class Types::BaseArgument
    field_class Types::BaseField
    input_object_class Types::BaseInputObject
    object_class Types::BaseObject
  end
end

app/graphql/mutations/create_link.rbを作成します。

% touch app/graphql/mutations/create_link.rb
module Mutations
  class CreateLink < BaseMutation
    # arguments passed to the `resolve` method
    argument :description, String, required: true
    argument :url, String, required: true

    # return type from the mutation
    type Types::LinkType

    def resolve(description: nil, url: nil)
      Link.create!(
        description: description,
        url: url,
      )
    end
  end
end

app/graphql/types/mutation_type.rbを次のようにします。

module Types
  class MutationType < Types::BaseObject
    field :create_link, mutation: Mutations::CreateLink
  end
end

Playgroundでテスト

mutationを以下のように作成しました。

mutation{
  createLink(
    input: {
    url: "http://npmjs.com/package/graphql-tools",
    description: "Best tools!",
    }
  ){
    id
    url
    description
  }
}

応答は以下のように返ってきました。

{
  "data": {
    "createLink": {
      "id": "3",
      "url": "http://npmjs.com/package/graphql-tools",
      "description": "Best tools!"
    }
  }
}

続きは以下。
https://zenn.dev/tossy21/articles/d0bb29cb0fcd2b

GitHubで編集を提案

Discussion