Tutorial dello schema
Tutorial dello schemaLezione 26: Filtrare dati da un'API esterna

Lezione 26: Filtrare dati da un'API esterna

Se l'API esterna non consente di filtrare per una determinata proprietà di cui abbiamo bisogno, possiamo usare Gato GraphQL per iterare sulle voci della risposta dell'API e rimuovere quelle che non soddisfano la nostra condizione.

Riferiamoci nuovamente all'endpoint della REST API newapi.getpop.org/wp-json/wp/v2/users/?_fields=id,name,url, dove alcuni utenti hanno la proprietà url vuota:

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

La query GraphQL seguente filtra gli utenti la cui proprietà url è vuota, mediante:

  • Il recupero dei dati dall'API esterna
  • L'iterazione sulle voci tramite @underEachArrayItem, e il posizionamento di ciascuna voce nella variabile dinamica $userDataEntry
  • L'estrazione della proprietà url da ciascuna voce, e il posizionamento di tale valore nella variabile dinamica $websiteURL
  • La verifica se questo valore è vuoto, e l'assegnazione del risultato nella variabile dinamica $isWebsiteURLEmpty
  • L'applicazione della direttiva condizionale @if che, se $isWebsiteURLEmpty è true, imposta il valore di quella voce come null
  • L'esecuzione della direttiva @arrayFilter per filtrare tutte le voci 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
}

La risposta è:

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