Introdução
O que é o nestjs-rest-query e por que utilizá-lo.
nestjs-rest-query é uma biblioteca para NestJS que constrói instâncias de SelectQueryBuilder do TypeORM de forma dinâmica a partir de parâmetros de query HTTP — filtros, ordenações, paginação, seleção de campos e carregamento de relações — tudo controlado por uma whitelist de segurança por endpoint.
Fluxo principal
Rendering Mermaid diagram...
Cada endpoint declara sua própria whitelist via @ApiDynamicQuery (com OpenAPI) ou @DynamicQuery (sem). Em runtime, QueryBuilderService valida os parâmetros recebidos contra essa whitelist, aplica cada handler e devolve o resultado já paginado.
Funcionalidades
- Filtros dinâmicos — filtre por qualquer campo permitido usando operadores como
eq,like,in,between,isNulle mais - Ordenação — ordenação multi-coluna com
ASC/DESC, controlada por endpoint - Paginação — baseada em página ou limit/offset, com
page,perPage,totalelastPageno topo da resposta - Seleção de campos — retorne apenas as colunas que o cliente precisa
- Carregamento de relações — carregue relações TypeORM declaradas na sua whitelist
- Whitelist de segurança — os decorators
@ApiDynamicQuery/@DynamicQuerydefinem exatamente quais campos e operadores cada endpoint permite - Integração com Swagger —
@ApiDynamicQuerygera automaticamente decorators@ApiQuerypara todos os parâmetros de query suportados - Totalmente tipado — escrito em TypeScript, com definições de tipos completas
Como funciona
- Decore o método do seu controller com
@ApiDynamicQuery(rules)(ou@DynamicQuery(rules)) - Adicione
@QueryRules()como decorator de parâmetro para receber as regras em tempo de execução - Chame
queryBuilderService.execute(repo, query, rules)— a biblioteca aplica filtros, ordenações, paginação e relações, retornando os resultados com os dados de paginação no topo da resposta
@Get()
@ApiDynamicQuery({
filters: ['name', 'status', 'createdAt'],
sorts: ['name', 'createdAt'],
includes: ['company'],
})
findAll(
@Query() query: DynamicQueryDto,
@QueryRules() rules: RulesConfig,
) {
return this.queryBuilderService.execute(this.repo, query, rules);
}