Skip to content

πŸ“¦ DTOs and Pagination ​

The DTOs are intended for app-level controllers. They include Swagger metadata and class-validator/class-transformer decorators where runtime validation is meaningful.

πŸ“„ PageOptionsDTO ​

PageOptionsDTO defaults to page = 1 and perPage = 10. Both values are transformed to numbers and validated as integers.

ts
import { ValidationPipe } from '@nestjs/common';

app.useGlobalPipes(
  new ValidationPipe({
    transform: true,
    whitelist: true,
  }),
);
ts
import { QueryDTO } from '@querry-kit/nest-prisma-query';

@Get()
async query(@Query() query: QueryDTO<ProjectTypeMap>) {
  const { items, pageMeta } = await this.projectsService.query(query);
  return new PaginatedDTO(items.map(ProjectDTO.fromModel), pageMeta);
}

The supported pagination range is:

ts
page >= 1
perPage >= 1
perPage <= 1000

🧾 Query DTOs ​

Use the DTO matching the service method:

ts
FindOneDTO<ProjectTypeMap>
FindManyDTO<ProjectTypeMap>
FindByIdDTO<ProjectTypeMap>
FindUniqueDTO<ProjectTypeMap>
AggregateDTO<ProjectTypeMap>
CountDTO<ProjectTypeMap>
QueryDTO<ProjectTypeMap>

QueryDTO and FindByIdDTO expose fields?: string for controller-level integration with @querry-kit/nest-fields-query. This package does not derive select or include from fields.

πŸ“¬ Response Shape ​

QueryService.query returns a service-level shape:

ts
type Paginated<Project> = {
  items: Project[];
  itemCount: number;
  pageMeta: PageMetaDTO;
};

Controllers usually convert it to the public DTO shape:

ts
const { items, pageMeta } = await this.projectsService.query<Project>(query);

return new PaginatedDTO(items.map(ProjectDTO.fromModel), pageMeta);

PageMetaDTO computes pageCount, hasPrevPage, and hasNextPage from itemCount, page, and perPage.

Released under the MIT License.