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.