Разбивка на страницы с помощью Nest.js и Prisma-Pagination: упрощение реализации

В этой статье мы рассмотрим простой и понятный способ разбивки данных на страницы в приложении Nest.js с использованием библиотеки Prisma-Pagination. Мы предполагаем, что вы уже настроили базовую структуру своего приложения Nest.js, и мы просто сосредоточимся на реализации нумерации страниц.

Первоначальная настройка

Прежде чем настраивать какие-либо библиотеки, давайте добавим в наше приложение некоторые важные элементы.

Добавление DTO динамической пагинации (объект передачи данных)

export class PaginatedOutputDto<T> {
  data: T[];
  meta: {
    total: number;
    lastPage: number;
    currentPage: number;
    perPage: number;
    prev: number | null;
    next: number | null;
  };
}

Этот DTO будет использоваться для ввода данных между уровнями нашего приложения. Он следует модели призматической нумерации страниц, но разработан собственными силами, чтобы избежать зависимости от внешних библиотек. Параметр T представляет тип вывода вашего модуля.

Добавление декоратора нумерации страниц

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' },
                },
              },
            },
          },
        ],
      },
    }),
  );
};

Этот декоратор необходим для того, чтобы Swagger мог идентифицировать выходные данные своих методов. Он также получает параметрTMode, который представляет тип вывода вашего модуля.

Реализация нумерации страниц

Теперь, когда мы настроили DTO и декораторы, давайте реализуем нумерацию страниц в конечной точке нашего приложения.

Установите библиотеку 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,
      },
    );
  }
}

В этом примере мы создаем конечную точку findAll, которая поддерживает нумерацию страниц с использованием page и perPage. параметры. Декоратор ApiPaginatedResponse помогает Swagger понимать постраничный вывод. Обязательно замените CategoryDto выходным DTO и PrismaService своим сервисом Prisma.

Заключение

Реализация нумерации страниц в приложении Nest.js с помощью Prisma-Pagination — простая задача, если вы используете динамические DTO и соответствующие декораторы. Это делает ваш API более читабельным и упрощает документирование с помощью Swagger. Используйте этот подход для создания масштабируемых и удобных для конечного пользователя API.

ссылка на репозиторий с реализацией:
https://github.com/daviaquino87/prisma-paginate

Спасибо, что дочитали до конца. Пожалуйста, подумайте о том, чтобы подписаться на автора и эту публикацию. Посетите Stackademic, чтобы узнать больше о том, как мы демократизируем бесплатное образование в области программирования во всем мире.