production-evyos-systems-an.../ServicesApi/src/utils/pagination-helper.ts

66 lines
1.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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