Samouczek schematu
Samouczek schematuLekcja 26: Filtrowanie danych z zewnętrznego API

Lekcja 26: Filtrowanie danych z zewnętrznego API

Jeśli zewnętrzne API nie pozwala na filtrowanie według określonej właściwości, której potrzebujemy, możemy użyć Gato GraphQL, aby iterować po wpisach w odpowiedzi API i usunąć te, które nie spełniają naszego warunku.

Odwołajmy się ponownie do endpointu REST API newapi.getpop.org/wp-json/wp/v2/users/?_fields=id,name,url, gdzie niektórzy użytkownicy mają pustą właściwość url:

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

Poniższe zapytanie GraphQL filtruje użytkowników, których właściwość url jest pusta, poprzez:

  • Pobranie danych z zewnętrznego API
  • Iterację po wpisach za pomocą @underEachArrayItem i umieszczenie każdego wpisu w zmiennej dynamicznej $userDataEntry
  • Wyodrębnienie właściwości url z każdego wpisu i umieszczenie tej wartości w zmiennej dynamicznej $websiteURL
  • Sprawdzenie, czy ta wartość jest pusta, i przypisanie wyniku do zmiennej dynamicznej $isWebsiteURLEmpty
  • Zastosowanie dyrektywy warunkowej @if, która — jeśli $isWebsiteURLEmpty ma wartość true — ustawia wartość tego wpisu jako null
  • Wykonanie dyrektywy @arrayFilter w celu odfiltrowania wszystkich wpisów 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
}

Odpowiedź to:

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