From f7ce0c615d76035ee48ef32047613ab1415deb44 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Wed, 30 Nov 2022 22:18:37 -0500 Subject: [PATCH] feat: decouples limit from pagination, allows for no limit query --- src/collections/operations/find.ts | 11 +++-- src/collections/operations/findVersions.ts | 7 ++- .../operations/helpers/findDocs.ts | 44 +++++++++++++++++++ src/globals/operations/findVersions.ts | 7 ++- 4 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 src/collections/operations/helpers/findDocs.ts diff --git a/src/collections/operations/find.ts b/src/collections/operations/find.ts index 7867d7e713..3ba04c4a7f 100644 --- a/src/collections/operations/find.ts +++ b/src/collections/operations/find.ts @@ -10,6 +10,7 @@ import { buildSortParam } from '../../mongoose/buildSortParam'; import replaceWithDraftIfAvailable from '../../versions/drafts/replaceWithDraftIfAvailable'; import { AccessResult } from '../../config/types'; import { afterRead } from '../../fields/hooks/afterRead'; +import { findDocs } from './helpers/findDocs'; export type Arguments = { collection: Collection @@ -136,7 +137,7 @@ async function find(incomingArgs: Arguments): Promis locale, }); - const optionsToExecute = { + const paginatedDocs = await findDocs(Model, query, { page: page || 1, limit: limit || 10, sort: { @@ -147,18 +148,16 @@ async function find(incomingArgs: Arguments): Promis useEstimatedCount, pagination, useCustomCountFn: pagination ? undefined : () => Promise.resolve(1), - }; + }); - const paginatedDocs = await Model.paginate(query, optionsToExecute); - - let result = { + let result: PaginatedDocs = { ...paginatedDocs, docs: paginatedDocs.docs.map((doc) => { const sanitizedDoc = JSON.parse(JSON.stringify(doc)); sanitizedDoc.id = sanitizedDoc._id; return sanitizeInternalFields(sanitizedDoc); }), - } as PaginatedDocs; + }; // ///////////////////////////////////// // Replace documents with drafts if available diff --git a/src/collections/operations/findVersions.ts b/src/collections/operations/findVersions.ts index 6b6ed8ac42..9005f49c23 100644 --- a/src/collections/operations/findVersions.ts +++ b/src/collections/operations/findVersions.ts @@ -10,6 +10,7 @@ import { PaginatedDocs } from '../../mongoose/types'; import { TypeWithVersion } from '../../versions/types'; import { afterRead } from '../../fields/hooks/afterRead'; import { buildVersionCollectionFields } from '../../versions/buildCollectionFields'; +import { findDocs } from './helpers/findDocs'; export type Arguments = { collection: Collection @@ -98,7 +99,7 @@ async function findVersions = any>(args: Arguments) locale, }); - const optionsToExecute = { + const paginatedDocs = await findDocs(VersionsModel, query, { page: page || 1, limit: limit || 10, sort: { @@ -107,9 +108,7 @@ async function findVersions = any>(args: Arguments) lean: true, leanWithId: true, useEstimatedCount, - }; - - const paginatedDocs = await VersionsModel.paginate(query, optionsToExecute); + }); // ///////////////////////////////////// // beforeRead - Collection diff --git a/src/collections/operations/helpers/findDocs.ts b/src/collections/operations/helpers/findDocs.ts new file mode 100644 index 0000000000..4bb0a19d64 --- /dev/null +++ b/src/collections/operations/helpers/findDocs.ts @@ -0,0 +1,44 @@ +import { PaginatedDocs } from '../../../mongoose/types'; +import { CollectionModel } from '../../config/types'; +import { Arguments } from '../find'; + +type FindDocsArguments = ({ + page: Arguments['page'] + limit: Arguments['limit'] + sort: { + [key: string]: string, + } +}) & ({ + pagination?: false +} | { + pagination: true + lean?: boolean + leanWithId?: boolean + useEstimatedCount?: boolean + useCustomCountFn?: (() => Promise) | undefined; +}) + +export async function findDocs(Model: CollectionModel, query: Record, args: FindDocsArguments): Promise> { + // ///////////////////////////////////// + // Model.paginate ignores limit when paginate is true + // pass limit=0 or pagination=false to skip + // ///////////////////////////////////// + if (args.limit !== 0 && args.pagination) { + return Model.paginate(query, args); + } + + const docs = await Model.find(query, undefined, args); + + return { + docs, + totalDocs: docs.length, + totalPages: 1, + page: undefined, + nextPage: null, + prevPage: null, + pagingCounter: 0, + hasNextPage: null, + hasPrevPage: null, + limit: args.limit || null, + }; +} diff --git a/src/globals/operations/findVersions.ts b/src/globals/operations/findVersions.ts index 3feb2bce28..96a883185e 100644 --- a/src/globals/operations/findVersions.ts +++ b/src/globals/operations/findVersions.ts @@ -10,6 +10,7 @@ import { TypeWithVersion } from '../../versions/types'; import { SanitizedGlobalConfig } from '../config/types'; import { afterRead } from '../../fields/hooks/afterRead'; import { buildVersionGlobalFields } from '../../versions/buildGlobalFields'; +import { findDocs } from '../../collections/operations/helpers/findDocs'; export type Arguments = { globalConfig: SanitizedGlobalConfig @@ -96,7 +97,7 @@ async function findVersions = any>(args: Arguments) locale, }); - const optionsToExecute = { + const paginatedDocs = await findDocs(VersionsModel, query, { page: page || 1, limit: limit || 10, sort: { @@ -105,9 +106,7 @@ async function findVersions = any>(args: Arguments) lean: true, leanWithId: true, useEstimatedCount, - }; - - const paginatedDocs = await VersionsModel.paginate(query, optionsToExecute); + }); // ///////////////////////////////////// // afterRead - Fields