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