Tutorial skema
Tutorial skemaPelajaran 26: Memfilter data dari API eksternal

Pelajaran 26: Memfilter data dari API eksternal

Jika API eksternal tidak mengizinkan pemfilteran berdasarkan properti tertentu yang kita butuhkan, kita dapat menggunakan Gato GraphQL untuk mengiterasi entri dalam respons API dan menghapus entri yang tidak memenuhi kondisi kita.

Mari kita merujuk kembali ke endpoint REST API newapi.getpop.org/wp-json/wp/v2/users/?_fields=id,name,url, di mana beberapa pengguna memiliki properti url yang kosong:

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

Query GraphQL di bawah ini memfilter pengguna yang properti url-nya kosong, dengan cara:

  • Mengambil data dari API eksternal
  • Mengiterasi entri melalui @underEachArrayItem, dan menempatkan setiap entri di bawah variabel dinamis $userDataEntry
  • Mengekstrak properti url dari setiap entri, dan menempatkan nilai tersebut di bawah variabel dinamis $websiteURL
  • Memeriksa apakah nilai tersebut kosong, dan menetapkan hasilnya di bawah variabel dinamis $isWebsiteURLEmpty
  • Menerapkan direktif kondisional @if yang, jika $isWebsiteURLEmpty bernilai true, menetapkan nilai entri tersebut sebagai null
  • Menjalankan direktif @arrayFilter untuk memfilter semua entri 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
}

Responsnya adalah:

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