78 lines
1.7 KiB
TypeScript
78 lines
1.7 KiB
TypeScript
import {
|
|
FindManyOptions,
|
|
FindOptionsWhere,
|
|
Repository,
|
|
SelectQueryBuilder,
|
|
} from 'typeorm';
|
|
import { PaginationParams } from '../interface';
|
|
import { plainToInstance } from 'class-transformer';
|
|
|
|
export class PaginationResult<T> {
|
|
current: number;
|
|
|
|
pageSize: number;
|
|
|
|
total: number;
|
|
|
|
items: T[];
|
|
}
|
|
|
|
export async function paginate<T>(
|
|
repository: Repository<T> | SelectQueryBuilder<T>,
|
|
options: {
|
|
pagination: PaginationParams;
|
|
where?: FindOptionsWhere<T> | FindOptionsWhere<T>[];
|
|
relations?: string[];
|
|
order?: Record<string, 'ASC' | 'DESC'>;
|
|
transformerClass?: new () => T; // 可选:用于指定需要转换的类
|
|
}
|
|
): Promise<PaginationResult<T>> {
|
|
const {
|
|
pagination: { current, pageSize },
|
|
relations = [],
|
|
where = {},
|
|
order = {},
|
|
transformerClass,
|
|
} = options;
|
|
|
|
if (repository instanceof SelectQueryBuilder) {
|
|
let queryBuilder = repository;
|
|
const total = await queryBuilder.getCount();
|
|
queryBuilder = queryBuilder.skip((current - 1) * pageSize).take(pageSize);
|
|
|
|
const items = await queryBuilder.getRawMany();
|
|
const transformedItems = transformerClass
|
|
? plainToInstance(transformerClass, items)
|
|
: items;
|
|
return {
|
|
items: transformedItems,
|
|
total,
|
|
current,
|
|
pageSize,
|
|
};
|
|
}
|
|
|
|
const items = await repository.find({
|
|
where,
|
|
skip: (current - 1) * pageSize,
|
|
take: pageSize,
|
|
relations,
|
|
order,
|
|
} as FindManyOptions<T>);
|
|
const total = await repository.count({
|
|
where,
|
|
take: pageSize,
|
|
relations,
|
|
order,
|
|
} as FindManyOptions<T>);
|
|
const transformedItems = transformerClass
|
|
? plainToInstance(transformerClass, items)
|
|
: items;
|
|
return {
|
|
items: transformedItems,
|
|
total,
|
|
current,
|
|
pageSize,
|
|
};
|
|
}
|