66 lines
1.9 KiB
TypeScript
66 lines
1.9 KiB
TypeScript
import { Injectable } from '@nestjs/common';
|
||
import { PrismaService } from '@/src/prisma.service';
|
||
|
||
export interface PaginationInfo {
|
||
totalCount: number;
|
||
page: number;
|
||
pageSize: number;
|
||
totalPages: number;
|
||
hasNextPage: boolean;
|
||
hasPreviousPage: boolean;
|
||
pageCount: number;
|
||
}
|
||
|
||
type ModelDelegate = {
|
||
count: (args: any) => Promise<number>;
|
||
findMany: (args: any) => Promise<any[]>;
|
||
};
|
||
|
||
@Injectable()
|
||
export class PaginationHelper {
|
||
constructor(private prisma: PrismaService) { }
|
||
|
||
/**
|
||
* Sayfalama destekli sorgu yapar
|
||
*
|
||
* @param modelDelegate Prisma model delegesi (ör. prisma.users)
|
||
* @param query Prisma findMany argümanları + opsiyonel page, pageSize
|
||
* @returns { data, pagination } sonuç ve sayfalama bilgisi
|
||
*/
|
||
async paginate(
|
||
modelDelegate: ModelDelegate,
|
||
query: any & { page?: number; pageSize?: number },
|
||
): Promise<{ data: any[]; pagination: PaginationInfo }> {
|
||
const { page = 1, pageSize = 10, ...prismaQuery } = query;
|
||
const totalCount = await modelDelegate.count({ where: prismaQuery.where });
|
||
const totalPages = Math.max(Math.ceil(totalCount / pageSize), 1);
|
||
const pageNumber = page < 1 ? 1 : page > totalPages ? totalPages : page;
|
||
const pageSizeNumber = pageSize > 0 ? pageSize : 10;
|
||
const data = await modelDelegate.findMany({
|
||
...prismaQuery,
|
||
skip: (pageNumber - 1) * pageSizeNumber,
|
||
take: pageSizeNumber,
|
||
});
|
||
const pageCount = data.length;
|
||
return {
|
||
data,
|
||
pagination: {
|
||
totalCount,
|
||
page: pageNumber,
|
||
pageSize: pageSizeNumber,
|
||
totalPages,
|
||
hasNextPage: pageNumber < totalPages,
|
||
hasPreviousPage: pageNumber > 1,
|
||
pageCount,
|
||
},
|
||
};
|
||
}
|
||
|
||
async findWithPagination(
|
||
query: any & { page?: number; pageSize?: number },
|
||
service: ModelDelegate,
|
||
): Promise<{ data: any[]; pagination: PaginationInfo }> {
|
||
return this.paginate(service, query);
|
||
}
|
||
}
|