import type { PgSelect } from 'drizzle-orm/pg-core'
import { db } from './db'
import { count } from 'drizzle-orm'
export interface PaginatedOptions {
page?: number
perPage?: number
}
export interface PaginatedResult<T> {
data: T[]
page: number
perPage: number
pageCount: number
totalCount: number
}
export async function withPagination<T extends PgSelect>(
qb: T,
pagination?: PaginatedOptions
): Promise<PaginatedResult<T>> {
const page = pagination?.page ?? 1
const perPage = pagination?.perPage ?? 10
const query = qb.limit(perPage).offset((page - 1) * perPage)
const sq = db.$with('sq').as(query)
const data = (await query.execute()) as T[]
const meta = await db.select({ count: count() }).from(sq)
const totalCount = Number(meta[0].count)
const pageCount = Math.ceil(totalCount / perPage)
return {
data,
totalCount,
pageCount,
perPage,
page,
}
}
import type { PgSelect } from 'drizzle-orm/pg-core'
import { db } from './db'
import { count } from 'drizzle-orm'
export interface PaginatedOptions {
page?: number
perPage?: number
}
export interface PaginatedResult<T> {
data: T[]
page: number
perPage: number
pageCount: number
totalCount: number
}
export async function withPagination<T extends PgSelect>(
qb: T,
pagination?: PaginatedOptions
): Promise<PaginatedResult<T>> {
const page = pagination?.page ?? 1
const perPage = pagination?.perPage ?? 10
const query = qb.limit(perPage).offset((page - 1) * perPage)
const sq = db.$with('sq').as(query)
const data = (await query.execute()) as T[]
const meta = await db.select({ count: count() }).from(sq)
const totalCount = Number(meta[0].count)
const pageCount = Math.ceil(totalCount / perPage)
return {
data,
totalCount,
pageCount,
perPage,
page,
}
}