【GraphQL】何らかの条件で何らかを集めてくるフィールドの設計、どうする?

何を言っているかわからないと思うけど、例えば「1週間以内に新規登録したユーザー一覧を返す」みたいなフィールドをどう設計するかという話。いくつかパターンがありそう。

1. 専用のフィールドを用意する

query {
  recentlyRegisteredUsers: [User!]!
}

クライアントからはこのフィールド呼べばいいだけなので楽。ただし、新たに「最近更新があったユーザー一覧を返したい」のような要望がでてきたら、似たようなフィールドが無尽蔵に増えていく可能性がある。

2. 全部返すフィールドを特定の条件でフィルタできるようにする

query {
  users(
    filter: UserFilter
  ): [User!]!
}

enum UserFilter {
    "1週間以内に新規登録したユーザー"
    RECENTLY_REGISTERED
}

1 よりはフィールドの治安は保たれそうだけど、代わりにフィルタ条件が増えていくことになる。

3. 検索用のフィールドを用意する

query {
  searchUser(
    registeredSince: DateTime,
    registeredUntil: DateTime
  ): [User!]!
}

2 と似てるけど、クライアント側から検索条件を指定するタイプ。シンプルな検索条件ならこれでいいけど、複雑になってくるとクライアント側からのクエリが大変なことになりそうだし、検索条件のオプションも増えまくって大変になりそう。

4. queryString で検索できるようにする

query {
  searchUser(
    query: String
  ): [User!]!
}

クエリ文字列でなんでも検索する方式。こちらもシンプルな検索条件ならいいけど、複雑になってくるとクエリを組み立てるのが大変になりそう。queryString をパースする必要があるのでバックエンドの実装は他の案と比べて複雑になるかも。

結局どれがいい?

以下のような方針が良い気がしている。

  • 検索条件がシンプルなら、検索用フィールドから検索できるようにする

    今回の例なら、ユーザーの登録時期で検索とかは汎用的な要件なのでこちらがいいのかも?

  • 検索条件が複雑なら、専用のフィールドを用意する

    例えば「1ヶ月以内に登録して、なおかつ1週間以内に5回以上更新があったプレミアム登録済みのユーザー一覧」みたいな条件だと特殊な要件すぎるのでこちらがいいのかも?

他に何かオススメあったら教えてください!