Tutorial del esquema
Tutorial del esquemaLección 26: Filtrar datos de una API externa

Lección 26: Filtrar datos de una API externa

Si la API externa no permite filtrar por una propiedad determinada que necesitamos, podemos usar Gato GraphQL para iterar sobre las entradas de la respuesta de la API y eliminar las que no cumplan con nuestra condición.

Volvamos a referirnos al endpoint de la REST API newapi.getpop.org/wp-json/wp/v2/users/?_fields=id,name,url, donde algunos usuarios tienen la propiedad url vacía:

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

La consulta GraphQL de abajo filtra los usuarios cuyo url está vacío:

  • Obteniendo los datos de la API externa
  • Iterando sobre las entradas mediante @underEachArrayItem y colocando cada entrada bajo la variable dinámica $userDataEntry
  • Extrayendo la propiedad url de cada entrada y colocando ese valor bajo la variable dinámica $websiteURL
  • Comprobando si ese valor está vacío y asignando el resultado a la variable dinámica $isWebsiteURLEmpty
  • Aplicando la directiva condicional @if que, si $isWebsiteURLEmpty es true, establece el valor de esa entrada como null
  • Ejecutando la directiva @arrayFilter para filtrar todas las entradas 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 respuesta es:

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