🏃

GraphQL-Ruby でCRUD処理(後編)

2023/04/27に公開約5,300字

GraphQL-Ruby で CRUD 処理 前編 に引き続き、GraphQL-Ruby を使用して CRUD 処理を実装していきます。

今回は CRUD 処理の Create, Update, Delete に相当する mutation を実装していきます。

環境

  • Ruby 2.7.5
  • Rails 6.1.7
  • GraphQL-Ruby 1.11.6

マイクロポストを作成する Mutation の実装

マイクロポストを作成する Mutation を実装します。Mutation を実行するには以下の手順が必要になります。

  1. マイクロポストを作成する Mutation の作成
  2. Mutation の公開

1. マイクロポストを作成する Mutation の作成

app/graphql/mutations/create_micropost.rb を新規で作成します。

app/graphql/mutations/create_micropost.rb
module Mutations
  class CreateMicropost < BaseMutation
    argument :content, String, required: false

    field :micropost, Types::MicropostType, null: false

    def resolve(content: nil)
      {
        micropost:  Micropost.create!(
          content: content
        )
      }
    end
  end
end

引数(arugument)としては contect を受け取り、resolve の中でマイクロポストの作成を行います。
さらに戻り値としては micropost をレスポンスできるようにしています。

2. Mutation の公開

手順 1 で作成した Mutation を公開します。 app/graphql/types/mutation_type.rb を修正します。

app/graphql/types/mutation_type.rb
module Types
  class MutationType < Types::BaseObject
+   field :create_micropost, mutation: Mutations::CreateMicropost
  end
end

create_micropost field と手順 1 で作成した CreateMicropost Mutation を紐づけています。

実行する

http://localhost:3000/graphiql で実行結果を確認できます。

mutation CreateMicropost($CreateMicropostInput:CreateMicropostInput!) {
  createMicropost(input: $CreateMicropostInput){
    micropost {
      id
    	content
    }
  }
}

variable としては以下の json を設定します。

variable
{
  "CreateMicropostInput": {
  	"content": "サンプル3"
	}
}

実行すると作成した micropost がレスポンスされるはずです。

response
{
	"data": {
		"createMicropost": {
			"micropost": {
				"id": "3",
				"content": "サンプル3"
			}
		}
	}
}

マイクロポストを更新する Mutation の実装

マイクロポストを更新する Mutation を実装します。作成と同様に、Mutation を実行するには以下の手順が必要になります。

  1. マイクロポストを更新する Mutation の作成
  2. Mutation の公開

1. マイクロポストを更新する Mutation の作成

app/graphql/mutations/update_micropost.rb を新規で作成します。

app/graphql/mutations/update_micropost.rb
module Mutations
  class UpdateMicropost < BaseMutation
    argument :id, ID, required: true
    argument :content, String, required: false

    field :micropost, Types::MicropostType, null: false

    def resolve(id: nil, content: nil)
      micropost = Micropost.find(id)
      micropost.content = content if content != nil
      micropost.save!
      { micropost: micropost }
    end
  end
end

引数(argument)としては、更新するマイクロポストを選択するための id と、更新対象のカラムである content の値を受け取ります。
resolve の中では、取得した id を元に更新対象のマイクロポストを取得し、content の更新を行なっています。

2. Mutation の公開

手順 1 で作成した Mutation を公開します。 app/graphql/types/mutation_type.rb を修正します。

app/graphql/types/mutation_type.rb
module Types
  class MutationType < Types::BaseObject
    field :create_micropost, mutation: Mutations::CreateMicropost
+   field :update_micropost, mutation: Mutations::UpdateMicropost
  end
end

update_micropost field と手順 1 で作成した UpdateMicropost Mutation を紐づけています。

実行する

http://localhost:3000/graphiql で実行結果を確認できます。

mutation UpdateMicropost($UpdateMicropostInput:UpdateMicropostInput!) {
  updateMicropost(input: $UpdateMicropostInput){
    micropost {
      id
    	content
    }
  }
}

variable としては以下の json を設定します。

variable
{
  "UpdateMicropostInput": {
    "id": 3,
  	"content": "サンプル333"
	}
}

実行すると更新した micropost がレスポンスされるはずです。

response
{
  "data": {
    "updateMicropost": {
      "micropost": {
        "id": "3",
        "content": "サンプル333"
      }
    }
  }
}

マイクロポストを削除する Mutation の実装

マイクロポストを削除する Mutation を実装します。作成と同様に、Mutation を実行するには以下の手順が必要になります。

  1. マイクロポストを削除する Mutation の作成
  2. Mutation の公開

1. マイクロポストを削除する Mutation の作成

app/graphql/mutations/delete_micropost.rb を新規で作成します。

app/graphql/mutations/delete_micropost.rb
module Mutations
  class DeleteMicropost < BaseMutation
    argument :id, ID, required: true

    field :id, ID, null: false

    def resolve(id: nil)
      Micropost.find(id).destroy
      { id: id }
    end
  end
end

2. Mutation の公開

手順 1 で作成した Mutation を公開します。 app/graphql/types/mutation_type.rb を修正します。

app/graphql/types/mutation_type.rb
module Types
  class MutationType < Types::BaseObject
    field :create_micropost, mutation: Mutations::CreateMicropost
    field :update_micropost, mutation: Mutations::UpdateMicropost
+   field :delete_micropost, mutation: Mutations::DeleteMicropost
  end
end

delete_micropost field と手順 1 で作成した DeleteMicropost Mutation を紐づけています。

実行する

http://localhost:3000/graphiql で実行結果を確認できます。

mutation DeleteMicropost($DeleteMicropostInput:DeleteMicropostInput!) {
  deleteMicropost(input: $DeleteMicropostInput){
    id
  }
}

variable としては以下の json を設定します。

variable
{
  "DeleteMicropostInput": {
    "id": 3
	}
}

実行すると削除した micropost がの ID がレスポンスされるはずです。

response
{
  "data": {
    "deleteMicropost": {
      "id": "3"
    }
  }
}

最後に

今回は GraphQL-Ruby で CRUD 処理を実装してみました。
Rails で思ったよりもサクッと GraphQL の API サーバーを作ることができ、今後も利用していきたいと思っています。

参考

Building a GraphQL Server with Ruby Backend Tutorial | Intro

Discussion

ログインするとコメントできます