スキーマ型ディレクティブの扱い方
Gato GraphQLはcode-firstサーバーです。つまり、コードを使用してスキーマを開発します。(これに対するアプローチとして、SDL-firstがあります。これはSchema Definition Languageを使用してまずスキーマを生成し、その後サービスを開発します。)
SDLを持たないcode-firstサーバーは、スキーマ型ディレクティブを自然な形でサポートすることができません。この制限を回避するために、Gato GraphQLは以下のメカニズムを開発しました:
- クエリをリクエストされた形式から実行可能な形式へ変換する
- 実行可能なクエリにIFTTTルールを適用する
これにより、GraphQLサーバー上でスキーマ型ディレクティブを完全にサポートすることが実現されます。
なぜ機能するのか?
@deprecatedはスキーマ型ディレクティブであるため、スキーマに対して適用される必要があります。しかし、もし一時的にそれがクエリ型ディレクティブであると仮定し、クエリ内のあるフィールドに直接@deprecatedを追加したとしたら、どうなるでしょうか?
例えば、次のクエリを実行した場合:
query {
posts {
id
title
content @deprecated(reason: "Use newContent instead")
}
}実は、これでも機能します!なぜなら、結局のところ、ディレクティブとはフィールドに対して実行される機能に過ぎないからです。その機能をスキーマを通じて宣言しても、クエリ内で直接宣言しても、機能の動作に違いはありません。
ただし、機能するとはいえ、意味をなしません。クライアントに@deprecatedをクエリに追加するよう強制することはできません。これはクライアント側ではなく、サーバー側のアプリケーションが決定する機能です。
しかし、機能そのものは依然として動作します。したがって、ディレクティブをスキーマに追加するかクエリに追加するかは、機能的な観点からは重要ではありません。さらに、すべてのディレクティブは最終的にクエリ内に存在することになります。クエリこそが実行される場所だからです。
したがって、サーバーにSDLがなくても、ランタイム時にディレクティブをクエリに組み込むことができます。