🎉 Gato GraphQL v0.7リリース — mutationとnested mutationのサポートを追加!
Gato GraphQL のバージョン0.7がリリースされました。mutationとnested mutationをサポートしています! 🎉

新しく追加された機能のツアーをご紹介します。
1. Mutations! 🚀
GraphQL mutations は、クエリを通じてデータを変更(つまり副作用を実行)することを可能にします。
Mutationは、Gato GraphQLにまだ欠けていた重要な機能でした。これが追加されたことで、このGraphQLサーバーはほぼ機能完全と言えます(subscriptionsだけが残っていますが、追加方法についてはすでに検討中です)。

コメントを追加する例を見てみましょう。ただし、まずログインするための別のmutationを実行する必要があります。コメントを追加できるようにするためです。以下のGraphiQLクライアントで「Run」ボタンを押して、事前に作成されたテストユーザーでmutationフィールド loginUser を実行してください:
mutation LogUserIn {
loginUser(
by: { credentials: { usernameOrEmail: "test", password: "pass" } }
) {
id
name
}
}では、コメントを追加しましょう。以下のRunボタンを押して、mutationフィールド addCommentToCustomPost を実行し、投稿にコメントを追加してください(コメントのテキストも編集できます):
mutation AddComment {
addCommentToCustomPost(
input: { customPostID: 1459, comment: "Adding a comment: bla bla bla" }
) {
id
content
date
}
}この最初のリリースでは、プラグインに以下のmutationが含まれています:
✅ createPost
✅ updatePost
✅ setFeaturedImageforCustomPost
✅ removeFeaturedImageforCustomPost
✅ addCommentToCustomPost
✅ replyComment
✅ loginUser
✅ logoutUser
2. Nested Mutations! 🚀🚀
Nested mutationsとは、GraphQLのroot type以外の型に対してmutationを実行できる機能です。
これらはGraphQL specに追加が要求されていますが、まだ承認されていません(おそらく永遠に承認されないかもしれません)。そのため、Gato GraphQLはNested Mutationsモジュールを通じて、オプトイン機能としてサポートを追加しています。
プラグインは以下の2つの動作をサポートしています:
- 標準的なGraphQLの動作(つまり、root typeにmutationフィールドを追加する)、デフォルト
- Nested mutations、オプトインとして
たとえば、上記のクエリは以下のクエリでも実行できます。このクエリでは、まず Root.post で投稿を取得し、その後 Post.addComment でコメントを追加します:
mutation AddComment {
post(by: { id: 1459 }) {
addComment(
input: {
comment: "Notice how field `addCommentToCustomPost` under the `Root` type is renamed as `addComment` under the `Post` type? The schema got neater!"
}
) {
id
content
date
}
}
}Mutationは、別のmutationの結果に対してもデータを変更できます。以下のクエリでは、まず Root.post で投稿を取得し、次にそれに対して mutation Post.addComment を実行して作成されたコメントオブジェクトを取得し、最後にそのコメントに対して mutation Comment.reply を実行します:
mutation AddCommentAndResponse {
post(by: { id: 1459 }) {
id
title
addComment(input: { comment: "Isn't this awesome?" }) {
id
date
content
reply(input: { comment: "I think so!" }) {
id
date
content
}
}
}
}これは本当に便利です! 😍 (同じ動作を単一のクエリで実現する代替方法は @export ディレクティブを使う方法です……今後のブログ記事で両者を比較する予定です)。
この最初のリリースでは、プラグインに以下のmutationが含まれています:
✅ CustomPost.update
✅ CustomPost.setFeaturedImage
✅ CustomPost.removeFeaturedImage
✅ CustomPost.addComment
✅ Comment.reply
標準またはnested?それとも両方?
自社アプリケーションで使用するGraphQL APIがあり、それがクライアントにも公開されているとします。Nested mutationsを有効にしたいが、非標準機能であるためクライアントには適用したくないというケースもあるでしょう。
朗報です:それが可能です。
Schema Configurationに「Mutation Scheme」セクションを追加しました。このセクションは、Custom EndpointsやPersisted Queriesのスキーマをカスタマイズするために使用されます:

これにより、nested mutationsをすべての場所で無効にしつつ、自社アプリケーションだけが使用する特定のcustom endpointでのみ有効にすることができます。 💪
root typeから冗長なフィールドを削除する
Nested mutationsを使用すると、mutationフィールドがスキーマに2回追加される場合があります:
- root typeの下に一度
- 特定の型の下に一度
たとえば、以下のフィールドは互いの「重複」とみなせます:
Root.updatePostPost.update
Gato GraphQLでは、両方を保持するか、root typeの冗長なものを削除するかを選択できます。
以下の3つのスキーマがあります:
- 標準的な動作:
クエリの処理にQueryRoot型を、mutationの処理にMutationRoot型を使用します - 重複したmutationフィールドを保持するnested mutations:
単一のRoot型がクエリとmutationを処理し、この型の冗長なmutationフィールドは保持されます - root typeから冗長なmutationフィールドを削除するnested mutations:
上記と同様ですが、Root型からすべての冗長なmutationフィールドを削除します
✱ ちなみに1、これら3つのスキーマはすべて同じエンドポイントを使用していますが、URLパラメーター ?mutation_scheme を standard、nested、lean_nested に変更することで切り替えられます。これはGraphQLサーバーがcode-firstアプローチに従っているため可能です。 🤟
✱ ちなみに2、これらのオプションはSchema configuration(上記に表示)の「Mutation Scheme」セクションで選択できます。したがって、個別のcustom endpointsやpersisted queriesに適用する動作も決定できます。 👏
さあ、v0.8の準備を始める時です! 🙏