スキーマチュートリアル
スキーマチュートリアルレッスン26:外部APIからのデータのフィルタリング

レッスン26:外部APIからのデータのフィルタリング

外部APIが必要なプロパティによるフィルタリングを許可していない場合、Gato GraphQLを使用してAPIレスポンスのエントリを反復処理し、条件を満たさないものを除外することができます。

REST APIエンドポイント newapi.getpop.org/wp-json/wp/v2/users/?_fields=id,name,url を再度参照します。このエンドポイントでは、一部のユーザーの url プロパティが空になっています:

[
  {
    "id": 1,
    "name": "leo",
    "url": "https://leoloso.com"
  },
  {
    "id": 7,
    "name": "Test",
    "url": ""
  },
  {
    "id": 2,
    "name": "Theme Demos",
    "url": ""
  }
]

以下のGraphQLクエリは、url プロパティが空のユーザーをフィルタリングして除外します。その処理手順は次のとおりです:

  • 外部APIからデータを取得する
  • @underEachArrayItem を使用してエントリを反復処理し、各エントリをダイナミック変数 $userDataEntry に格納する
  • 各エントリから url プロパティを取り出し、その値をダイナミック変数 $websiteURL に格納する
  • この値が空かどうかを確認し、結果をダイナミック変数 $isWebsiteURLEmpty に代入する
  • 条件ディレクティブ @if を適用し、$isWebsiteURLEmptytrue の場合にそのエントリの値を null に設定する
  • ディレクティブ @arrayFilter を実行してすべての null エントリを除外する
query {
  usersWithWebsiteURL: _sendJSONObjectCollectionHTTPRequest(
    input: {
      url: "https://newapi.getpop.org/wp-json/wp/v2/users/?_fields=id,name,url"
    }
  )
    # Remove users without a website URL
    @underEachArrayItem(
      passValueOnwardsAs: "userDataEntry"
      affectDirectivesUnderPos: [1, 2, 3]
    )
      @applyField(
        name: "_objectProperty"
        arguments: {
          object: $userDataEntry
          by: {
            key: "url"
          }
        }
        passOnwardsAs: "websiteURL"
      )
      @applyField(
        name: "_isEmpty"
        arguments: {
          value: $websiteURL
        }
        passOnwardsAs: "isWebsiteURLEmpty"
      )
      @if(
        condition: $isWebsiteURLEmpty
      )
        @setNull
    @arrayFilter
}

レスポンスは次のとおりです:

{
  "data": {
    "usersWithWebsiteURL": [
      {
        "id": 1,
        "name": "leo",
        "url": "https://leoloso.com"
      }
    ]
  }
}