import { generatePaginationData } from "../middleware/pagination.js"; export class PaginationHelpers { static makePaginationQuery(q, sinceId, maxId, minId, idField = `${q.alias}.id`) { if (sinceId && minId) throw new Error("Can't user both sinceId and minId params"); if (sinceId && maxId) { q.andWhere(`${idField} > :sinceId`, { sinceId: sinceId }); q.andWhere(`${idField} < :maxId`, { maxId: maxId }); q.orderBy(`${idField}`, "DESC"); } if (minId && maxId) { q.andWhere(`${idField} > :minId`, { minId: minId }); q.andWhere(`${idField} < :maxId`, { maxId: maxId }); q.orderBy(`${idField}`, "ASC"); } else if (sinceId) { q.andWhere(`${idField} > :sinceId`, { sinceId: sinceId }); q.orderBy(`${idField}`, "DESC"); } else if (minId) { q.andWhere(`${idField} > :minId`, { minId: minId }); q.orderBy(`${idField}`, "ASC"); } else if (maxId) { q.andWhere(`${idField} < :maxId`, { maxId: maxId }); q.orderBy(`${idField}`, "DESC"); } else { q.orderBy(`${idField}`, "DESC"); } return q; } /** * * @param query * @param limit * @param reverse whether the result needs to be .reverse()'d. Set this to true when the parameter minId is not undefined in the original request. */ static async execQuery(query, limit, reverse) { return query.take(limit).getMany().then((found)=>reverse ? found.reverse() : found); } static async execQueryLinkPagination(query, limit, reverse, ctx) { return this.execQuery(query, limit, reverse).then((p)=>{ ctx.pagination = generatePaginationData(p.map((x)=>x.id), limit); return p; }); } }