Começando uma API para Self-Service BI (Parte 2)




Como agora tinham requisições com estruturas diferentes sendo direcionadas para o Sequelize e mongoose, que trabalham de forma distinta, a solução foi criar um objeto que padronizasse a consulta.

GetHandler é um middleware que inicia o objeto através de SetHandler, que verifica e valida os argumentos enviados. Depois redireciona para outros que vão tratar as individualidades de cada requisição, mas utilizando os mesmos métodos, com poucas exceções.

O middleware para as consultas GraphQL:

Para montar o objeto usei Method Chaining, que permite chamar múltiplos métodos em sequência, sem precisar armazenar os resultados intermediários em variáveis.

Lookup mapeia e cria a estrutura necessária para o populate da biblioteca mongoose, função que substitui caminhos (IDs) em um documento por documentos reais vindos de outra coleção.
Não funciona atualmente com os bancos de dados SQL.

Fields consolida um dos grandes poderes do GraphQL: acabar com over-fetching e under-fetching. Ele seleciona os campos solicitados na consulta manipulando a àrvore JSON simples e legível gerada pelo parseResolveInfo da biblioteca graphql-parse-resolve-info, após transformar o argumento info. Ele é o quarto argumento de um resolver e contém a árvore sintática abstrata (AST) da consulta e informações sobre o estado da execução, sendo extremamente denso e complexo.

Lookup e Fields vão até certo nível de aninhamento, pois não é recomendado passar 3 ou 4 níveis de profundidade.

Nosql define os filtros e parâmetros que serão usados por find e sort na busca com mongoose. Também tem o Sql que é semelhante, mas para o findAll do Sequelize.

External é para consultas específicas que requisitam dados a APIs externas. Fiz um middleware exclusivo para essas buscas, como mostro no meu projeto de estudo spotifEx, onde enriqueço dados através de requisições na Web API do Spotify for Developers.

Build finaliza o objeto e devolve ao controller, que aciona o service, e ao receber os dados, retorna o response.

O exemplo de um objeto:

Como o título diz, é só o começo! Tem muito mais a ser explorado.

Depois de ingressar nesse mundo das "requests", descobri coisas interessantes sendo feitas com APIs para grandes volumes de dados, como cube.dev e GraphQL and Apache Arrow.

Estou tendo novas descobertas e espero trazer mais coisas em breve aqui.

E você, o que achou? Como faria?
Obrigado pela leitura.