import { IsOptional, IsInt, Min, Max, IsString, IsIn } from 'class-validator'; import { Transform } from 'class-transformer'; import { ApiPropertyOptional } from '@nestjs/swagger'; export class PaginationDto { @ApiPropertyOptional({ default: 1, minimum: 1, description: 'Page number' }) @IsOptional() @Transform(({ value }) => parseInt(value, 10)) @IsInt() @Min(1) page?: number = 1; @ApiPropertyOptional({ default: 10, minimum: 1, maximum: 100, description: 'Items per page', }) @IsOptional() @Transform(({ value }) => parseInt(value, 10)) @IsInt() @Min(1) @Max(100) limit?: number = 10; @ApiPropertyOptional({ description: 'Field to sort by' }) @IsOptional() @IsString() sortBy?: string = 'createdAt'; @ApiPropertyOptional({ enum: ['asc', 'desc'], default: 'desc', description: 'Sort order', }) @IsOptional() @IsIn(['asc', 'desc']) sortOrder?: 'asc' | 'desc' = 'desc'; @ApiPropertyOptional({ description: 'Search query' }) @IsOptional() @IsString() search?: string; /** * Get skip value for Prisma */ get skip(): number { return ((this.page || 1) - 1) * (this.limit || 10); } /** * Get take value for Prisma */ get take(): number { return this.limit || 10; } /** * Get orderBy object for Prisma */ get orderBy(): Record { return { [this.sortBy || 'createdAt']: this.sortOrder || 'desc' }; } }