Paginação com Nest.js e Prisma-Pagination: simplificando a implementação
Neste artigo, exploraremos uma maneira simples e direta de realizar a paginação de dados em um aplicativo Nest.js usando a biblioteca Prisma-Pagination. Presumimos que você já configurou a estrutura básica do seu aplicativo Nest.js e nos concentraremos apenas na implementação da paginação.
Configuração inicial
Antes de configurar qualquer biblioteca, vamos adicionar alguns elementos essenciais à nossa aplicação.
Adicionando DTO de paginação dinâmica (objeto de transferência de dados)
export class PaginatedOutputDto<T> {
data: T[];
meta: {
total: number;
lastPage: number;
currentPage: number;
perPage: number;
prev: number | null;
next: number | null;
};
}
Este DTO será usado para digitar os dados entre as camadas da nossa aplicação. Ele segue o modelo de paginação prisma, mas foi projetado internamente para evitar dependências de bibliotecas externas. O parâmetro T representa o tipo de saída do seu módulo.
Adicionando Decorador de Paginação
import { Type, applyDecorators } from '@nestjs/common';
import { ApiExtraModels, ApiOkResponse, getSchemaPath } from '@nestjs/swagger';
export const ApiPaginatedResponse = <TModel extends Type<any>>(
model: TModel,
) => {
return applyDecorators(
ApiExtraModels(model),
ApiOkResponse({
schema: {
title: `PaginatedResponseOf${model.name}`,
allOf: [
{
properties: {
data: {
type: 'array',
items: { $ref: getSchemaPath(model) },
},
},
},
{
properties: {
meta: {
type: 'object',
properties: {
total: { type: 'number' },
lastPage: { type: 'number' },
currentPage: { type: 'number' },
perPage: { type: 'number' },
prev: { type: 'number' },
next: { type: 'number' },
},
},
},
},
],
},
}),
);
};
Este decorador é essencial para que o Swagger consiga identificar a saída de seus métodos. Também recebe o parâmetro TModel, que representa o tipo de saída do seu módulo.
Implementando Paginação
Agora que configuramos nossos DTOs e decoradores, vamos implementar a paginação em um endpoint de nossa aplicação.
Instale a biblioteca “prisma-paginate”
npm i prisma-pagination
import { Controller, Get, Query } from '@nestjs/common';
import { PrismaService } from './prisma.service'; // Substitua pelo seu serviço Prisma
import { PaginatedOutputDto } from './paginated-output.dto'; // Importe o DTO de paginação
import { ApiPaginatedResponse } from './api-paginated-response.decorator'; // Importe o decorator de paginação
import { createPaginator } from 'prisma-pagination';
@Controller('categories')
export class CategoriesController {
constructor(private readonly prismaService: PrismaService) {}
@Get()
@ApiPaginatedResponse(CategoryDto) // Substitua CategoryDto pelo seu DTO de saída
async findAll(
@Query('page') page: number = 1,
@Query('perPage') perPage: number = 10,
): Promise<PaginatedOutputDto<CategoryDto>> {
const paginate = createPaginator({ perPage });
return paginate<CategoryDto, Prisma.CategoriesFindManyArgs>(
this.prismaCategories,
{
where: {},
orderBy: {
id: 'desc',
},
},
{
page,
},
);
}
}
Neste exemplo, criamos um endpoint findAll que suporta paginação usando parâmetros page e perPage. O decorador ApiPaginatedResponse ajuda o Swagger a entender a saída paginada. Certifique-se de substituir CategoryDto pelo seu DTO de saída e PrismaService pelo seu serviço Prisma.
Conclusão
Implementar a paginação em um aplicativo Nest.js com Prisma-Pagination é uma tarefa simples quando você usa DTOs dinâmicos e decoradores apropriados. Isso torna sua API mais legível e fácil de documentar com o Swagger. Aproveite essa abordagem para criar APIs escalonáveis e fáceis de usar.
link do repositório com uma implementação: https://github.com/daviaquino87/prisma-paginate
link do artigo na medium https://blog.stackademic.com/pagination-with-nest-js-and-prisma-pagination-simplifying-the-implementation-ba6ad7a38338