@payloadcms/db-mongodb 4.0.0-internal.77191e5 → 4.0.0-internal.7803e2c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/connect.d.ts.map +1 -1
- package/dist/connect.js +1 -0
- package/dist/connect.js.map +1 -1
- package/dist/count.d.ts.map +1 -1
- package/dist/count.js +33 -4
- package/dist/count.js.map +1 -1
- package/dist/countGlobalVersions.d.ts.map +1 -1
- package/dist/countGlobalVersions.js +10 -2
- package/dist/countGlobalVersions.js.map +1 -1
- package/dist/countVersions.d.ts.map +1 -1
- package/dist/countVersions.js +36 -4
- package/dist/countVersions.js.map +1 -1
- package/dist/createGlobalVersion.d.ts +1 -1
- package/dist/createGlobalVersion.d.ts.map +1 -1
- package/dist/createGlobalVersion.js +24 -1
- package/dist/createGlobalVersion.js.map +1 -1
- package/dist/createVersion.d.ts.map +1 -1
- package/dist/createVersion.js +16 -3
- package/dist/createVersion.js.map +1 -1
- package/dist/deleteBranchGlobal.d.ts +10 -0
- package/dist/deleteBranchGlobal.d.ts.map +1 -0
- package/dist/deleteBranchGlobal.js +26 -0
- package/dist/deleteBranchGlobal.js.map +1 -0
- package/dist/deleteMany.d.ts.map +1 -1
- package/dist/deleteMany.js +1 -0
- package/dist/deleteMany.js.map +1 -1
- package/dist/deleteOne.d.ts.map +1 -1
- package/dist/deleteOne.js +20 -1
- package/dist/deleteOne.js.map +1 -1
- package/dist/deleteVersions.d.ts.map +1 -1
- package/dist/deleteVersions.js +1 -0
- package/dist/deleteVersions.js.map +1 -1
- package/dist/exports/migration-utils.d.ts +2 -0
- package/dist/exports/migration-utils.d.ts.map +1 -1
- package/dist/exports/migration-utils.js +2 -0
- package/dist/exports/migration-utils.js.map +1 -1
- package/dist/find.d.ts.map +1 -1
- package/dist/find.js +44 -8
- package/dist/find.js.map +1 -1
- package/dist/findDistinct.d.ts.map +1 -1
- package/dist/findDistinct.js +70 -11
- package/dist/findDistinct.js.map +1 -1
- package/dist/findGlobal.d.ts.map +1 -1
- package/dist/findGlobal.js +48 -9
- package/dist/findGlobal.js.map +1 -1
- package/dist/findGlobalVersions.d.ts.map +1 -1
- package/dist/findGlobalVersions.js +10 -2
- package/dist/findGlobalVersions.js.map +1 -1
- package/dist/findOne.d.ts.map +1 -1
- package/dist/findOne.js +43 -5
- package/dist/findOne.js.map +1 -1
- package/dist/findVersions.d.ts.map +1 -1
- package/dist/findVersions.js +49 -5
- package/dist/findVersions.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +89 -67
- package/dist/init.js.map +1 -1
- package/dist/migrateFresh.d.ts.map +1 -1
- package/dist/migrateFresh.js +1 -0
- package/dist/migrateFresh.js.map +1 -1
- package/dist/models/buildCollectionSchema.d.ts +8 -2
- package/dist/models/buildCollectionSchema.d.ts.map +1 -1
- package/dist/models/buildCollectionSchema.js +4 -2
- package/dist/models/buildCollectionSchema.js.map +1 -1
- package/dist/models/buildGlobalModel.d.ts +5 -1
- package/dist/models/buildGlobalModel.d.ts.map +1 -1
- package/dist/models/buildGlobalModel.js +34 -3
- package/dist/models/buildGlobalModel.js.map +1 -1
- package/dist/models/buildSchema.d.ts +4 -0
- package/dist/models/buildSchema.d.ts.map +1 -1
- package/dist/models/buildSchema.js +100 -36
- package/dist/models/buildSchema.js.map +1 -1
- package/dist/models/schemaBuildContext.d.ts +21 -0
- package/dist/models/schemaBuildContext.d.ts.map +1 -0
- package/dist/models/schemaBuildContext.js +29 -0
- package/dist/models/schemaBuildContext.js.map +1 -0
- package/dist/predefinedMigrations/branching.d.ts +4 -0
- package/dist/predefinedMigrations/branching.d.ts.map +1 -0
- package/dist/predefinedMigrations/branching.js +9 -0
- package/dist/predefinedMigrations/branching.js.map +1 -0
- package/dist/predefinedMigrations/migrateBranching.d.ts +17 -0
- package/dist/predefinedMigrations/migrateBranching.d.ts.map +1 -0
- package/dist/predefinedMigrations/migrateBranching.js +90 -0
- package/dist/predefinedMigrations/migrateBranching.js.map +1 -0
- package/dist/predefinedMigrations/migrateSizesToVariants.d.ts +13 -0
- package/dist/predefinedMigrations/migrateSizesToVariants.d.ts.map +1 -0
- package/dist/predefinedMigrations/migrateSizesToVariants.js +368 -0
- package/dist/predefinedMigrations/migrateSizesToVariants.js.map +1 -0
- package/dist/predefinedMigrations/sizes-to-variants.d.ts +5 -0
- package/dist/predefinedMigrations/sizes-to-variants.d.ts.map +1 -0
- package/dist/predefinedMigrations/sizes-to-variants.js +8 -0
- package/dist/predefinedMigrations/sizes-to-variants.js.map +1 -0
- package/dist/queries/buildAndOrConditions.d.ts +4 -2
- package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
- package/dist/queries/buildAndOrConditions.js +3 -1
- package/dist/queries/buildAndOrConditions.js.map +1 -1
- package/dist/queries/buildBranchVisibility.d.ts +11 -0
- package/dist/queries/buildBranchVisibility.d.ts.map +1 -0
- package/dist/queries/buildBranchVisibility.js +204 -0
- package/dist/queries/buildBranchVisibility.js.map +1 -0
- package/dist/queries/buildQuery.d.ts +4 -2
- package/dist/queries/buildQuery.d.ts.map +1 -1
- package/dist/queries/buildQuery.js +3 -1
- package/dist/queries/buildQuery.js.map +1 -1
- package/dist/queries/buildRelatedQueryPipeline.d.ts +7 -0
- package/dist/queries/buildRelatedQueryPipeline.d.ts.map +1 -0
- package/dist/queries/buildRelatedQueryPipeline.js +56 -0
- package/dist/queries/buildRelatedQueryPipeline.js.map +1 -0
- package/dist/queries/buildSearchParams.d.ts +4 -2
- package/dist/queries/buildSearchParams.d.ts.map +1 -1
- package/dist/queries/buildSearchParams.js +177 -45
- package/dist/queries/buildSearchParams.js.map +1 -1
- package/dist/queries/getBuildQueryPlugin.d.ts +3 -1
- package/dist/queries/getBuildQueryPlugin.d.ts.map +1 -1
- package/dist/queries/getBuildQueryPlugin.js +3 -1
- package/dist/queries/getBuildQueryPlugin.js.map +1 -1
- package/dist/queries/parseParams.d.ts +4 -2
- package/dist/queries/parseParams.d.ts.map +1 -1
- package/dist/queries/parseParams.js +5 -1
- package/dist/queries/parseParams.js.map +1 -1
- package/dist/queryDrafts.d.ts.map +1 -1
- package/dist/queryDrafts.js +39 -7
- package/dist/queryDrafts.js.map +1 -1
- package/dist/transactions/commitTransaction.d.ts.map +1 -1
- package/dist/transactions/commitTransaction.js +68 -7
- package/dist/transactions/commitTransaction.js.map +1 -1
- package/dist/transactions/rollbackTransaction.d.ts.map +1 -1
- package/dist/transactions/rollbackTransaction.js +10 -9
- package/dist/transactions/rollbackTransaction.js.map +1 -1
- package/dist/updateGlobal.d.ts.map +1 -1
- package/dist/updateGlobal.js +91 -9
- package/dist/updateGlobal.js.map +1 -1
- package/dist/updateGlobalVersion.d.ts.map +1 -1
- package/dist/updateGlobalVersion.js +3 -2
- package/dist/updateGlobalVersion.js.map +1 -1
- package/dist/updateJobs.js +1 -1
- package/dist/updateJobs.js.map +1 -1
- package/dist/updateMany.d.ts.map +1 -1
- package/dist/updateMany.js +3 -2
- package/dist/updateMany.js.map +1 -1
- package/dist/updateOne.d.ts.map +1 -1
- package/dist/updateOne.js +30 -4
- package/dist/updateOne.js.map +1 -1
- package/dist/updateVersion.d.ts.map +1 -1
- package/dist/updateVersion.js +3 -2
- package/dist/updateVersion.js.map +1 -1
- package/dist/upsertBranchGlobalChange.d.ts +3 -0
- package/dist/upsertBranchGlobalChange.d.ts.map +1 -0
- package/dist/upsertBranchGlobalChange.js +28 -0
- package/dist/upsertBranchGlobalChange.js.map +1 -0
- package/dist/utilities/aggregatePaginate.d.ts +2 -1
- package/dist/utilities/aggregatePaginate.d.ts.map +1 -1
- package/dist/utilities/aggregatePaginate.js +21 -5
- package/dist/utilities/aggregatePaginate.js.map +1 -1
- package/dist/utilities/buildJoinAggregation.d.ts +4 -2
- package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
- package/dist/utilities/buildJoinAggregation.js +158 -24
- package/dist/utilities/buildJoinAggregation.js.map +1 -1
- package/dist/utilities/resolveJoins.d.ts +6 -2
- package/dist/utilities/resolveJoins.d.ts.map +1 -1
- package/dist/utilities/resolveJoins.js +115 -26
- package/dist/utilities/resolveJoins.js.map +1 -1
- package/package.json +16 -19
package/dist/deleteOne.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/deleteOne.ts"],"sourcesContent":["import type { QueryOptions } from 'mongoose'\nimport type { DeleteOne } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\nimport { transform } from './utilities/transform.js'\n\nexport const deleteOne: DeleteOne = async function deleteOne(\n this: MongooseAdapter,\n { collection: collectionSlug, req, returning, select, where },\n) {\n const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug })\n\n const query = await buildQuery({\n adapter: this,\n collectionSlug,\n fields: collectionConfig.flattenedFields,\n where,\n })\n\n const options = {\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: collectionConfig.flattenedFields,\n select,\n }),\n session: await getSession(this, req),\n } satisfies QueryOptions\n\n if (returning === false) {\n await Model.deleteOne(query, options)?.lean()\n return null\n }\n\n const doc = await Model.findOneAndDelete(query, options)?.lean()\n\n if (!doc) {\n return null\n }\n\n transform({\n adapter: this,\n data: doc,\n fields: collectionConfig.fields,\n operation: 'read',\n })\n\n return doc\n}\n"],"names":["buildQuery","buildProjectionFromSelect","getCollection","getSession","transform","deleteOne","collection","collectionSlug","req","returning","select","where","collectionConfig","Model","adapter","query","fields","flattenedFields","options","projection","session","lean","
|
|
1
|
+
{"version":3,"sources":["../src/deleteOne.ts"],"sourcesContent":["import type { QueryOptions } from 'mongoose'\nimport type { DeleteOne } from 'payload'\n\nimport { resolveBranchDelete } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\nimport { transform } from './utilities/transform.js'\n\nexport const deleteOne: DeleteOne = async function deleteOne(\n this: MongooseAdapter,\n { branch, collection: collectionSlug, req, returning, select, where },\n) {\n const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug })\n\n const branchDelete = await resolveBranchDelete({ branch, collectionSlug, req, where })\n\n if (branchDelete.tombstoned) {\n return returning === false ? null : (branchDelete.doc as Awaited<ReturnType<DeleteOne>>)\n }\n\n if (branchDelete.deleteRowID !== undefined) {\n where = { id: { equals: branchDelete.deleteRowID } }\n }\n\n const query = await buildQuery({\n adapter: this,\n branch,\n collectionSlug,\n fields: collectionConfig.flattenedFields,\n req,\n where,\n })\n\n const options = {\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: collectionConfig.flattenedFields,\n select,\n }),\n session: await getSession(this, req),\n } satisfies QueryOptions\n\n if (returning === false) {\n await Model.deleteOne(query, options)?.lean()\n return null\n }\n\n const doc = await Model.findOneAndDelete(query, options)?.lean()\n\n if (!doc) {\n return null\n }\n\n transform({\n adapter: this,\n data: doc,\n fields: collectionConfig.fields,\n operation: 'read',\n })\n\n return doc\n}\n"],"names":["resolveBranchDelete","buildQuery","buildProjectionFromSelect","getCollection","getSession","transform","deleteOne","branch","collection","collectionSlug","req","returning","select","where","collectionConfig","Model","adapter","branchDelete","tombstoned","doc","deleteRowID","undefined","id","equals","query","fields","flattenedFields","options","projection","session","lean","findOneAndDelete","data","operation"],"mappings":"AAGA,SAASA,mBAAmB,QAAQ,UAAS;AAI7C,SAASC,UAAU,QAAQ,0BAAyB;AACpD,SAASC,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,aAAa,QAAQ,2BAA0B;AACxD,SAASC,UAAU,QAAQ,4BAA2B;AACtD,SAASC,SAAS,QAAQ,2BAA0B;AAEpD,OAAO,MAAMC,YAAuB,eAAeA,UAEjD,EAAEC,MAAM,EAAEC,YAAYC,cAAc,EAAEC,GAAG,EAAEC,SAAS,EAAEC,MAAM,EAAEC,KAAK,EAAE;IAErE,MAAM,EAAEC,gBAAgB,EAAEC,KAAK,EAAE,GAAGZ,cAAc;QAAEa,SAAS,IAAI;QAAEP;IAAe;IAElF,MAAMQ,eAAe,MAAMjB,oBAAoB;QAAEO;QAAQE;QAAgBC;QAAKG;IAAM;IAEpF,IAAII,aAAaC,UAAU,EAAE;QAC3B,OAAOP,cAAc,QAAQ,OAAQM,aAAaE,GAAG;IACvD;IAEA,IAAIF,aAAaG,WAAW,KAAKC,WAAW;QAC1CR,QAAQ;YAAES,IAAI;gBAAEC,QAAQN,aAAaG,WAAW;YAAC;QAAE;IACrD;IAEA,MAAMI,QAAQ,MAAMvB,WAAW;QAC7Be,SAAS,IAAI;QACbT;QACAE;QACAgB,QAAQX,iBAAiBY,eAAe;QACxChB;QACAG;IACF;IAEA,MAAMc,UAAU;QACdC,YAAY1B,0BAA0B;YACpCc,SAAS,IAAI;YACbS,QAAQX,iBAAiBY,eAAe;YACxCd;QACF;QACAiB,SAAS,MAAMzB,WAAW,IAAI,EAAEM;IAClC;IAEA,IAAIC,cAAc,OAAO;QACvB,MAAMI,MAAMT,SAAS,CAACkB,OAAOG,UAAUG;QACvC,OAAO;IACT;IAEA,MAAMX,MAAM,MAAMJ,MAAMgB,gBAAgB,CAACP,OAAOG,UAAUG;IAE1D,IAAI,CAACX,KAAK;QACR,OAAO;IACT;IAEAd,UAAU;QACRW,SAAS,IAAI;QACbgB,MAAMb;QACNM,QAAQX,iBAAiBW,MAAM;QAC/BQ,WAAW;IACb;IAEA,OAAOd;AACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteVersions.d.ts","sourceRoot":"","sources":["../src/deleteVersions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,SAAS,CAAA;AAW7D,eAAO,MAAM,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"deleteVersions.d.ts","sourceRoot":"","sources":["../src/deleteVersions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,SAAS,CAAA;AAW7D,eAAO,MAAM,cAAc,EAAE,cAsC5B,CAAA"}
|
package/dist/deleteVersions.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/deleteVersions.ts"],"sourcesContent":["import type { DeleteVersions, FlattenedField } from 'payload'\n\nimport { APIError, buildVersionCollectionFields, buildVersionGlobalFields } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\nimport type { CollectionModel } from './types.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { getCollection, getGlobal } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\n\nexport const deleteVersions: DeleteVersions = async function deleteVersions(\n this: MongooseAdapter,\n { collection: collectionSlug, globalSlug, locale, req, where },\n) {\n let fields: FlattenedField[]\n let VersionsModel: CollectionModel\n\n if (globalSlug) {\n const { globalConfig, Model } = getGlobal({\n adapter: this,\n globalSlug,\n versions: true,\n })\n fields = buildVersionGlobalFields(this.payload.config, globalConfig, true)\n VersionsModel = Model\n } else if (collectionSlug) {\n const { collectionConfig, Model } = getCollection({\n adapter: this,\n collectionSlug,\n versions: true,\n })\n fields = buildVersionCollectionFields(this.payload.config, collectionConfig, true)\n VersionsModel = Model\n } else {\n throw new APIError('Either collection or globalSlug must be passed.')\n }\n\n const query = await buildQuery({\n adapter: this,\n fields,\n locale,\n where,\n })\n\n const session = await getSession(this, req)\n\n await VersionsModel.deleteMany(query, { session })\n}\n"],"names":["APIError","buildVersionCollectionFields","buildVersionGlobalFields","buildQuery","getCollection","getGlobal","getSession","deleteVersions","collection","collectionSlug","globalSlug","locale","req","where","fields","VersionsModel","globalConfig","Model","adapter","versions","payload","config","collectionConfig","query","session","deleteMany"],"mappings":"AAEA,SAASA,QAAQ,EAAEC,4BAA4B,EAAEC,wBAAwB,QAAQ,UAAS;AAK1F,SAASC,UAAU,QAAQ,0BAAyB;AACpD,SAASC,aAAa,EAAEC,SAAS,QAAQ,2BAA0B;AACnE,SAASC,UAAU,QAAQ,4BAA2B;AAEtD,OAAO,MAAMC,iBAAiC,eAAeA,eAE3D,EAAEC,YAAYC,cAAc,EAAEC,UAAU,EAAEC,MAAM,EAAEC,GAAG,EAAEC,KAAK,EAAE;IAE9D,IAAIC;IACJ,IAAIC;IAEJ,IAAIL,YAAY;QACd,MAAM,EAAEM,YAAY,EAAEC,KAAK,EAAE,GAAGZ,UAAU;YACxCa,SAAS,IAAI;YACbR;YACAS,UAAU;QACZ;QACAL,SAASZ,yBAAyB,IAAI,CAACkB,OAAO,CAACC,MAAM,EAAEL,cAAc;QACrED,gBAAgBE;IAClB,OAAO,IAAIR,gBAAgB;QACzB,MAAM,EAAEa,gBAAgB,EAAEL,KAAK,EAAE,GAAGb,cAAc;YAChDc,SAAS,IAAI;YACbT;YACAU,UAAU;QACZ;QACAL,SAASb,6BAA6B,IAAI,CAACmB,OAAO,CAACC,MAAM,EAAEC,kBAAkB;QAC7EP,gBAAgBE;IAClB,OAAO;QACL,MAAM,IAAIjB,SAAS;IACrB;IAEA,MAAMuB,QAAQ,MAAMpB,WAAW;QAC7Be,SAAS,IAAI;QACbJ;QACAH;
|
|
1
|
+
{"version":3,"sources":["../src/deleteVersions.ts"],"sourcesContent":["import type { DeleteVersions, FlattenedField } from 'payload'\n\nimport { APIError, buildVersionCollectionFields, buildVersionGlobalFields } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\nimport type { CollectionModel } from './types.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { getCollection, getGlobal } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\n\nexport const deleteVersions: DeleteVersions = async function deleteVersions(\n this: MongooseAdapter,\n { collection: collectionSlug, globalSlug, locale, req, where },\n) {\n let fields: FlattenedField[]\n let VersionsModel: CollectionModel\n\n if (globalSlug) {\n const { globalConfig, Model } = getGlobal({\n adapter: this,\n globalSlug,\n versions: true,\n })\n fields = buildVersionGlobalFields(this.payload.config, globalConfig, true)\n VersionsModel = Model\n } else if (collectionSlug) {\n const { collectionConfig, Model } = getCollection({\n adapter: this,\n collectionSlug,\n versions: true,\n })\n fields = buildVersionCollectionFields(this.payload.config, collectionConfig, true)\n VersionsModel = Model\n } else {\n throw new APIError('Either collection or globalSlug must be passed.')\n }\n\n const query = await buildQuery({\n adapter: this,\n fields,\n locale,\n req,\n where,\n })\n\n const session = await getSession(this, req)\n\n await VersionsModel.deleteMany(query, { session })\n}\n"],"names":["APIError","buildVersionCollectionFields","buildVersionGlobalFields","buildQuery","getCollection","getGlobal","getSession","deleteVersions","collection","collectionSlug","globalSlug","locale","req","where","fields","VersionsModel","globalConfig","Model","adapter","versions","payload","config","collectionConfig","query","session","deleteMany"],"mappings":"AAEA,SAASA,QAAQ,EAAEC,4BAA4B,EAAEC,wBAAwB,QAAQ,UAAS;AAK1F,SAASC,UAAU,QAAQ,0BAAyB;AACpD,SAASC,aAAa,EAAEC,SAAS,QAAQ,2BAA0B;AACnE,SAASC,UAAU,QAAQ,4BAA2B;AAEtD,OAAO,MAAMC,iBAAiC,eAAeA,eAE3D,EAAEC,YAAYC,cAAc,EAAEC,UAAU,EAAEC,MAAM,EAAEC,GAAG,EAAEC,KAAK,EAAE;IAE9D,IAAIC;IACJ,IAAIC;IAEJ,IAAIL,YAAY;QACd,MAAM,EAAEM,YAAY,EAAEC,KAAK,EAAE,GAAGZ,UAAU;YACxCa,SAAS,IAAI;YACbR;YACAS,UAAU;QACZ;QACAL,SAASZ,yBAAyB,IAAI,CAACkB,OAAO,CAACC,MAAM,EAAEL,cAAc;QACrED,gBAAgBE;IAClB,OAAO,IAAIR,gBAAgB;QACzB,MAAM,EAAEa,gBAAgB,EAAEL,KAAK,EAAE,GAAGb,cAAc;YAChDc,SAAS,IAAI;YACbT;YACAU,UAAU;QACZ;QACAL,SAASb,6BAA6B,IAAI,CAACmB,OAAO,CAACC,MAAM,EAAEC,kBAAkB;QAC7EP,gBAAgBE;IAClB,OAAO;QACL,MAAM,IAAIjB,SAAS;IACrB;IAEA,MAAMuB,QAAQ,MAAMpB,WAAW;QAC7Be,SAAS,IAAI;QACbJ;QACAH;QACAC;QACAC;IACF;IAEA,MAAMW,UAAU,MAAMlB,WAAW,IAAI,EAAEM;IAEvC,MAAMG,cAAcU,UAAU,CAACF,OAAO;QAAEC;IAAQ;AAClD,EAAC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
export { migrateBranching } from '../predefinedMigrations/migrateBranching.js';
|
|
1
2
|
export { localizeStatus, migrateLocalizeStatus, } from '../predefinedMigrations/migrateLocalizeStatus.js';
|
|
2
3
|
export { migrateRelationshipsV2_V3 } from '../predefinedMigrations/migrateRelationshipsV2_V3.js';
|
|
4
|
+
export { migrateSizesToVariants } from '../predefinedMigrations/migrateSizesToVariants.js';
|
|
3
5
|
export { migrateVersionsV1_V2 } from '../predefinedMigrations/migrateVersionsV1_V2.js';
|
|
4
6
|
//# sourceMappingURL=migration-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration-utils.d.ts","sourceRoot":"","sources":["../../src/exports/migration-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,qBAAqB,GACtB,MAAM,kDAAkD,CAAA;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sDAAsD,CAAA;AAChG,OAAO,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAA"}
|
|
1
|
+
{"version":3,"file":"migration-utils.d.ts","sourceRoot":"","sources":["../../src/exports/migration-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAA;AAC9E,OAAO,EACL,cAAc,EACd,qBAAqB,GACtB,MAAM,kDAAkD,CAAA;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sDAAsD,CAAA;AAChG,OAAO,EAAE,sBAAsB,EAAE,MAAM,mDAAmD,CAAA;AAC1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAA"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
export { migrateBranching } from '../predefinedMigrations/migrateBranching.js';
|
|
1
2
|
export { localizeStatus, migrateLocalizeStatus } from '../predefinedMigrations/migrateLocalizeStatus.js';
|
|
2
3
|
export { migrateRelationshipsV2_V3 } from '../predefinedMigrations/migrateRelationshipsV2_V3.js';
|
|
4
|
+
export { migrateSizesToVariants } from '../predefinedMigrations/migrateSizesToVariants.js';
|
|
3
5
|
export { migrateVersionsV1_V2 } from '../predefinedMigrations/migrateVersionsV1_V2.js';
|
|
4
6
|
|
|
5
7
|
//# sourceMappingURL=migration-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/exports/migration-utils.ts"],"sourcesContent":["export {\n localizeStatus,\n migrateLocalizeStatus,\n} from '../predefinedMigrations/migrateLocalizeStatus.js'\nexport { migrateRelationshipsV2_V3 } from '../predefinedMigrations/migrateRelationshipsV2_V3.js'\nexport { migrateVersionsV1_V2 } from '../predefinedMigrations/migrateVersionsV1_V2.js'\n"],"names":["localizeStatus","migrateLocalizeStatus","migrateRelationshipsV2_V3","migrateVersionsV1_V2"],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"sources":["../../src/exports/migration-utils.ts"],"sourcesContent":["export { migrateBranching } from '../predefinedMigrations/migrateBranching.js'\nexport {\n localizeStatus,\n migrateLocalizeStatus,\n} from '../predefinedMigrations/migrateLocalizeStatus.js'\nexport { migrateRelationshipsV2_V3 } from '../predefinedMigrations/migrateRelationshipsV2_V3.js'\nexport { migrateSizesToVariants } from '../predefinedMigrations/migrateSizesToVariants.js'\nexport { migrateVersionsV1_V2 } from '../predefinedMigrations/migrateVersionsV1_V2.js'\n"],"names":["migrateBranching","localizeStatus","migrateLocalizeStatus","migrateRelationshipsV2_V3","migrateSizesToVariants","migrateVersionsV1_V2"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,8CAA6C;AAC9E,SACEC,cAAc,EACdC,qBAAqB,QAChB,mDAAkD;AACzD,SAASC,yBAAyB,QAAQ,uDAAsD;AAChG,SAASC,sBAAsB,QAAQ,oDAAmD;AAC1F,SAASC,oBAAoB,QAAQ,kDAAiD"}
|
package/dist/find.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../src/find.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../src/find.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAwBnC,eAAO,MAAM,IAAI,EAAE,IA+MlB,CAAA"}
|
package/dist/find.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { flattenWhereToOperators } from 'payload';
|
|
1
|
+
import { applyBranchIDProjection, flattenWhereToOperators, resolveBranchQuery, resolveBranchReadState, rewriteBranchIDs, withBranchIDSelect } from 'payload';
|
|
2
|
+
import { buildBranchVisibilityStages } from './queries/buildBranchVisibility.js';
|
|
2
3
|
import { buildQuery } from './queries/buildQuery.js';
|
|
3
4
|
import { buildSortParam } from './queries/buildSortParam.js';
|
|
4
5
|
import { aggregatePaginate } from './utilities/aggregatePaginate.js';
|
|
@@ -8,11 +9,27 @@ import { getCollection } from './utilities/getEntity.js';
|
|
|
8
9
|
import { getSession } from './utilities/getSession.js';
|
|
9
10
|
import { resolveJoins } from './utilities/resolveJoins.js';
|
|
10
11
|
import { transform } from './utilities/transform.js';
|
|
11
|
-
export const find = async function find({ collection: collectionSlug, draftsEnabled, joins = {}, limit = 0, locale, page, pagination, projection, req, select, sort: sortArg, where = {} }) {
|
|
12
|
+
export const find = async function find({ branch, collection: collectionSlug, draftsEnabled, joins = {}, limit = 0, locale, page, pagination, projection, req, select, sort: sortArg, where = {} }) {
|
|
12
13
|
const { collectionConfig, Model } = getCollection({
|
|
13
14
|
adapter: this,
|
|
14
15
|
collectionSlug
|
|
15
16
|
});
|
|
17
|
+
const branchReadState = resolveBranchReadState({
|
|
18
|
+
branch,
|
|
19
|
+
collectionSlug,
|
|
20
|
+
req
|
|
21
|
+
});
|
|
22
|
+
where = branchReadState.useBranching ? rewriteBranchIDs(where) ?? {} : await resolveBranchQuery({
|
|
23
|
+
branch,
|
|
24
|
+
collectionSlug,
|
|
25
|
+
req,
|
|
26
|
+
where
|
|
27
|
+
}) ?? {};
|
|
28
|
+
const branchVisibility = branchReadState.useBranching ? buildBranchVisibilityStages({
|
|
29
|
+
adapter: this,
|
|
30
|
+
branch: branchReadState.branch,
|
|
31
|
+
collectionSlug
|
|
32
|
+
}) : [];
|
|
16
33
|
let hasNearConstraint = false;
|
|
17
34
|
if (where) {
|
|
18
35
|
const constraints = flattenWhereToOperators(where);
|
|
@@ -33,14 +50,16 @@ export const find = async function find({ collection: collectionSlug, draftsEnab
|
|
|
33
50
|
}
|
|
34
51
|
const query = await buildQuery({
|
|
35
52
|
adapter: this,
|
|
53
|
+
branch,
|
|
36
54
|
collectionSlug,
|
|
37
55
|
fields: collectionConfig.flattenedFields,
|
|
38
56
|
locale,
|
|
57
|
+
req,
|
|
39
58
|
where
|
|
40
59
|
});
|
|
41
60
|
const session = await getSession(this, req);
|
|
42
61
|
// useEstimatedCount is faster, but not accurate, as it ignores any filters. It is thus set to true if there are no filters.
|
|
43
|
-
const useEstimatedCount = hasNearConstraint || !query || Object.keys(query).length === 0;
|
|
62
|
+
const useEstimatedCount = !branchVisibility.length && (hasNearConstraint || !query || Object.keys(query).length === 0);
|
|
44
63
|
const paginationOptions = {
|
|
45
64
|
lean: true,
|
|
46
65
|
leanWithId: true,
|
|
@@ -53,11 +72,17 @@ export const find = async function find({ collection: collectionSlug, draftsEnab
|
|
|
53
72
|
sort,
|
|
54
73
|
useEstimatedCount
|
|
55
74
|
};
|
|
56
|
-
|
|
75
|
+
const selectWithBranchID = withBranchIDSelect({
|
|
76
|
+
branch,
|
|
77
|
+
collectionSlug,
|
|
78
|
+
req,
|
|
79
|
+
select
|
|
80
|
+
});
|
|
81
|
+
if (selectWithBranchID) {
|
|
57
82
|
paginationOptions.projection = buildProjectionFromSelect({
|
|
58
83
|
adapter: this,
|
|
59
84
|
fields: collectionConfig.flattenedFields,
|
|
60
|
-
select
|
|
85
|
+
select: selectWithBranchID
|
|
61
86
|
});
|
|
62
87
|
}
|
|
63
88
|
if (this.collation) {
|
|
@@ -106,17 +131,20 @@ export const find = async function find({ collection: collectionSlug, draftsEnab
|
|
|
106
131
|
let result;
|
|
107
132
|
const aggregate = await buildJoinAggregation({
|
|
108
133
|
adapter: this,
|
|
134
|
+
branch,
|
|
109
135
|
collection: collectionSlug,
|
|
110
136
|
collectionConfig,
|
|
111
137
|
draftsEnabled,
|
|
112
138
|
joins,
|
|
113
139
|
locale,
|
|
114
140
|
projection: paginationOptions.projection,
|
|
115
|
-
query
|
|
141
|
+
query,
|
|
142
|
+
req
|
|
116
143
|
});
|
|
117
|
-
if (aggregate.length > 0 || sortAggregation.length > 0) {
|
|
144
|
+
if (aggregate.length > 0 || branchVisibility.length > 0 || sortAggregation.length > 0) {
|
|
118
145
|
result = await aggregatePaginate({
|
|
119
146
|
adapter: this,
|
|
147
|
+
branchVisibility,
|
|
120
148
|
collation: paginationOptions.collation,
|
|
121
149
|
joinAggregation: aggregate,
|
|
122
150
|
limit: paginationOptions.limit,
|
|
@@ -136,10 +164,12 @@ export const find = async function find({ collection: collectionSlug, draftsEnab
|
|
|
136
164
|
if (!this.useJoinAggregations) {
|
|
137
165
|
await resolveJoins({
|
|
138
166
|
adapter: this,
|
|
167
|
+
branch,
|
|
139
168
|
collectionSlug,
|
|
140
169
|
docs: result.docs,
|
|
141
170
|
joins,
|
|
142
|
-
locale
|
|
171
|
+
locale,
|
|
172
|
+
req
|
|
143
173
|
});
|
|
144
174
|
}
|
|
145
175
|
transform({
|
|
@@ -148,6 +178,12 @@ export const find = async function find({ collection: collectionSlug, draftsEnab
|
|
|
148
178
|
fields: collectionConfig.fields,
|
|
149
179
|
operation: 'read'
|
|
150
180
|
});
|
|
181
|
+
applyBranchIDProjection({
|
|
182
|
+
branch,
|
|
183
|
+
collectionSlug,
|
|
184
|
+
docs: result.docs,
|
|
185
|
+
req
|
|
186
|
+
});
|
|
151
187
|
return result;
|
|
152
188
|
};
|
|
153
189
|
|
package/dist/find.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/find.ts"],"sourcesContent":["import type { PaginateOptions, PipelineStage } from 'mongoose'\nimport type { Find } from 'payload'\n\nimport { flattenWhereToOperators } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildSortParam } from './queries/buildSortParam.js'\nimport { aggregatePaginate } from './utilities/aggregatePaginate.js'\nimport { buildJoinAggregation } from './utilities/buildJoinAggregation.js'\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\nimport { resolveJoins } from './utilities/resolveJoins.js'\nimport { transform } from './utilities/transform.js'\n\nexport const find: Find = async function find(\n this: MongooseAdapter,\n {\n collection: collectionSlug,\n draftsEnabled,\n joins = {},\n limit = 0,\n locale,\n page,\n pagination,\n projection,\n req,\n select,\n sort: sortArg,\n where = {},\n },\n) {\n const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug })\n\n let hasNearConstraint = false\n\n if (where) {\n const constraints = flattenWhereToOperators(where)\n hasNearConstraint = constraints.some((prop) => Object.keys(prop).some((key) => key === 'near'))\n }\n\n const sortAggregation: PipelineStage[] = []\n\n let sort\n if (!hasNearConstraint) {\n sort = buildSortParam({\n adapter: this,\n config: this.payload.config,\n fields: collectionConfig.flattenedFields,\n locale,\n sort: sortArg || collectionConfig.defaultSort,\n sortAggregation,\n timestamps: collectionConfig.timestamps || false,\n })\n }\n\n const query = await buildQuery({\n adapter: this,\n collectionSlug,\n fields: collectionConfig.flattenedFields,\n locale,\n where,\n })\n\n const session = await getSession(this, req)\n\n // useEstimatedCount is faster, but not accurate, as it ignores any filters. It is thus set to true if there are no filters.\n const useEstimatedCount = hasNearConstraint || !query || Object.keys(query).length === 0\n const paginationOptions: PaginateOptions = {\n lean: true,\n leanWithId: true,\n options: {\n session,\n },\n page,\n pagination,\n projection,\n sort,\n useEstimatedCount,\n }\n\n if (select) {\n paginationOptions.projection = buildProjectionFromSelect({\n adapter: this,\n fields: collectionConfig.flattenedFields,\n select,\n })\n }\n\n if (this.collation) {\n const localizationConfig = this.payload.config.localization\n const defaultLocale =\n (typeof localizationConfig === 'object' && localizationConfig?.defaultLocale) || 'en'\n\n paginationOptions.collation = {\n locale: locale && locale !== 'all' && locale !== '*' ? locale : defaultLocale,\n ...this.collation,\n }\n }\n\n if (!useEstimatedCount && Object.keys(query).length === 0 && this.disableIndexHints !== true) {\n // Improve the performance of the countDocuments query which is used if useEstimatedCount is set to false by adding\n // a hint. By default, if no hint is provided, MongoDB does not use an indexed field to count the returned documents,\n // which makes queries very slow. This only happens when no query (filter) is provided. If one is provided, it uses\n // the correct indexed field\n paginationOptions.useCustomCountFn = () => {\n return Promise.resolve(\n Model.countDocuments(query, {\n collation: paginationOptions.collation,\n hint: { _id: 1 },\n session,\n }),\n )\n }\n } else if (!useEstimatedCount && this.collation) {\n // Workaround for mongoose-paginate-v2 bug: chaining .collation() on countDocuments breaks\n // session context in transactions (mongoose 8.x). Provide custom count function that passes\n // collation as an option instead. See: https://github.com/aravindnc/mongoose-paginate-v2/pull/240\n // TODO: Remove this workaround once mongoose-paginate-v2 is updated with the fix.\n paginationOptions.useCustomCountFn = () => {\n return Promise.resolve(\n Model.countDocuments(query, {\n collation: paginationOptions.collation,\n session,\n }),\n )\n }\n }\n\n if (limit >= 0) {\n paginationOptions.limit = limit\n // limit must also be set here, it's ignored when pagination is false\n\n paginationOptions.options!.limit = limit\n\n // Disable pagination if limit is 0\n if (limit === 0) {\n paginationOptions.pagination = false\n }\n }\n\n let result\n\n const aggregate = await buildJoinAggregation({\n adapter: this,\n collection: collectionSlug,\n collectionConfig,\n draftsEnabled,\n joins,\n locale,\n projection: paginationOptions.projection,\n query,\n })\n\n if (aggregate.length > 0 || sortAggregation.length > 0) {\n result = await aggregatePaginate({\n adapter: this,\n collation: paginationOptions.collation,\n joinAggregation: aggregate,\n limit: paginationOptions.limit,\n Model,\n page: paginationOptions.page,\n pagination: paginationOptions.pagination,\n projection: paginationOptions.projection,\n query,\n session: paginationOptions.options?.session ?? undefined,\n sort: paginationOptions.sort as object,\n sortAggregation,\n useEstimatedCount: paginationOptions.useEstimatedCount,\n })\n } else {\n result = await Model.paginate(query, paginationOptions)\n }\n\n if (!this.useJoinAggregations) {\n await resolveJoins({\n adapter: this,\n collectionSlug,\n docs: result.docs as Record<string, unknown>[],\n joins,\n locale,\n })\n }\n\n transform({\n adapter: this,\n data: result.docs,\n fields: collectionConfig.fields,\n operation: 'read',\n })\n\n return result\n}\n"],"names":["flattenWhereToOperators","buildQuery","buildSortParam","aggregatePaginate","buildJoinAggregation","buildProjectionFromSelect","getCollection","getSession","resolveJoins","transform","find","collection","collectionSlug","draftsEnabled","joins","limit","locale","page","pagination","projection","req","select","sort","sortArg","where","collectionConfig","Model","adapter","hasNearConstraint","constraints","some","prop","Object","keys","key","sortAggregation","config","payload","fields","flattenedFields","defaultSort","timestamps","query","session","useEstimatedCount","length","paginationOptions","lean","leanWithId","options","collation","localizationConfig","localization","defaultLocale","disableIndexHints","useCustomCountFn","Promise","resolve","countDocuments","hint","_id","result","aggregate","joinAggregation","undefined","paginate","useJoinAggregations","docs","data","operation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/find.ts"],"sourcesContent":["import type { PaginateOptions, PipelineStage } from 'mongoose'\nimport type { Find } from 'payload'\n\nimport {\n applyBranchIDProjection,\n flattenWhereToOperators,\n resolveBranchQuery,\n resolveBranchReadState,\n rewriteBranchIDs,\n withBranchIDSelect,\n} from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildBranchVisibilityStages } from './queries/buildBranchVisibility.js'\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildSortParam } from './queries/buildSortParam.js'\nimport { aggregatePaginate } from './utilities/aggregatePaginate.js'\nimport { buildJoinAggregation } from './utilities/buildJoinAggregation.js'\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\nimport { resolveJoins } from './utilities/resolveJoins.js'\nimport { transform } from './utilities/transform.js'\n\nexport const find: Find = async function find(\n this: MongooseAdapter,\n {\n branch,\n collection: collectionSlug,\n draftsEnabled,\n joins = {},\n limit = 0,\n locale,\n page,\n pagination,\n projection,\n req,\n select,\n sort: sortArg,\n where = {},\n },\n) {\n const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug })\n const branchReadState = resolveBranchReadState({ branch, collectionSlug, req })\n\n where = branchReadState.useBranching\n ? (rewriteBranchIDs(where) ?? {})\n : ((await resolveBranchQuery({ branch, collectionSlug, req, where })) ?? {})\n const branchVisibility = branchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter: this,\n branch: branchReadState.branch,\n collectionSlug,\n })\n : []\n\n let hasNearConstraint = false\n\n if (where) {\n const constraints = flattenWhereToOperators(where)\n hasNearConstraint = constraints.some((prop) => Object.keys(prop).some((key) => key === 'near'))\n }\n\n const sortAggregation: PipelineStage[] = []\n\n let sort\n if (!hasNearConstraint) {\n sort = buildSortParam({\n adapter: this,\n config: this.payload.config,\n fields: collectionConfig.flattenedFields,\n locale,\n sort: sortArg || collectionConfig.defaultSort,\n sortAggregation,\n timestamps: collectionConfig.timestamps || false,\n })\n }\n\n const query = await buildQuery({\n adapter: this,\n branch,\n collectionSlug,\n fields: collectionConfig.flattenedFields,\n locale,\n req,\n where,\n })\n\n const session = await getSession(this, req)\n\n // useEstimatedCount is faster, but not accurate, as it ignores any filters. It is thus set to true if there are no filters.\n const useEstimatedCount =\n !branchVisibility.length && (hasNearConstraint || !query || Object.keys(query).length === 0)\n const paginationOptions: PaginateOptions = {\n lean: true,\n leanWithId: true,\n options: {\n session,\n },\n page,\n pagination,\n projection,\n sort,\n useEstimatedCount,\n }\n\n const selectWithBranchID = withBranchIDSelect({ branch, collectionSlug, req, select })\n\n if (selectWithBranchID) {\n paginationOptions.projection = buildProjectionFromSelect({\n adapter: this,\n fields: collectionConfig.flattenedFields,\n select: selectWithBranchID,\n })\n }\n\n if (this.collation) {\n const localizationConfig = this.payload.config.localization\n const defaultLocale =\n (typeof localizationConfig === 'object' && localizationConfig?.defaultLocale) || 'en'\n\n paginationOptions.collation = {\n locale: locale && locale !== 'all' && locale !== '*' ? locale : defaultLocale,\n ...this.collation,\n }\n }\n\n if (!useEstimatedCount && Object.keys(query).length === 0 && this.disableIndexHints !== true) {\n // Improve the performance of the countDocuments query which is used if useEstimatedCount is set to false by adding\n // a hint. By default, if no hint is provided, MongoDB does not use an indexed field to count the returned documents,\n // which makes queries very slow. This only happens when no query (filter) is provided. If one is provided, it uses\n // the correct indexed field\n paginationOptions.useCustomCountFn = () => {\n return Promise.resolve(\n Model.countDocuments(query, {\n collation: paginationOptions.collation,\n hint: { _id: 1 },\n session,\n }),\n )\n }\n } else if (!useEstimatedCount && this.collation) {\n // Workaround for mongoose-paginate-v2 bug: chaining .collation() on countDocuments breaks\n // session context in transactions (mongoose 8.x). Provide custom count function that passes\n // collation as an option instead. See: https://github.com/aravindnc/mongoose-paginate-v2/pull/240\n // TODO: Remove this workaround once mongoose-paginate-v2 is updated with the fix.\n paginationOptions.useCustomCountFn = () => {\n return Promise.resolve(\n Model.countDocuments(query, {\n collation: paginationOptions.collation,\n session,\n }),\n )\n }\n }\n\n if (limit >= 0) {\n paginationOptions.limit = limit\n // limit must also be set here, it's ignored when pagination is false\n\n paginationOptions.options!.limit = limit\n\n // Disable pagination if limit is 0\n if (limit === 0) {\n paginationOptions.pagination = false\n }\n }\n\n let result\n\n const aggregate = await buildJoinAggregation({\n adapter: this,\n branch,\n collection: collectionSlug,\n collectionConfig,\n draftsEnabled,\n joins,\n locale,\n projection: paginationOptions.projection,\n query,\n req,\n })\n\n if (aggregate.length > 0 || branchVisibility.length > 0 || sortAggregation.length > 0) {\n result = await aggregatePaginate({\n adapter: this,\n branchVisibility,\n collation: paginationOptions.collation,\n joinAggregation: aggregate,\n limit: paginationOptions.limit,\n Model,\n page: paginationOptions.page,\n pagination: paginationOptions.pagination,\n projection: paginationOptions.projection,\n query,\n session: paginationOptions.options?.session ?? undefined,\n sort: paginationOptions.sort as object,\n sortAggregation,\n useEstimatedCount: paginationOptions.useEstimatedCount,\n })\n } else {\n result = await Model.paginate(query, paginationOptions)\n }\n\n if (!this.useJoinAggregations) {\n await resolveJoins({\n adapter: this,\n branch,\n collectionSlug,\n docs: result.docs as Record<string, unknown>[],\n joins,\n locale,\n req,\n })\n }\n\n transform({\n adapter: this,\n data: result.docs,\n fields: collectionConfig.fields,\n operation: 'read',\n })\n\n applyBranchIDProjection({\n branch,\n collectionSlug,\n docs: result.docs as Record<string, unknown>[],\n req,\n })\n\n return result\n}\n"],"names":["applyBranchIDProjection","flattenWhereToOperators","resolveBranchQuery","resolveBranchReadState","rewriteBranchIDs","withBranchIDSelect","buildBranchVisibilityStages","buildQuery","buildSortParam","aggregatePaginate","buildJoinAggregation","buildProjectionFromSelect","getCollection","getSession","resolveJoins","transform","find","branch","collection","collectionSlug","draftsEnabled","joins","limit","locale","page","pagination","projection","req","select","sort","sortArg","where","collectionConfig","Model","adapter","branchReadState","useBranching","branchVisibility","hasNearConstraint","constraints","some","prop","Object","keys","key","sortAggregation","config","payload","fields","flattenedFields","defaultSort","timestamps","query","session","useEstimatedCount","length","paginationOptions","lean","leanWithId","options","selectWithBranchID","collation","localizationConfig","localization","defaultLocale","disableIndexHints","useCustomCountFn","Promise","resolve","countDocuments","hint","_id","result","aggregate","joinAggregation","undefined","paginate","useJoinAggregations","docs","data","operation"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findDistinct.d.ts","sourceRoot":"","sources":["../src/findDistinct.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"findDistinct.d.ts","sourceRoot":"","sources":["../src/findDistinct.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,SAAS,CAAA;AAmD3D,eAAO,MAAM,YAAY,EAAE,YAqW1B,CAAA"}
|
package/dist/findDistinct.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { getFieldByPath } from 'payload';
|
|
1
|
+
import { getFieldByPath, resolveBranchQuery, resolveBranchReadState, rewriteBranchIDs } from 'payload';
|
|
2
|
+
import { buildBranchVisibilityStages } from './queries/buildBranchVisibility.js';
|
|
2
3
|
import { buildQuery } from './queries/buildQuery.js';
|
|
3
4
|
import { buildSortParam } from './queries/buildSortParam.js';
|
|
4
5
|
import { getCollection } from './utilities/getEntity.js';
|
|
@@ -29,7 +30,25 @@ export const findDistinct = async function(args) {
|
|
|
29
30
|
adapter: this,
|
|
30
31
|
collectionSlug: args.collection
|
|
31
32
|
});
|
|
32
|
-
const
|
|
33
|
+
const branchReadState = resolveBranchReadState({
|
|
34
|
+
branch: args.branch,
|
|
35
|
+
collectionSlug: args.collection,
|
|
36
|
+
req: args.req
|
|
37
|
+
});
|
|
38
|
+
// Distinct values describe the documents the caller can see, so they are subject to
|
|
39
|
+
// the same branch predicate as a list read. Without it a branch's shadow rows fed
|
|
40
|
+
// main's distinct values and the branch's own edits were invisible in its own.
|
|
41
|
+
const where = branchReadState.useBranching ? rewriteBranchIDs(args.where) ?? {} : await resolveBranchQuery({
|
|
42
|
+
branch: args.branch,
|
|
43
|
+
collectionSlug: args.collection,
|
|
44
|
+
req: args.req,
|
|
45
|
+
where: args.where
|
|
46
|
+
}) ?? {};
|
|
47
|
+
const branchVisibility = branchReadState.useBranching ? buildBranchVisibilityStages({
|
|
48
|
+
adapter: this,
|
|
49
|
+
branch: branchReadState.branch,
|
|
50
|
+
collectionSlug: args.collection
|
|
51
|
+
}) : [];
|
|
33
52
|
let sortAggregation = [];
|
|
34
53
|
const sort = buildSortParam({
|
|
35
54
|
adapter: this,
|
|
@@ -42,9 +61,11 @@ export const findDistinct = async function(args) {
|
|
|
42
61
|
});
|
|
43
62
|
const query = await buildQuery({
|
|
44
63
|
adapter: this,
|
|
64
|
+
branch: args.branch,
|
|
45
65
|
collectionSlug: args.collection,
|
|
46
66
|
fields: collectionConfig.flattenedFields,
|
|
47
67
|
locale: args.locale,
|
|
68
|
+
req: args.req,
|
|
48
69
|
where
|
|
49
70
|
});
|
|
50
71
|
const fieldPathResult = getFieldByPath({
|
|
@@ -53,7 +74,7 @@ export const findDistinct = async function(args) {
|
|
|
53
74
|
includeRelationships: true,
|
|
54
75
|
path: args.field
|
|
55
76
|
});
|
|
56
|
-
let fieldPath = args.field;
|
|
77
|
+
let fieldPath = args.field === 'id' ? '_id' : args.field;
|
|
57
78
|
if (fieldPathResult?.pathHasLocalized && args.locale) {
|
|
58
79
|
fieldPath = fieldPathResult.localizedPath.replace('<locale>', args.locale);
|
|
59
80
|
}
|
|
@@ -127,18 +148,36 @@ export const findDistinct = async function(args) {
|
|
|
127
148
|
collectionSlug: relationTo
|
|
128
149
|
});
|
|
129
150
|
const relatedAccess = args.relatedAccess?.[fieldPath];
|
|
130
|
-
const
|
|
151
|
+
const relatedBranchReadState = resolveBranchReadState({
|
|
152
|
+
branch: args.branch,
|
|
153
|
+
collectionSlug: relationTo,
|
|
154
|
+
req: args.req
|
|
155
|
+
});
|
|
156
|
+
const relatedWhere = relatedBranchReadState.useBranching ? rewriteBranchIDs(relatedAccess) : await resolveBranchQuery({
|
|
157
|
+
branch: args.branch,
|
|
158
|
+
collectionSlug: relationTo,
|
|
159
|
+
req: args.req,
|
|
160
|
+
where: relatedAccess
|
|
161
|
+
});
|
|
162
|
+
const relatedQuery = relatedWhere && Object.keys(relatedWhere).length ? await buildQuery({
|
|
131
163
|
adapter: this,
|
|
164
|
+
branch: args.branch,
|
|
132
165
|
collectionSlug: relationTo,
|
|
133
166
|
fields: foreignCollectionConfig.flattenedFields,
|
|
134
167
|
locale: args.locale,
|
|
135
|
-
|
|
168
|
+
req: args.req,
|
|
169
|
+
where: relatedWhere
|
|
136
170
|
}) : null;
|
|
171
|
+
const relatedBranchVisibility = relatedBranchReadState.useBranching ? buildBranchVisibilityStages({
|
|
172
|
+
adapter: this,
|
|
173
|
+
branch: relatedBranchReadState.branch,
|
|
174
|
+
collectionSlug: relationTo
|
|
175
|
+
}) : [];
|
|
137
176
|
relationLookup.push({
|
|
138
177
|
$lookup: {
|
|
139
178
|
as: fieldPath,
|
|
140
179
|
from: foreignModel.collection.name,
|
|
141
|
-
...
|
|
180
|
+
...relatedQuery || relatedBranchVisibility.length ? {
|
|
142
181
|
let: {
|
|
143
182
|
relatedIDs: `$${fieldPath}`
|
|
144
183
|
},
|
|
@@ -151,7 +190,12 @@ export const findDistinct = async function(args) {
|
|
|
151
190
|
$cond: {
|
|
152
191
|
else: {
|
|
153
192
|
$eq: [
|
|
154
|
-
|
|
193
|
+
{
|
|
194
|
+
$ifNull: [
|
|
195
|
+
'$_branchDocID',
|
|
196
|
+
'$_id'
|
|
197
|
+
]
|
|
198
|
+
},
|
|
155
199
|
'$$relatedIDs'
|
|
156
200
|
]
|
|
157
201
|
},
|
|
@@ -160,17 +204,25 @@ export const findDistinct = async function(args) {
|
|
|
160
204
|
},
|
|
161
205
|
then: {
|
|
162
206
|
$in: [
|
|
163
|
-
|
|
207
|
+
{
|
|
208
|
+
$ifNull: [
|
|
209
|
+
'$_branchDocID',
|
|
210
|
+
'$_id'
|
|
211
|
+
]
|
|
212
|
+
},
|
|
164
213
|
'$$relatedIDs'
|
|
165
214
|
]
|
|
166
215
|
}
|
|
167
216
|
}
|
|
168
217
|
}
|
|
169
218
|
},
|
|
170
|
-
|
|
219
|
+
...relatedQuery ? [
|
|
220
|
+
relatedQuery
|
|
221
|
+
] : []
|
|
171
222
|
]
|
|
172
223
|
}
|
|
173
|
-
}
|
|
224
|
+
},
|
|
225
|
+
...relatedBranchVisibility
|
|
174
226
|
]
|
|
175
227
|
} : {
|
|
176
228
|
foreignField: '_id',
|
|
@@ -204,7 +256,12 @@ export const findDistinct = async function(args) {
|
|
|
204
256
|
}
|
|
205
257
|
if (!$group) {
|
|
206
258
|
$group = {
|
|
207
|
-
_id:
|
|
259
|
+
_id: args.field === 'id' && branchReadState.useBranching ? {
|
|
260
|
+
$ifNull: [
|
|
261
|
+
'$_branchDocID',
|
|
262
|
+
'$_id'
|
|
263
|
+
]
|
|
264
|
+
} : `$${fieldPath}`,
|
|
208
265
|
...sortProperty === fieldPath ? {} : {
|
|
209
266
|
_sort: {
|
|
210
267
|
$max: `$${sortProperty}`
|
|
@@ -216,6 +273,7 @@ export const findDistinct = async function(args) {
|
|
|
216
273
|
{
|
|
217
274
|
$match: query
|
|
218
275
|
},
|
|
276
|
+
...branchVisibility,
|
|
219
277
|
...sortAggregation.length > 0 ? sortAggregation : [],
|
|
220
278
|
...relationLookup?.length ? relationLookup : [],
|
|
221
279
|
...$unwind ? [
|
|
@@ -256,6 +314,7 @@ export const findDistinct = async function(args) {
|
|
|
256
314
|
{
|
|
257
315
|
$match: query
|
|
258
316
|
},
|
|
317
|
+
...branchVisibility,
|
|
259
318
|
...sortAggregation.length > 0 ? sortAggregation : [],
|
|
260
319
|
...relationLookup?.length ? relationLookup : [],
|
|
261
320
|
...$unwind ? [
|
package/dist/findDistinct.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/findDistinct.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\nimport type { FindDistinct, FlattenedField } from 'payload'\n\nimport { getFieldByPath } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildSortParam } from './queries/buildSortParam.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\n\nconst sanitizeGroupID = (id: any) => {\n if (id && typeof id === 'object' && '_field' in id) {\n return id._field\n }\n\n return id\n}\n\nconst getSortAggregation = ({\n fieldPath,\n hasSortAggregationAndHasMany,\n sortDirection,\n sortProperty,\n}: {\n fieldPath: string\n hasSortAggregationAndHasMany: boolean\n sortDirection: -1 | 1\n sortProperty: string\n}): Record<string, -1 | 1> => {\n let resolvedSortProperty: string\n\n if (hasSortAggregationAndHasMany) {\n if (sortProperty === fieldPath) {\n resolvedSortProperty = `_id._field`\n } else {\n resolvedSortProperty = `_id._sort`\n }\n } else {\n resolvedSortProperty = sortProperty === fieldPath ? '_id' : '_sort'\n }\n\n return { [`${resolvedSortProperty}`]: sortDirection }\n}\n\nexport const findDistinct: FindDistinct = async function (this: MongooseAdapter, args) {\n const { collectionConfig, Model } = getCollection({\n adapter: this,\n collectionSlug: args.collection,\n })\n\n const { where = {} } = args\n\n let sortAggregation: PipelineStage[] = []\n\n const sort = buildSortParam({\n adapter: this,\n config: this.payload.config,\n fields: collectionConfig.flattenedFields,\n locale: args.locale,\n sort: args.sort ?? args.field,\n sortAggregation,\n timestamps: true,\n })\n\n const query = await buildQuery({\n adapter: this,\n collectionSlug: args.collection,\n fields: collectionConfig.flattenedFields,\n locale: args.locale,\n where,\n })\n\n const fieldPathResult = getFieldByPath({\n config: this.payload.config,\n fields: collectionConfig.flattenedFields,\n includeRelationships: true,\n path: args.field,\n })\n let fieldPath = args.field\n if (fieldPathResult?.pathHasLocalized && args.locale) {\n fieldPath = fieldPathResult.localizedPath.replace('<locale>', args.locale)\n }\n\n const page = args.page || 1\n\n let sortProperty = Object.keys(sort)[0]! // assert because buildSortParam always returns at least 1 key.\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n let currentFields = collectionConfig.flattenedFields\n let foundField: FlattenedField | null = null\n\n let rels: {\n fieldPath: string\n relationTo: string\n }[] = []\n\n let tempPath = ''\n let insideRelation = false\n\n const segments = args.field.split('.')\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]\n const field = currentFields.find((e) => e.name === segment)\n if (rels.length) {\n insideRelation = true\n }\n\n if (!field) {\n break\n }\n\n if (tempPath) {\n tempPath = `${tempPath}.${field.name}`\n } else {\n tempPath = field.name\n }\n\n if ('flattenedFields' in field) {\n currentFields = field.flattenedFields\n continue\n }\n\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n typeof field.relationTo === 'string'\n ) {\n if (i === segments.length - 2 && segments[i + 1] === 'id') {\n foundField = field\n fieldPath = tempPath\n break\n }\n rels.push({ fieldPath: tempPath, relationTo: field.relationTo })\n currentFields = this.payload.collections[field.relationTo]?.config\n .flattenedFields as FlattenedField[]\n continue\n }\n foundField = field\n }\n\n const resolvedField = foundField || fieldPathResult?.field\n const isHasManyValue = resolvedField && 'hasMany' in resolvedField && resolvedField\n\n let relationLookup: null | PipelineStage[] = null\n\n if (!insideRelation) {\n rels = []\n }\n\n if (rels.length) {\n if (sortProperty.startsWith('_')) {\n const sortWithoutRelationPrefix = sortProperty.replace(/^_+/, '')\n const lastFieldPath = rels.at(-1)?.fieldPath as string\n if (sortWithoutRelationPrefix.startsWith(lastFieldPath)) {\n sortProperty = sortWithoutRelationPrefix\n }\n }\n relationLookup = []\n for (const { fieldPath, relationTo } of rels) {\n sortAggregation = sortAggregation.filter((each) => {\n if ('$lookup' in each && each.$lookup.as.replace(/^_+/, '') === fieldPath) {\n return false\n }\n\n return true\n })\n const { collectionConfig: foreignCollectionConfig, Model: foreignModel } = getCollection({\n adapter: this,\n collectionSlug: relationTo,\n })\n const relatedAccess = args.relatedAccess?.[fieldPath]\n const relatedAccessQuery = relatedAccess\n ? await buildQuery({\n adapter: this,\n collectionSlug: relationTo,\n fields: foreignCollectionConfig.flattenedFields,\n locale: args.locale,\n where: relatedAccess,\n })\n : null\n\n relationLookup.push({\n $lookup: {\n as: fieldPath,\n from: foreignModel.collection.name,\n ...(relatedAccessQuery\n ? {\n let: { relatedIDs: `$${fieldPath}` },\n pipeline: [\n {\n $match: {\n $and: [\n {\n $expr: {\n $cond: {\n else: { $eq: ['$_id', '$$relatedIDs'] },\n if: { $isArray: '$$relatedIDs' },\n then: { $in: ['$_id', '$$relatedIDs'] },\n },\n },\n },\n relatedAccessQuery,\n ],\n },\n },\n ],\n }\n : {\n foreignField: '_id',\n localField: fieldPath,\n }),\n },\n })\n relationLookup.push({ $unwind: `$${fieldPath}` })\n }\n }\n\n let $unwind: any = ''\n let $group: any = null\n if (\n isHasManyValue &&\n sortAggregation.length &&\n sortAggregation[0] &&\n '$lookup' in sortAggregation[0]\n ) {\n $unwind = { path: `$${sortAggregation[0].$lookup.as}`, preserveNullAndEmptyArrays: true }\n $group = {\n _id: {\n _field: `$${sortAggregation[0].$lookup.as}._id`,\n _sort: `$${sortProperty}`,\n },\n }\n } else if (isHasManyValue) {\n $unwind = { path: `$${args.field}`, preserveNullAndEmptyArrays: true }\n }\n\n if (!$group) {\n $group = {\n _id: `$${fieldPath}`,\n ...(sortProperty === fieldPath\n ? {}\n : {\n _sort: { $max: `$${sortProperty}` },\n }),\n }\n }\n\n const pipeline: PipelineStage[] = [\n {\n $match: query,\n },\n ...(sortAggregation.length > 0 ? sortAggregation : []),\n ...(relationLookup?.length ? relationLookup : []),\n ...($unwind\n ? [\n {\n $unwind,\n },\n ]\n : []),\n {\n $group,\n },\n {\n $sort: getSortAggregation({\n fieldPath,\n hasSortAggregationAndHasMany: Boolean(isHasManyValue) && Boolean(sortAggregation.length),\n sortDirection,\n sortProperty,\n }),\n },\n ]\n\n const session = await getSession(this, args.req)\n\n const getValues = async () => {\n return Model.aggregate(pipeline, { session }).then((res) =>\n res.map((each) => ({\n [args.field]: JSON.parse(JSON.stringify(sanitizeGroupID(each._id))),\n })),\n )\n }\n\n if (args.limit) {\n pipeline.push({\n $skip: (page - 1) * args.limit,\n })\n pipeline.push({ $limit: args.limit })\n\n // Build count pipeline with the same structure as the main pipeline\n // to ensure relationship lookups are included\n const countPipeline: PipelineStage[] = [\n {\n $match: query,\n },\n ...(sortAggregation.length > 0 ? sortAggregation : []),\n ...(relationLookup?.length ? relationLookup : []),\n ...($unwind\n ? [\n {\n $unwind,\n },\n ]\n : []),\n {\n $group,\n },\n { $count: 'count' },\n ]\n\n const totalDocs = await Model.aggregate(countPipeline, {\n session,\n }).then((res) => res[0]?.count ?? 0)\n const totalPages = Math.ceil(totalDocs / args.limit)\n const hasPrevPage = page > 1\n const hasNextPage = totalPages > page\n const pagingCounter = (page - 1) * args.limit + 1\n\n return {\n hasNextPage,\n hasPrevPage,\n limit: args.limit,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter,\n prevPage: hasPrevPage ? page - 1 : null,\n totalDocs,\n totalPages,\n values: await getValues(),\n }\n }\n\n const values = await getValues()\n\n return {\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n page: 1,\n pagingCounter: 1,\n totalDocs: values.length,\n totalPages: 1,\n values,\n }\n}\n"],"names":["getFieldByPath","buildQuery","buildSortParam","getCollection","getSession","sanitizeGroupID","id","_field","getSortAggregation","fieldPath","hasSortAggregationAndHasMany","sortDirection","sortProperty","resolvedSortProperty","findDistinct","args","collectionConfig","Model","adapter","collectionSlug","collection","where","sortAggregation","sort","config","payload","fields","flattenedFields","locale","field","timestamps","query","fieldPathResult","includeRelationships","path","pathHasLocalized","localizedPath","replace","page","Object","keys","currentFields","foundField","rels","tempPath","insideRelation","segments","split","i","length","segment","find","e","name","type","relationTo","push","collections","resolvedField","isHasManyValue","relationLookup","startsWith","sortWithoutRelationPrefix","lastFieldPath","at","filter","each","$lookup","as","foreignCollectionConfig","foreignModel","relatedAccess","relatedAccessQuery","from","let","relatedIDs","pipeline","$match","$and","$expr","$cond","else","$eq","if","$isArray","then","$in","foreignField","localField","$unwind","$group","preserveNullAndEmptyArrays","_id","_sort","$max","$sort","Boolean","session","req","getValues","aggregate","res","map","JSON","parse","stringify","limit","$skip","$limit","countPipeline","$count","totalDocs","count","totalPages","Math","ceil","hasPrevPage","hasNextPage","pagingCounter","nextPage","prevPage","values"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/findDistinct.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\nimport type { FindDistinct, FlattenedField } from 'payload'\n\nimport {\n getFieldByPath,\n resolveBranchQuery,\n resolveBranchReadState,\n rewriteBranchIDs,\n} from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildBranchVisibilityStages } from './queries/buildBranchVisibility.js'\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildSortParam } from './queries/buildSortParam.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\n\nconst sanitizeGroupID = (id: any) => {\n if (id && typeof id === 'object' && '_field' in id) {\n return id._field\n }\n\n return id\n}\n\nconst getSortAggregation = ({\n fieldPath,\n hasSortAggregationAndHasMany,\n sortDirection,\n sortProperty,\n}: {\n fieldPath: string\n hasSortAggregationAndHasMany: boolean\n sortDirection: -1 | 1\n sortProperty: string\n}): Record<string, -1 | 1> => {\n let resolvedSortProperty: string\n\n if (hasSortAggregationAndHasMany) {\n if (sortProperty === fieldPath) {\n resolvedSortProperty = `_id._field`\n } else {\n resolvedSortProperty = `_id._sort`\n }\n } else {\n resolvedSortProperty = sortProperty === fieldPath ? '_id' : '_sort'\n }\n\n return { [`${resolvedSortProperty}`]: sortDirection }\n}\n\nexport const findDistinct: FindDistinct = async function (this: MongooseAdapter, args) {\n const { collectionConfig, Model } = getCollection({\n adapter: this,\n collectionSlug: args.collection,\n })\n const branchReadState = resolveBranchReadState({\n branch: args.branch,\n collectionSlug: args.collection,\n req: args.req,\n })\n\n // Distinct values describe the documents the caller can see, so they are subject to\n // the same branch predicate as a list read. Without it a branch's shadow rows fed\n // main's distinct values and the branch's own edits were invisible in its own.\n const where = branchReadState.useBranching\n ? (rewriteBranchIDs(args.where) ?? {})\n : ((await resolveBranchQuery({\n branch: args.branch,\n collectionSlug: args.collection,\n req: args.req,\n where: args.where,\n })) ?? {})\n const branchVisibility = branchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter: this,\n branch: branchReadState.branch,\n collectionSlug: args.collection,\n })\n : []\n\n let sortAggregation: PipelineStage[] = []\n\n const sort = buildSortParam({\n adapter: this,\n config: this.payload.config,\n fields: collectionConfig.flattenedFields,\n locale: args.locale,\n sort: args.sort ?? args.field,\n sortAggregation,\n timestamps: true,\n })\n\n const query = await buildQuery({\n adapter: this,\n branch: args.branch,\n collectionSlug: args.collection,\n fields: collectionConfig.flattenedFields,\n locale: args.locale,\n req: args.req,\n where,\n })\n\n const fieldPathResult = getFieldByPath({\n config: this.payload.config,\n fields: collectionConfig.flattenedFields,\n includeRelationships: true,\n path: args.field,\n })\n let fieldPath = args.field === 'id' ? '_id' : args.field\n if (fieldPathResult?.pathHasLocalized && args.locale) {\n fieldPath = fieldPathResult.localizedPath.replace('<locale>', args.locale)\n }\n\n const page = args.page || 1\n\n let sortProperty = Object.keys(sort)[0]! // assert because buildSortParam always returns at least 1 key.\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n let currentFields = collectionConfig.flattenedFields\n let foundField: FlattenedField | null = null\n\n let rels: {\n fieldPath: string\n relationTo: string\n }[] = []\n\n let tempPath = ''\n let insideRelation = false\n\n const segments = args.field.split('.')\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]\n const field = currentFields.find((e) => e.name === segment)\n if (rels.length) {\n insideRelation = true\n }\n\n if (!field) {\n break\n }\n\n if (tempPath) {\n tempPath = `${tempPath}.${field.name}`\n } else {\n tempPath = field.name\n }\n\n if ('flattenedFields' in field) {\n currentFields = field.flattenedFields\n continue\n }\n\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n typeof field.relationTo === 'string'\n ) {\n if (i === segments.length - 2 && segments[i + 1] === 'id') {\n foundField = field\n fieldPath = tempPath\n break\n }\n rels.push({ fieldPath: tempPath, relationTo: field.relationTo })\n currentFields = this.payload.collections[field.relationTo]?.config\n .flattenedFields as FlattenedField[]\n continue\n }\n foundField = field\n }\n\n const resolvedField = foundField || fieldPathResult?.field\n const isHasManyValue = resolvedField && 'hasMany' in resolvedField && resolvedField\n\n let relationLookup: null | PipelineStage[] = null\n\n if (!insideRelation) {\n rels = []\n }\n\n if (rels.length) {\n if (sortProperty.startsWith('_')) {\n const sortWithoutRelationPrefix = sortProperty.replace(/^_+/, '')\n const lastFieldPath = rels.at(-1)?.fieldPath as string\n if (sortWithoutRelationPrefix.startsWith(lastFieldPath)) {\n sortProperty = sortWithoutRelationPrefix\n }\n }\n relationLookup = []\n for (const { fieldPath, relationTo } of rels) {\n sortAggregation = sortAggregation.filter((each) => {\n if ('$lookup' in each && each.$lookup.as.replace(/^_+/, '') === fieldPath) {\n return false\n }\n\n return true\n })\n const { collectionConfig: foreignCollectionConfig, Model: foreignModel } = getCollection({\n adapter: this,\n collectionSlug: relationTo,\n })\n const relatedAccess = args.relatedAccess?.[fieldPath]\n const relatedBranchReadState = resolveBranchReadState({\n branch: args.branch,\n collectionSlug: relationTo,\n req: args.req,\n })\n const relatedWhere = relatedBranchReadState.useBranching\n ? rewriteBranchIDs(relatedAccess)\n : await resolveBranchQuery({\n branch: args.branch,\n collectionSlug: relationTo,\n req: args.req,\n where: relatedAccess,\n })\n const relatedQuery =\n relatedWhere && Object.keys(relatedWhere).length\n ? await buildQuery({\n adapter: this,\n branch: args.branch,\n collectionSlug: relationTo,\n fields: foreignCollectionConfig.flattenedFields,\n locale: args.locale,\n req: args.req,\n where: relatedWhere,\n })\n : null\n const relatedBranchVisibility = relatedBranchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter: this,\n branch: relatedBranchReadState.branch,\n collectionSlug: relationTo,\n })\n : []\n\n relationLookup.push({\n $lookup: {\n as: fieldPath,\n from: foreignModel.collection.name,\n ...(relatedQuery || relatedBranchVisibility.length\n ? {\n let: { relatedIDs: `$${fieldPath}` },\n pipeline: [\n {\n $match: {\n $and: [\n {\n $expr: {\n $cond: {\n else: {\n $eq: [{ $ifNull: ['$_branchDocID', '$_id'] }, '$$relatedIDs'],\n },\n if: { $isArray: '$$relatedIDs' },\n then: {\n $in: [{ $ifNull: ['$_branchDocID', '$_id'] }, '$$relatedIDs'],\n },\n },\n },\n },\n ...(relatedQuery ? [relatedQuery] : []),\n ],\n },\n },\n ...relatedBranchVisibility,\n ],\n }\n : {\n foreignField: '_id',\n localField: fieldPath,\n }),\n },\n })\n relationLookup.push({ $unwind: `$${fieldPath}` })\n }\n }\n\n let $unwind: any = ''\n let $group: any = null\n if (\n isHasManyValue &&\n sortAggregation.length &&\n sortAggregation[0] &&\n '$lookup' in sortAggregation[0]\n ) {\n $unwind = { path: `$${sortAggregation[0].$lookup.as}`, preserveNullAndEmptyArrays: true }\n $group = {\n _id: {\n _field: `$${sortAggregation[0].$lookup.as}._id`,\n _sort: `$${sortProperty}`,\n },\n }\n } else if (isHasManyValue) {\n $unwind = { path: `$${args.field}`, preserveNullAndEmptyArrays: true }\n }\n\n if (!$group) {\n $group = {\n _id:\n args.field === 'id' && branchReadState.useBranching\n ? { $ifNull: ['$_branchDocID', '$_id'] }\n : `$${fieldPath}`,\n ...(sortProperty === fieldPath\n ? {}\n : {\n _sort: { $max: `$${sortProperty}` },\n }),\n }\n }\n\n const pipeline: PipelineStage[] = [\n {\n $match: query,\n },\n ...branchVisibility,\n ...(sortAggregation.length > 0 ? sortAggregation : []),\n ...(relationLookup?.length ? relationLookup : []),\n ...($unwind\n ? [\n {\n $unwind,\n },\n ]\n : []),\n {\n $group,\n },\n {\n $sort: getSortAggregation({\n fieldPath,\n hasSortAggregationAndHasMany: Boolean(isHasManyValue) && Boolean(sortAggregation.length),\n sortDirection,\n sortProperty,\n }),\n },\n ]\n\n const session = await getSession(this, args.req)\n\n const getValues = async () => {\n return Model.aggregate(pipeline, { session }).then((res) =>\n res.map((each) => ({\n [args.field]: JSON.parse(JSON.stringify(sanitizeGroupID(each._id))),\n })),\n )\n }\n\n if (args.limit) {\n pipeline.push({\n $skip: (page - 1) * args.limit,\n })\n pipeline.push({ $limit: args.limit })\n\n // Build count pipeline with the same structure as the main pipeline\n // to ensure relationship lookups are included\n const countPipeline: PipelineStage[] = [\n {\n $match: query,\n },\n ...branchVisibility,\n ...(sortAggregation.length > 0 ? sortAggregation : []),\n ...(relationLookup?.length ? relationLookup : []),\n ...($unwind\n ? [\n {\n $unwind,\n },\n ]\n : []),\n {\n $group,\n },\n { $count: 'count' },\n ]\n\n const totalDocs = await Model.aggregate(countPipeline, {\n session,\n }).then((res) => res[0]?.count ?? 0)\n const totalPages = Math.ceil(totalDocs / args.limit)\n const hasPrevPage = page > 1\n const hasNextPage = totalPages > page\n const pagingCounter = (page - 1) * args.limit + 1\n\n return {\n hasNextPage,\n hasPrevPage,\n limit: args.limit,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter,\n prevPage: hasPrevPage ? page - 1 : null,\n totalDocs,\n totalPages,\n values: await getValues(),\n }\n }\n\n const values = await getValues()\n\n return {\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n page: 1,\n pagingCounter: 1,\n totalDocs: values.length,\n totalPages: 1,\n values,\n }\n}\n"],"names":["getFieldByPath","resolveBranchQuery","resolveBranchReadState","rewriteBranchIDs","buildBranchVisibilityStages","buildQuery","buildSortParam","getCollection","getSession","sanitizeGroupID","id","_field","getSortAggregation","fieldPath","hasSortAggregationAndHasMany","sortDirection","sortProperty","resolvedSortProperty","findDistinct","args","collectionConfig","Model","adapter","collectionSlug","collection","branchReadState","branch","req","where","useBranching","branchVisibility","sortAggregation","sort","config","payload","fields","flattenedFields","locale","field","timestamps","query","fieldPathResult","includeRelationships","path","pathHasLocalized","localizedPath","replace","page","Object","keys","currentFields","foundField","rels","tempPath","insideRelation","segments","split","i","length","segment","find","e","name","type","relationTo","push","collections","resolvedField","isHasManyValue","relationLookup","startsWith","sortWithoutRelationPrefix","lastFieldPath","at","filter","each","$lookup","as","foreignCollectionConfig","foreignModel","relatedAccess","relatedBranchReadState","relatedWhere","relatedQuery","relatedBranchVisibility","from","let","relatedIDs","pipeline","$match","$and","$expr","$cond","else","$eq","$ifNull","if","$isArray","then","$in","foreignField","localField","$unwind","$group","preserveNullAndEmptyArrays","_id","_sort","$max","$sort","Boolean","session","getValues","aggregate","res","map","JSON","parse","stringify","limit","$skip","$limit","countPipeline","$count","totalDocs","count","totalPages","Math","ceil","hasPrevPage","hasNextPage","pagingCounter","nextPage","prevPage","values"],"mappings":"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"}
|
package/dist/findGlobal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findGlobal.d.ts","sourceRoot":"","sources":["../src/findGlobal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"findGlobal.d.ts","sourceRoot":"","sources":["../src/findGlobal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,SAAS,CAAA;AAmBzD,eAAO,MAAM,UAAU,EAAE,UA6DxB,CAAA"}
|
package/dist/findGlobal.js
CHANGED
|
@@ -1,36 +1,75 @@
|
|
|
1
|
-
import { combineQueries } from 'payload';
|
|
1
|
+
import { branchGlobalNeedsBothRows, combineQueries, pickBranchGlobal, resolveBranch, resolveBranchGlobalQuery, withBranchGlobalSelect } from 'payload';
|
|
2
2
|
import { buildQuery } from './queries/buildQuery.js';
|
|
3
3
|
import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js';
|
|
4
4
|
import { getGlobal } from './utilities/getEntity.js';
|
|
5
5
|
import { getSession } from './utilities/getSession.js';
|
|
6
6
|
import { transform } from './utilities/transform.js';
|
|
7
|
-
export const findGlobal = async function findGlobal({ slug: globalSlug, locale, req, select, where = {} }) {
|
|
7
|
+
export const findGlobal = async function findGlobal({ slug: globalSlug, branch, locale, req, select, where = {} }) {
|
|
8
8
|
const { globalConfig, Model } = getGlobal({
|
|
9
9
|
adapter: this,
|
|
10
10
|
globalSlug
|
|
11
11
|
});
|
|
12
12
|
const fields = globalConfig.flattenedFields;
|
|
13
|
+
const branchedWhere = resolveBranchGlobalQuery({
|
|
14
|
+
branch,
|
|
15
|
+
globalSlug,
|
|
16
|
+
req,
|
|
17
|
+
where
|
|
18
|
+
});
|
|
13
19
|
const query = await buildQuery({
|
|
14
20
|
adapter: this,
|
|
21
|
+
branch,
|
|
15
22
|
fields,
|
|
16
23
|
globalSlug,
|
|
17
24
|
locale,
|
|
25
|
+
req,
|
|
18
26
|
where: combineQueries({
|
|
19
27
|
globalType: {
|
|
20
28
|
equals: globalSlug
|
|
21
29
|
}
|
|
22
|
-
},
|
|
30
|
+
}, branchedWhere ?? {})
|
|
31
|
+
});
|
|
32
|
+
const projection = buildProjectionFromSelect({
|
|
33
|
+
adapter: this,
|
|
34
|
+
fields,
|
|
35
|
+
select: withBranchGlobalSelect({
|
|
36
|
+
branch,
|
|
37
|
+
globalSlug,
|
|
38
|
+
req,
|
|
39
|
+
select
|
|
40
|
+
})
|
|
23
41
|
});
|
|
42
|
+
if (projection && branchGlobalNeedsBothRows({
|
|
43
|
+
branch,
|
|
44
|
+
globalSlug,
|
|
45
|
+
req
|
|
46
|
+
})) {
|
|
47
|
+
projection._branch = true;
|
|
48
|
+
}
|
|
24
49
|
const options = {
|
|
25
50
|
lean: true,
|
|
26
|
-
select:
|
|
27
|
-
adapter: this,
|
|
28
|
-
fields,
|
|
29
|
-
select
|
|
30
|
-
}),
|
|
51
|
+
select: projection,
|
|
31
52
|
session: await getSession(this, req)
|
|
32
53
|
};
|
|
33
|
-
|
|
54
|
+
// A global is one document, so the branch's row and main's row can be fetched
|
|
55
|
+
// together and the branch's preferred in memory. There is no result set to
|
|
56
|
+
// paginate, so nothing a post-query step could get wrong.
|
|
57
|
+
let doc;
|
|
58
|
+
if (branchGlobalNeedsBothRows({
|
|
59
|
+
branch,
|
|
60
|
+
globalSlug,
|
|
61
|
+
req
|
|
62
|
+
})) {
|
|
63
|
+
const rows = await Model.find(query, {}, {
|
|
64
|
+
...options,
|
|
65
|
+
limit: 2
|
|
66
|
+
}).lean();
|
|
67
|
+
doc = pickBranchGlobal(rows, branch || resolveBranch({
|
|
68
|
+
req: req
|
|
69
|
+
}));
|
|
70
|
+
} else {
|
|
71
|
+
doc = await Model.findOne(query, {}, options).lean();
|
|
72
|
+
}
|
|
34
73
|
if (!doc) {
|
|
35
74
|
return null;
|
|
36
75
|
}
|