generated from fahricansecer/boilerplate-be
66 lines
1.4 KiB
TypeScript
66 lines
1.4 KiB
TypeScript
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<string, 'asc' | 'desc'> {
|
|
return { [this.sortBy || 'createdAt']: this.sortOrder || 'desc' };
|
|
}
|
|
}
|