ブログ

🎉 Gato GraphQL v0.7リリース — mutationとnested mutationのサポートを追加!

Leonardo Losoviz
著者: Leonardo Losoviz ·

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

Mutationは素晴らしい!

新しく追加された機能のツアーをご紹介します。

1. Mutations! 🚀

GraphQL mutations は、クエリを通じてデータを変更(つまり副作用を実行)することを可能にします。

Mutationは、Gato GraphQLにまだ欠けていた重要な機能でした。これが追加されたことで、このGraphQLサーバーはほぼ機能完全と言えます(subscriptionsだけが残っていますが、追加方法についてはすでに検討中です)。

インタラクティブなスキーマのMutation root

コメントを追加する例を見てみましょう。ただし、まずログインするための別の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つの動作をサポートしています:

  1. 標準的なGraphQLの動作(つまり、root typeにmutationフィールドを追加する)、デフォルト
  2. 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 EndpointsPersisted Queriesのスキーマをカスタマイズするために使用されます:

Schema configurationのMutation scheme

これにより、nested mutationsをすべての場所で無効にしつつ、自社アプリケーションだけが使用する特定のcustom endpointでのみ有効にすることができます。 💪

root typeから冗長なフィールドを削除する

Nested mutationsを使用すると、mutationフィールドがスキーマに2回追加される場合があります:

  • root typeの下に一度
  • 特定の型の下に一度

たとえば、以下のフィールドは互いの「重複」とみなせます:

  • Root.updatePost
  • Post.update

Gato GraphQLでは、両方を保持するか、root typeの冗長なものを削除するかを選択できます。

以下の3つのスキーマがあります:

  1. 標準的な動作:
    クエリの処理に QueryRoot 型を、mutationの処理に MutationRoot 型を使用します
  2. 重複したmutationフィールドを保持するnested mutations:
    単一の Root 型がクエリとmutationを処理し、この型の冗長なmutationフィールドは保持されます
  3. root typeから冗長なmutationフィールドを削除するnested mutations:
    上記と同様ですが、Root 型からすべての冗長なmutationフィールドを削除します

✱ ちなみに1、これら3つのスキーマはすべて同じエンドポイントを使用していますが、URLパラメーター ?mutation_schemestandardnestedlean_nested に変更することで切り替えられます。これはGraphQLサーバーがcode-firstアプローチに従っているため可能です。 🤟

✱ ちなみに2、これらのオプションはSchema configuration(上記に表示)の「Mutation Scheme」セクションで選択できます。したがって、個別のcustom endpointsやpersisted queriesに適用する動作も決定できます。 👏


さあ、v0.8の準備を始める時です! 🙏


ニュースレターを購読する

Gato GraphQL のすべてのアップデートを把握しましょう。