Tutorial do schema
Tutorial do schemaLição 26: Filtrando dados de uma API externa

Lição 26: Filtrando dados de uma API externa

Se a API externa não permite filtrar por uma determinada propriedade que precisamos, podemos usar o Gato GraphQL para iterar sobre as entradas na resposta da API e remover aquelas que não satisfazem nossa condição.

Vamos nos referir novamente ao endpoint da REST API newapi.getpop.org/wp-json/wp/v2/users/?_fields=id,name,url, onde alguns usuários têm a propriedade url vazia:

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

A query GraphQL abaixo filtra os usuários cuja propriedade url está vazia, através de:

  • Recuperação de dados da API externa
  • Iteração sobre as entradas via @underEachArrayItem, e posicionamento de cada entrada na variável dinâmica $userDataEntry
  • Extração da propriedade url de cada entrada, e posicionamento desse valor na variável dinâmica $websiteURL
  • Verificação se esse valor está vazio, e atribuição do resultado na variável dinâmica $isWebsiteURLEmpty
  • Aplicação da diretiva condicional @if que, se $isWebsiteURLEmpty for true, define o valor dessa entrada como null
  • Execução da diretiva @arrayFilter para filtrar todas as 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
}

A resposta é:

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