forked from yoone/API
1
0
Fork 0
API/src/utils/paginate.util.ts

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,
};
}