Tutoriel du schéma
Tutoriel du schémaLeçon 26 : Filtrer des données depuis une API externe

Leçon 26 : Filtrer des données depuis une API externe

Si l'API externe ne permet pas de filtrer par une certaine propriété dont nous avons besoin, nous pouvons utiliser Gato GraphQL pour itérer sur les entrées de la réponse de l'API et supprimer celles qui ne satisfont pas notre condition.

Référons-nous à nouveau à l'endpoint de la REST API newapi.getpop.org/wp-json/wp/v2/users/?_fields=id,name,url, où certains utilisateurs ont la propriété url vide :

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

La requête GraphQL ci-dessous filtre les utilisateurs dont la propriété url est vide, en :

  • Récupérant les données depuis l'API externe
  • Itérant sur les entrées via @underEachArrayItem, et plaçant chaque entrée sous la variable dynamique $userDataEntry
  • Extrayant la propriété url de chaque entrée, et plaçant cette valeur sous la variable dynamique $websiteURL
  • Vérifiant si cette valeur est vide, et assignant le résultat sous la variable dynamique $isWebsiteURLEmpty
  • Appliquant la directive conditionnelle @if qui, si $isWebsiteURLEmpty est true, définit la valeur de cette entrée comme null
  • Exécutant la directive @arrayFilter pour filtrer toutes les entrées 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 réponse est :

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