@payloadcms/db-mongodb 4.0.0-internal.1a2a79e → 4.0.0-internal.1ccb6d5

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.
Files changed (38) hide show
  1. package/dist/countGlobalVersions.d.ts.map +1 -1
  2. package/dist/countGlobalVersions.js +9 -2
  3. package/dist/countGlobalVersions.js.map +1 -1
  4. package/dist/createGlobalVersion.js +3 -1
  5. package/dist/createGlobalVersion.js.map +1 -1
  6. package/dist/deleteBranchGlobal.d.ts.map +1 -1
  7. package/dist/deleteBranchGlobal.js +4 -0
  8. package/dist/deleteBranchGlobal.js.map +1 -1
  9. package/dist/findGlobal.d.ts.map +1 -1
  10. package/dist/findGlobal.js +21 -11
  11. package/dist/findGlobal.js.map +1 -1
  12. package/dist/predefinedMigrations/branching.d.ts +1 -1
  13. package/dist/predefinedMigrations/branching.d.ts.map +1 -1
  14. package/dist/predefinedMigrations/branching.js +2 -2
  15. package/dist/predefinedMigrations/branching.js.map +1 -1
  16. package/dist/predefinedMigrations/migrateBranching.d.ts +2 -0
  17. package/dist/predefinedMigrations/migrateBranching.d.ts.map +1 -1
  18. package/dist/predefinedMigrations/migrateBranching.js +2 -0
  19. package/dist/predefinedMigrations/migrateBranching.js.map +1 -1
  20. package/dist/queries/buildRelatedQueryPipeline.d.ts +7 -0
  21. package/dist/queries/buildRelatedQueryPipeline.d.ts.map +1 -0
  22. package/dist/queries/buildRelatedQueryPipeline.js +56 -0
  23. package/dist/queries/buildRelatedQueryPipeline.js.map +1 -0
  24. package/dist/queries/buildSearchParams.d.ts.map +1 -1
  25. package/dist/queries/buildSearchParams.js +61 -60
  26. package/dist/queries/buildSearchParams.js.map +1 -1
  27. package/dist/queryDrafts.js +1 -0
  28. package/dist/queryDrafts.js.map +1 -1
  29. package/dist/updateGlobal.d.ts.map +1 -1
  30. package/dist/updateGlobal.js +15 -13
  31. package/dist/updateGlobal.js.map +1 -1
  32. package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
  33. package/dist/utilities/buildJoinAggregation.js +36 -5
  34. package/dist/utilities/buildJoinAggregation.js.map +1 -1
  35. package/dist/utilities/resolveJoins.d.ts.map +1 -1
  36. package/dist/utilities/resolveJoins.js +4 -3
  37. package/dist/utilities/resolveJoins.js.map +1 -1
  38. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/queries/buildSearchParams.ts"],"sourcesContent":["import type { PipelineStage, QueryFilter } from 'mongoose'\nimport type {\n FlattenedField,\n HasManyRelationshipOperator,\n Operator,\n PathToQuery,\n Payload,\n PayloadRequest,\n Where,\n} from 'payload'\n\nimport { Types } from 'mongoose'\nimport {\n APIError,\n escapeRegExp,\n getFieldByPath,\n getLocalizedPaths,\n resolveBranchQuery,\n resolveBranchReadState,\n rewriteBranchIDs,\n} from 'payload'\nimport {\n hasManyRelationshipOperatorSet,\n isNestedRelationshipQuery,\n validOperatorSet,\n} from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\nimport type { CollectionModel } from '../types.js'\nimport type { OperatorMapKey } from './operatorMap.js'\n\nimport { getCollection } from '../utilities/getEntity.js'\nimport { isObjectID } from '../utilities/isObjectID.js'\nimport { buildBranchVisibilityStages } from './buildBranchVisibility.js'\nimport { operatorMap } from './operatorMap.js'\nimport { sanitizeQueryValue } from './sanitizeQueryValue.js'\n\ntype SearchParam = {\n path?: string\n rawQuery?: unknown\n value?: unknown\n}\n\nconst resolveRelatedBranchQuery = async ({\n branch,\n collectionSlug,\n payload,\n req,\n where,\n}: {\n branch?: false | string\n collectionSlug: string\n payload: Payload\n req?: Partial<PayloadRequest>\n where: Where\n}) => {\n const adapter = payload.db as MongooseAdapter\n const branchReadState = resolveBranchReadState({ branch, collectionSlug, req })\n const resolvedWhere = branchReadState.useBranching\n ? rewriteBranchIDs(where)\n : await resolveBranchQuery({ branch, collectionSlug, req, where })\n\n return {\n branchVisibility: branchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter,\n branch: branchReadState.branch,\n collectionSlug,\n })\n : [],\n where: resolvedWhere ?? {},\n }\n}\n\nconst findRelatedDocuments = async ({\n branchVisibility,\n Model,\n projection,\n query,\n}: {\n branchVisibility: PipelineStage[]\n Model: CollectionModel\n projection: Record<string, boolean>\n query: Record<string, unknown>\n}) => {\n if (branchVisibility.length) {\n return Model.aggregate([{ $match: query }, ...branchVisibility, { $project: projection }])\n }\n\n return Model.find(query).lean().select(projection)\n}\n\nconst findRelatedDistinctValues = async ({\n branchVisibility,\n Model,\n path,\n query,\n}: {\n branchVisibility: PipelineStage[]\n Model: CollectionModel\n path: string\n query: Record<string, unknown>\n}) => {\n if (!branchVisibility.length) {\n return Model.distinct(path, query)\n }\n\n return Model.aggregate([\n { $match: query },\n ...branchVisibility,\n { $project: { value: `$${path}` } },\n { $unwind: '$value' },\n { $group: { _id: '$value' } },\n ]).then((results) => results.map(({ _id }) => _id))\n}\n\n/**\n * Convert the Payload key / value / operator into a MongoDB query\n */\nexport async function buildSearchParam({\n branch,\n collectionSlug,\n fields,\n globalSlug,\n incomingPath,\n locale,\n operator,\n parentIsLocalized,\n payload,\n req,\n val,\n}: {\n branch?: false | string\n collectionSlug?: string\n fields: FlattenedField[]\n globalSlug?: string\n incomingPath: string\n locale?: string\n operator: Operator\n parentIsLocalized: boolean\n payload: Payload\n req?: Partial<PayloadRequest>\n val: unknown\n}): Promise<SearchParam | undefined> {\n // Replace GraphQL nested field double underscore formatting\n let sanitizedPath = incomingPath.replace(/__/g, '.')\n if (sanitizedPath === 'id') {\n sanitizedPath = '_id'\n }\n\n let paths: PathToQuery[] = []\n\n let hasCustomID = false\n\n if (sanitizedPath === '_id') {\n const customIDFieldType = collectionSlug\n ? payload.collections[collectionSlug]?.customIDType\n : undefined\n\n let idFieldType: 'number' | 'text' = 'text'\n\n if (customIDFieldType) {\n idFieldType = customIDFieldType\n hasCustomID = true\n }\n\n paths.push({\n collectionSlug,\n complete: true,\n field: {\n name: 'id',\n type: idFieldType,\n } as FlattenedField,\n parentIsLocalized: parentIsLocalized ?? false,\n path: '_id',\n })\n } else {\n paths = getLocalizedPaths({\n collectionSlug,\n fields,\n globalSlug,\n incomingPath: sanitizedPath,\n locale,\n parentIsLocalized,\n payload,\n })\n }\n\n if (!paths[0]) {\n return undefined\n }\n\n const [{ field, path }] = paths\n\n if (\n hasManyRelationshipOperatorSet.has(operator as HasManyRelationshipOperator) &&\n paths.length === 1 &&\n (field.type === 'relationship' || field.type === 'upload') &&\n field.hasMany &&\n typeof field.relationTo === 'string' &&\n isNestedRelationshipQuery(val)\n ) {\n return buildHasManyRelationshipSearchParam({\n branch,\n field,\n locale,\n nestedWhere: val,\n operator: operator as HasManyRelationshipOperator,\n path,\n payload,\n req,\n })\n }\n\n if (\n operator === 'contains' &&\n paths.length === 1 &&\n field.type === 'join' &&\n typeof field.collection === 'string' &&\n isNestedRelationshipQuery(val)\n ) {\n return buildJoinContainsSearchParam({\n branch,\n field,\n locale,\n nestedWhere: val,\n payload,\n req,\n })\n }\n\n if (\n (operator === 'contains' || operator === 'like' || operator === 'not_like') &&\n (isNestedRelationshipQuery(val) ||\n (Array.isArray(val) && val.some((entry) => isNestedRelationshipQuery(entry))))\n ) {\n throw new APIError(`Invalid value for \"${operator}\" on path \"${path}\": expected a string.`, 400)\n }\n\n if (path) {\n const sanitizedQueryValue = sanitizeQueryValue({\n field,\n hasCustomID,\n locale,\n operator,\n parentIsLocalized,\n path,\n payload,\n val,\n })\n\n if (!sanitizedQueryValue) {\n return undefined\n }\n\n const { operator: formattedOperator, rawQuery, val: formattedValue } = sanitizedQueryValue\n\n if (rawQuery && paths.length === 1) {\n return { value: rawQuery }\n }\n\n if (!formattedOperator) {\n return undefined\n }\n\n // If there are multiple collections to search through,\n // Recursively build up a list of query constraints\n if (paths.length > 1) {\n // Remove top collection and reverse array\n // to work backwards from top\n const pathsToQuery = paths.slice(1).reverse()\n const parentPaths = paths.slice(0, -1).reverse()\n\n let relationshipQuery: SearchParam = { value: {} }\n let relationshipWhere: undefined | Where\n\n for (const [i, { collectionSlug, path: subPath }] of pathsToQuery.entries()) {\n // The arrays are reversed together, so both entries describe the same relationship hop.\n const parentField = parentPaths[i]?.field\n\n if (!parentField) {\n return undefined\n }\n\n if (!collectionSlug) {\n throw new APIError(`Collection with the slug ${collectionSlug} was not found.`)\n }\n\n const { collectionConfig, Model: SubModel } = getCollection({\n adapter: payload.db as MongooseAdapter,\n collectionSlug,\n })\n\n if (i === 0) {\n const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({\n branch,\n collectionSlug,\n payload,\n req,\n where: {\n [subPath]: {\n [formattedOperator]: val,\n },\n },\n })\n const subQuery = await SubModel.buildQuery({\n branch,\n locale,\n payload,\n req,\n where: relatedWhere ?? {},\n })\n\n const select: Record<string, boolean> = {\n _id: true,\n _branchDocID: true,\n }\n\n let joinPath: null | string = null\n\n if (parentField.type === 'join') {\n const relationshipField = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: parentField.on,\n })\n if (!relationshipField) {\n throw new APIError('Relationship field was not found')\n }\n\n let path = relationshipField.localizedPath\n if (relationshipField.pathHasLocalized && payload.config.localization) {\n path = path.replace('<locale>', locale || payload.config.localization.defaultLocale)\n }\n select[path] = true\n\n joinPath = path\n }\n\n if (joinPath) {\n select[joinPath] = true\n }\n\n const result = await findRelatedDocuments({\n branchVisibility,\n Model: SubModel,\n projection: select,\n query: subQuery,\n })\n\n const $in: unknown[] = []\n\n result.forEach((doc: any) => {\n if (joinPath) {\n let ref = doc\n\n for (const segment of joinPath.split('.')) {\n if (Array.isArray(ref)) {\n ref = ref\n .map((item) => (typeof item === 'object' && item ? item[segment] : undefined))\n .flat()\n .filter((item) => item != null)\n } else if (typeof ref === 'object' && ref) {\n ref = ref[segment]\n } else {\n ref = undefined\n break\n }\n }\n\n if (Array.isArray(ref)) {\n for (const item of ref) {\n if (isObjectID(item)) {\n $in.push(item)\n }\n }\n } else if (isObjectID(ref)) {\n $in.push(ref)\n }\n } else {\n const documentID = doc._branchDocID ?? doc._id\n const stringID = documentID.toString()\n if (Types.ObjectId.isValid(stringID)) {\n $in.push(documentID)\n } else {\n $in.push(stringID)\n }\n }\n })\n\n if (pathsToQuery.length === 1) {\n return {\n path: joinPath ? '_id' : path,\n value: { $in },\n }\n }\n\n const nextSubPath = pathsToQuery[i + 1]?.path\n\n if (nextSubPath) {\n relationshipWhere = joinPath ? { id: { in: $in } } : { [nextSubPath]: { in: $in } }\n }\n\n continue\n }\n\n if (!relationshipWhere) {\n return undefined\n }\n\n const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({\n branch,\n collectionSlug,\n payload,\n req,\n where: relationshipWhere,\n })\n const subQuery = (await SubModel.buildQuery({\n branch,\n locale,\n payload,\n req,\n where: relatedWhere ?? {},\n })) as QueryFilter<Record<string, unknown>>\n\n /**\n * Follow this join back to its parent IDs.\n * For example, matching songs yield album IDs, then artist IDs.\n */\n if (parentField.type === 'join') {\n const relationshipField = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: parentField.on,\n })\n if (!relationshipField) {\n throw new APIError('Relationship field was not found')\n }\n\n let joinPath = relationshipField.localizedPath\n if (relationshipField.pathHasLocalized && payload.config.localization) {\n joinPath = joinPath.replace(\n '<locale>',\n locale || payload.config.localization.defaultLocale,\n )\n }\n\n const $in = await findRelatedDistinctValues({\n branchVisibility,\n Model: SubModel,\n path: joinPath,\n query: subQuery,\n })\n if (i + 1 === pathsToQuery.length) {\n return { path: '_id', value: { $in } }\n }\n\n relationshipWhere = { id: { in: $in } }\n continue\n }\n\n const result = await findRelatedDocuments({\n branchVisibility,\n Model: SubModel,\n projection: { _id: true, _branchDocID: true },\n query: subQuery,\n })\n\n const $in = result.map((doc) => doc._branchDocID ?? doc._id)\n\n // If it is the last recursion\n // then pass through the search param\n if (i + 1 === pathsToQuery.length) {\n relationshipQuery = {\n path,\n value: { $in },\n }\n } else {\n const nextSubPath = pathsToQuery[i + 1]?.path\n if (nextSubPath) {\n relationshipWhere = { [nextSubPath]: { in: $in } }\n }\n }\n }\n\n return relationshipQuery\n }\n\n if (formattedOperator && validOperatorSet.has(formattedOperator as Operator)) {\n const operatorKey = operatorMap[formattedOperator as OperatorMapKey]\n\n if (field.type === 'relationship' || field.type === 'upload') {\n let hasNumberIDRelation\n let multiIDCondition = '$or'\n if (operatorKey === '$ne') {\n multiIDCondition = '$and'\n }\n\n const result = {\n value: {\n [multiIDCondition]: [{ [path]: { [operatorKey]: formattedValue } }],\n },\n }\n\n if (typeof formattedValue === 'string') {\n if (Types.ObjectId.isValid(formattedValue)) {\n result.value[multiIDCondition]?.push({\n [path]: { [operatorKey]: new Types.ObjectId(formattedValue) },\n })\n } else {\n ;(Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo]).forEach(\n (relationTo) => {\n const isRelatedToCustomNumberID =\n payload.collections[relationTo]?.customIDType === 'number'\n\n if (isRelatedToCustomNumberID) {\n hasNumberIDRelation = true\n }\n },\n )\n\n if (hasNumberIDRelation) {\n result.value[multiIDCondition]?.push({\n [path]: { [operatorKey]: parseFloat(formattedValue) },\n })\n }\n }\n }\n\n const length = result.value[multiIDCondition]?.length\n\n if (typeof length === 'number' && length > 1) {\n return result\n }\n }\n\n if (formattedOperator === 'like' && typeof formattedValue === 'string') {\n const words = formattedValue.split(' ')\n\n const result = {\n value: {\n $and: words.map((word) => ({\n [path]: {\n $options: 'i',\n $regex: escapeRegExp(word),\n },\n })),\n },\n }\n\n return result\n }\n\n if (formattedOperator === 'not_like' && typeof formattedValue === 'string') {\n const words = formattedValue.split(' ')\n\n const result = {\n value: {\n $and: words.map((word) => ({\n [path]: {\n $not: {\n $options: 'i',\n $regex: escapeRegExp(word),\n },\n },\n })),\n },\n }\n\n return result\n }\n\n // Some operators like 'near' need to define a full query\n // so if there is no operator key, just return the value\n if (!operatorKey) {\n return {\n path,\n value: formattedValue,\n }\n }\n\n return {\n path,\n value: { [operatorKey]: formattedValue },\n }\n }\n }\n return undefined\n}\n\n/**\n * Builds a MongoDB condition for an operator containing a nested has-many relationship query.\n *\n * First, it finds IDs from the related collection that match the nested query. The parent\n * collection can then use `$in` or `$nin` against its stored relationship IDs.\n *\n * @example\n * ```ts\n * // Input\n * { ingredients: { not_equals: { isHealthy: { equals: false } } } }\n *\n * // Simplified MongoDB result, after finding the matching ingredient IDs\n * { ingredients: { $nin: [unhealthyIngredientID] } }\n * ```\n */\nasync function buildHasManyRelationshipSearchParam({\n branch,\n field,\n locale,\n nestedWhere,\n operator,\n path,\n payload,\n req,\n}: {\n branch?: false | string\n field: FlattenedField\n locale?: string\n nestedWhere: unknown\n operator: HasManyRelationshipOperator\n path: string\n payload: Payload\n req?: Partial<PayloadRequest>\n}): Promise<SearchParam | undefined> {\n if (\n (field.type !== 'relationship' && field.type !== 'upload') ||\n !field.hasMany ||\n typeof field.relationTo !== 'string' ||\n !isNestedRelationshipQuery(nestedWhere)\n ) {\n return undefined\n }\n\n const { Model: RelatedModel } = getCollection({\n adapter: payload.db as MongooseAdapter,\n collectionSlug: field.relationTo,\n })\n const pathLocale = payload.config.localization\n ? payload.config.localization.localeCodes.find(\n (localeCode) => path.split('.').at(-1) === localeCode,\n )\n : undefined\n const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({\n branch,\n collectionSlug: field.relationTo,\n payload,\n req,\n where: nestedWhere,\n })\n const matchingRelatedDocumentsQuery = await RelatedModel.buildQuery({\n branch,\n locale: pathLocale ?? locale,\n payload,\n req,\n where: relatedWhere ?? {},\n })\n\n const findRelatedDocumentIDs = async (query: Record<string, unknown>) =>\n (\n await findRelatedDocuments({\n branchVisibility,\n Model: RelatedModel,\n projection: { _id: true, _branchDocID: true },\n query,\n })\n ).map((document) => document._branchDocID ?? document._id)\n\n switch (operator) {\n case 'contains': {\n const matchingRelatedDocumentIDs = await findRelatedDocumentIDs(matchingRelatedDocumentsQuery)\n\n return {\n path,\n value: { $in: matchingRelatedDocumentIDs },\n }\n }\n\n case 'equals': {\n // Every related document satisfies an empty nested query.\n if (!Object.keys(nestedWhere).length) {\n return {\n path,\n value: { $nin: [] },\n }\n }\n\n // MongoDB rejects `$near` and `$text` when they are inverted with `$nor`. Check the parent\n // instead: none of its IDs may fall outside the matching IDs.\n const matchingRelatedDocumentIDs = await findRelatedDocumentIDs(matchingRelatedDocumentsQuery)\n\n return {\n path,\n value: { $not: { $elemMatch: { $nin: matchingRelatedDocumentIDs } } },\n }\n }\n\n case 'not_equals': {\n const matchingRelatedDocumentIDs = await findRelatedDocumentIDs(matchingRelatedDocumentsQuery)\n\n return {\n path,\n value: { $nin: matchingRelatedDocumentIDs },\n }\n }\n }\n}\n\n/**\n * Builds a MongoDB condition for a `contains` query nested on a join field.\n *\n * Finds documents in the joined collection that match the nested query, then follows the join's\n * `on` relationship to collect the parent IDs those documents point back to. Because the nested\n * query resolves against a single joined document, the user's filter and any injected access\n * constraint must be satisfied by the same document.\n */\nasync function buildJoinContainsSearchParam({\n branch,\n field,\n locale,\n nestedWhere,\n payload,\n req,\n}: {\n branch?: false | string\n field: FlattenedField\n locale?: string\n nestedWhere: unknown\n payload: Payload\n req?: Partial<PayloadRequest>\n}): Promise<SearchParam | undefined> {\n if (\n field.type !== 'join' ||\n typeof field.collection !== 'string' ||\n !isNestedRelationshipQuery(nestedWhere)\n ) {\n return undefined\n }\n\n const { collectionConfig, Model: JoinedModel } = getCollection({\n adapter: payload.db as MongooseAdapter,\n collectionSlug: field.collection,\n })\n\n const relationshipField = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: field.on,\n })\n\n if (!relationshipField) {\n throw new APIError('Relationship field was not found')\n }\n\n let joinPath = relationshipField.localizedPath\n if (relationshipField.pathHasLocalized && payload.config.localization) {\n joinPath = joinPath.replace('<locale>', locale || payload.config.localization.defaultLocale)\n }\n\n const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({\n branch,\n collectionSlug: field.collection,\n payload,\n req,\n where: nestedWhere,\n })\n const subQuery = await JoinedModel.buildQuery({\n branch,\n locale,\n payload,\n req,\n where: relatedWhere ?? {},\n })\n\n const parentIDs = await findRelatedDistinctValues({\n branchVisibility,\n Model: JoinedModel,\n path: joinPath,\n query: subQuery,\n })\n\n return {\n path: '_id',\n value: { $in: parentIDs },\n }\n}\n"],"names":["Types","APIError","escapeRegExp","getFieldByPath","getLocalizedPaths","resolveBranchQuery","resolveBranchReadState","rewriteBranchIDs","hasManyRelationshipOperatorSet","isNestedRelationshipQuery","validOperatorSet","getCollection","isObjectID","buildBranchVisibilityStages","operatorMap","sanitizeQueryValue","resolveRelatedBranchQuery","branch","collectionSlug","payload","req","where","adapter","db","branchReadState","resolvedWhere","useBranching","branchVisibility","findRelatedDocuments","Model","projection","query","length","aggregate","$match","$project","find","lean","select","findRelatedDistinctValues","path","distinct","value","$unwind","$group","_id","then","results","map","buildSearchParam","fields","globalSlug","incomingPath","locale","operator","parentIsLocalized","val","sanitizedPath","replace","paths","hasCustomID","customIDFieldType","collections","customIDType","undefined","idFieldType","push","complete","field","name","type","has","hasMany","relationTo","buildHasManyRelationshipSearchParam","nestedWhere","collection","buildJoinContainsSearchParam","Array","isArray","some","entry","sanitizedQueryValue","formattedOperator","rawQuery","formattedValue","pathsToQuery","slice","reverse","parentPaths","relationshipQuery","relationshipWhere","i","subPath","entries","parentField","collectionConfig","SubModel","relatedWhere","subQuery","buildQuery","_branchDocID","joinPath","relationshipField","flattenedFields","on","localizedPath","pathHasLocalized","config","localization","defaultLocale","result","$in","forEach","doc","ref","segment","split","item","flat","filter","documentID","stringID","toString","ObjectId","isValid","nextSubPath","id","in","operatorKey","hasNumberIDRelation","multiIDCondition","isRelatedToCustomNumberID","parseFloat","words","$and","word","$options","$regex","$not","RelatedModel","pathLocale","localeCodes","localeCode","at","matchingRelatedDocumentsQuery","findRelatedDocumentIDs","document","matchingRelatedDocumentIDs","Object","keys","$nin","$elemMatch","JoinedModel","parentIDs"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/queries/buildSearchParams.ts"],"sourcesContent":["import type { PipelineStage, QueryFilter } from 'mongoose'\nimport type {\n FlattenedField,\n HasManyRelationshipOperator,\n Operator,\n PathToQuery,\n Payload,\n PayloadRequest,\n Where,\n} from 'payload'\n\nimport { Types } from 'mongoose'\nimport {\n APIError,\n escapeRegExp,\n getFieldByPath,\n getLocalizedPaths,\n resolveBranchQuery,\n resolveBranchReadState,\n rewriteBranchIDs,\n} from 'payload'\nimport {\n hasManyRelationshipOperatorSet,\n isNestedRelationshipQuery,\n validOperatorSet,\n} from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\nimport type { CollectionModel } from '../types.js'\nimport type { OperatorMapKey } from './operatorMap.js'\n\nimport { getCollection } from '../utilities/getEntity.js'\nimport { isObjectID } from '../utilities/isObjectID.js'\nimport { buildBranchVisibilityStages } from './buildBranchVisibility.js'\nimport { buildRelatedQueryPipeline } from './buildRelatedQueryPipeline.js'\nimport { operatorMap } from './operatorMap.js'\nimport { sanitizeQueryValue } from './sanitizeQueryValue.js'\n\ntype SearchParam = {\n path?: string\n rawQuery?: unknown\n value?: unknown\n}\n\n/**\n * Convert the Payload key / value / operator into a MongoDB query\n */\nexport async function buildSearchParam({\n branch,\n collectionSlug,\n fields,\n globalSlug,\n incomingPath,\n locale,\n operator,\n parentIsLocalized,\n payload,\n req,\n val,\n}: {\n branch?: false | string\n collectionSlug?: string\n fields: FlattenedField[]\n globalSlug?: string\n incomingPath: string\n locale?: string\n operator: Operator\n parentIsLocalized: boolean\n payload: Payload\n req?: Partial<PayloadRequest>\n val: unknown\n}): Promise<SearchParam | undefined> {\n // Replace GraphQL nested field double underscore formatting\n let sanitizedPath = incomingPath.replace(/__/g, '.')\n if (sanitizedPath === 'id') {\n sanitizedPath = '_id'\n }\n\n let paths: PathToQuery[] = []\n\n let hasCustomID = false\n\n if (sanitizedPath === '_id') {\n const customIDFieldType = collectionSlug\n ? payload.collections[collectionSlug]?.customIDType\n : undefined\n\n let idFieldType: 'number' | 'text' = 'text'\n\n if (customIDFieldType) {\n idFieldType = customIDFieldType\n hasCustomID = true\n }\n\n paths.push({\n collectionSlug,\n complete: true,\n field: {\n name: 'id',\n type: idFieldType,\n } as FlattenedField,\n parentIsLocalized: parentIsLocalized ?? false,\n path: '_id',\n })\n } else {\n paths = getLocalizedPaths({\n collectionSlug,\n fields,\n globalSlug,\n incomingPath: sanitizedPath,\n locale,\n parentIsLocalized,\n payload,\n })\n }\n\n if (!paths[0]) {\n return undefined\n }\n\n const [{ field, path }] = paths\n\n if (\n hasManyRelationshipOperatorSet.has(operator as HasManyRelationshipOperator) &&\n paths.length === 1 &&\n (field.type === 'relationship' || field.type === 'upload') &&\n field.hasMany &&\n typeof field.relationTo === 'string' &&\n isNestedRelationshipQuery(val)\n ) {\n return buildHasManyRelationshipSearchParam({\n branch,\n field,\n locale,\n nestedWhere: val,\n operator: operator as HasManyRelationshipOperator,\n path,\n payload,\n req,\n })\n }\n\n if (\n operator === 'contains' &&\n paths.length === 1 &&\n field.type === 'join' &&\n typeof field.collection === 'string' &&\n isNestedRelationshipQuery(val)\n ) {\n return buildJoinContainsSearchParam({\n branch,\n field,\n locale,\n nestedWhere: val,\n payload,\n req,\n })\n }\n\n if (\n (operator === 'contains' || operator === 'like' || operator === 'not_like') &&\n (isNestedRelationshipQuery(val) ||\n (Array.isArray(val) && val.some((entry) => isNestedRelationshipQuery(entry))))\n ) {\n throw new APIError(`Invalid value for \"${operator}\" on path \"${path}\": expected a string.`, 400)\n }\n\n if (path) {\n const sanitizedQueryValue = sanitizeQueryValue({\n field,\n hasCustomID,\n locale,\n operator,\n parentIsLocalized,\n path,\n payload,\n val,\n })\n\n if (!sanitizedQueryValue) {\n return undefined\n }\n\n const { operator: formattedOperator, rawQuery, val: formattedValue } = sanitizedQueryValue\n\n if (rawQuery && paths.length === 1) {\n return { value: rawQuery }\n }\n\n if (!formattedOperator) {\n return undefined\n }\n\n // If there are multiple collections to search through,\n // Recursively build up a list of query constraints\n if (paths.length > 1) {\n // Remove top collection and reverse array\n // to work backwards from top\n const pathsToQuery = paths.slice(1).reverse()\n const parentPaths = paths.slice(0, -1).reverse()\n\n let relationshipQuery: SearchParam = { value: {} }\n let relationshipWhere: undefined | Where\n\n for (const [i, { collectionSlug, path: subPath }] of pathsToQuery.entries()) {\n // The arrays are reversed together, so both entries describe the same relationship hop.\n const parentField = parentPaths[i]?.field\n\n if (!parentField) {\n return undefined\n }\n\n if (!collectionSlug) {\n throw new APIError(`Collection with the slug ${collectionSlug} was not found.`)\n }\n\n const { collectionConfig, Model: SubModel } = getCollection({\n adapter: payload.db as MongooseAdapter,\n collectionSlug,\n })\n\n if (i === 0) {\n const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({\n branch,\n collectionSlug,\n payload,\n req,\n where: {\n [subPath]: {\n [formattedOperator]: val,\n },\n },\n })\n const subQuery = await SubModel.buildQuery({\n branch,\n locale,\n payload,\n req,\n where: relatedWhere ?? {},\n })\n\n const select: Record<string, boolean> = {\n _id: true,\n _branchDocID: true,\n }\n\n let joinPath: null | string = null\n\n if (parentField.type === 'join') {\n const relationshipField = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: parentField.on,\n })\n if (!relationshipField) {\n throw new APIError('Relationship field was not found')\n }\n\n let path = relationshipField.localizedPath\n if (relationshipField.pathHasLocalized && payload.config.localization) {\n path = path.replace('<locale>', locale || payload.config.localization.defaultLocale)\n }\n select[path] = true\n\n joinPath = path\n }\n\n if (joinPath) {\n select[joinPath] = true\n }\n\n const result = await findRelatedDocuments({\n branchVisibility,\n Model: SubModel,\n projection: select,\n query: subQuery,\n })\n\n const $in: unknown[] = []\n\n result.forEach((doc: any) => {\n if (joinPath) {\n let ref = doc\n\n for (const segment of joinPath.split('.')) {\n if (Array.isArray(ref)) {\n ref = ref\n .map((item) => (typeof item === 'object' && item ? item[segment] : undefined))\n .flat()\n .filter((item) => item != null)\n } else if (typeof ref === 'object' && ref) {\n ref = ref[segment]\n } else {\n ref = undefined\n break\n }\n }\n\n if (Array.isArray(ref)) {\n for (const item of ref) {\n if (isObjectID(item)) {\n $in.push(item)\n }\n }\n } else if (isObjectID(ref)) {\n $in.push(ref)\n }\n } else {\n const documentID = doc._branchDocID ?? doc._id\n const stringID = documentID.toString()\n if (Types.ObjectId.isValid(stringID)) {\n $in.push(documentID)\n } else {\n $in.push(stringID)\n }\n }\n })\n\n if (pathsToQuery.length === 1) {\n return {\n path: joinPath ? '_id' : path,\n value: { $in },\n }\n }\n\n const nextSubPath = pathsToQuery[i + 1]?.path\n\n if (nextSubPath) {\n relationshipWhere = joinPath ? { id: { in: $in } } : { [nextSubPath]: { in: $in } }\n }\n\n continue\n }\n\n if (!relationshipWhere) {\n return undefined\n }\n\n const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({\n branch,\n collectionSlug,\n payload,\n req,\n where: relationshipWhere,\n })\n const subQuery = (await SubModel.buildQuery({\n branch,\n locale,\n payload,\n req,\n where: relatedWhere ?? {},\n })) as QueryFilter<Record<string, unknown>>\n\n /**\n * Follow this join back to its parent IDs.\n * For example, matching songs yield album IDs, then artist IDs.\n */\n if (parentField.type === 'join') {\n const relationshipField = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: parentField.on,\n })\n if (!relationshipField) {\n throw new APIError('Relationship field was not found')\n }\n\n let joinPath = relationshipField.localizedPath\n if (relationshipField.pathHasLocalized && payload.config.localization) {\n joinPath = joinPath.replace(\n '<locale>',\n locale || payload.config.localization.defaultLocale,\n )\n }\n\n const $in = await findRelatedDistinctValues({\n branchVisibility,\n Model: SubModel,\n path: joinPath,\n query: subQuery,\n })\n if (i + 1 === pathsToQuery.length) {\n return { path: '_id', value: { $in } }\n }\n\n relationshipWhere = { id: { in: $in } }\n continue\n }\n\n const result = await findRelatedDocuments({\n branchVisibility,\n Model: SubModel,\n projection: { _id: true, _branchDocID: true },\n query: subQuery,\n })\n\n const $in = result.map((doc) => doc._branchDocID ?? doc._id)\n\n // If it is the last recursion\n // then pass through the search param\n if (i + 1 === pathsToQuery.length) {\n relationshipQuery = {\n path,\n value: { $in },\n }\n } else {\n const nextSubPath = pathsToQuery[i + 1]?.path\n if (nextSubPath) {\n relationshipWhere = { [nextSubPath]: { in: $in } }\n }\n }\n }\n\n return relationshipQuery\n }\n\n if (formattedOperator && validOperatorSet.has(formattedOperator as Operator)) {\n const operatorKey = operatorMap[formattedOperator as OperatorMapKey]\n\n if (field.type === 'relationship' || field.type === 'upload') {\n let hasNumberIDRelation\n let multiIDCondition = '$or'\n if (operatorKey === '$ne') {\n multiIDCondition = '$and'\n }\n\n const result = {\n value: {\n [multiIDCondition]: [{ [path]: { [operatorKey]: formattedValue } }],\n },\n }\n\n if (typeof formattedValue === 'string') {\n if (Types.ObjectId.isValid(formattedValue)) {\n result.value[multiIDCondition]?.push({\n [path]: { [operatorKey]: new Types.ObjectId(formattedValue) },\n })\n } else {\n ;(Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo]).forEach(\n (relationTo) => {\n const isRelatedToCustomNumberID =\n payload.collections[relationTo]?.customIDType === 'number'\n\n if (isRelatedToCustomNumberID) {\n hasNumberIDRelation = true\n }\n },\n )\n\n if (hasNumberIDRelation) {\n result.value[multiIDCondition]?.push({\n [path]: { [operatorKey]: parseFloat(formattedValue) },\n })\n }\n }\n }\n\n const length = result.value[multiIDCondition]?.length\n\n if (typeof length === 'number' && length > 1) {\n return result\n }\n }\n\n if (formattedOperator === 'like' && typeof formattedValue === 'string') {\n const words = formattedValue.split(' ')\n\n const result = {\n value: {\n $and: words.map((word) => ({\n [path]: {\n $options: 'i',\n $regex: escapeRegExp(word),\n },\n })),\n },\n }\n\n return result\n }\n\n if (formattedOperator === 'not_like' && typeof formattedValue === 'string') {\n const words = formattedValue.split(' ')\n\n const result = {\n value: {\n $and: words.map((word) => ({\n [path]: {\n $not: {\n $options: 'i',\n $regex: escapeRegExp(word),\n },\n },\n })),\n },\n }\n\n return result\n }\n\n // Some operators like 'near' need to define a full query\n // so if there is no operator key, just return the value\n if (!operatorKey) {\n return {\n path,\n value: formattedValue,\n }\n }\n\n return {\n path,\n value: { [operatorKey]: formattedValue },\n }\n }\n }\n return undefined\n}\n\n/**\n * Builds a MongoDB condition for an operator containing a nested has-many relationship query.\n *\n * First, it finds IDs from the related collection that match the nested query. The parent\n * collection can then use `$in` or `$nin` against its stored relationship IDs.\n *\n * @example\n * ```ts\n * // Input\n * { ingredients: { not_equals: { isHealthy: { equals: false } } } }\n *\n * // Simplified MongoDB result, after finding the matching ingredient IDs\n * { ingredients: { $nin: [unhealthyIngredientID] } }\n * ```\n */\nasync function buildHasManyRelationshipSearchParam({\n branch,\n field,\n locale,\n nestedWhere,\n operator,\n path,\n payload,\n req,\n}: {\n branch?: false | string\n field: FlattenedField\n locale?: string\n nestedWhere: unknown\n operator: HasManyRelationshipOperator\n path: string\n payload: Payload\n req?: Partial<PayloadRequest>\n}): Promise<SearchParam | undefined> {\n if (\n (field.type !== 'relationship' && field.type !== 'upload') ||\n !field.hasMany ||\n typeof field.relationTo !== 'string' ||\n !isNestedRelationshipQuery(nestedWhere)\n ) {\n return undefined\n }\n\n const { Model: RelatedModel } = getCollection({\n adapter: payload.db as MongooseAdapter,\n collectionSlug: field.relationTo,\n })\n const pathLocale = payload.config.localization\n ? payload.config.localization.localeCodes.find(\n (localeCode) => path.split('.').at(-1) === localeCode,\n )\n : undefined\n const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({\n branch,\n collectionSlug: field.relationTo,\n payload,\n req,\n where: nestedWhere,\n })\n const matchingRelatedDocumentsQuery = await RelatedModel.buildQuery({\n branch,\n locale: pathLocale ?? locale,\n payload,\n req,\n where: relatedWhere ?? {},\n })\n\n const findRelatedDocumentIDs = async (query: Record<string, unknown>) =>\n (\n await findRelatedDocuments({\n branchVisibility,\n Model: RelatedModel,\n projection: { _id: true, _branchDocID: true },\n query,\n })\n ).map((document) => document._branchDocID ?? document._id)\n\n switch (operator) {\n case 'contains': {\n const matchingRelatedDocumentIDs = await findRelatedDocumentIDs(matchingRelatedDocumentsQuery)\n\n return {\n path,\n value: { $in: matchingRelatedDocumentIDs },\n }\n }\n\n case 'equals': {\n // Every related document satisfies an empty nested query.\n if (!Object.keys(nestedWhere).length) {\n return {\n path,\n value: { $nin: [] },\n }\n }\n\n // MongoDB rejects `$near` and `$text` when they are inverted with `$nor`. Check the parent\n // instead: none of its IDs may fall outside the matching IDs.\n const matchingRelatedDocumentIDs = await findRelatedDocumentIDs(matchingRelatedDocumentsQuery)\n\n return {\n path,\n value: { $not: { $elemMatch: { $nin: matchingRelatedDocumentIDs } } },\n }\n }\n\n case 'not_equals': {\n const matchingRelatedDocumentIDs = await findRelatedDocumentIDs(matchingRelatedDocumentsQuery)\n\n return {\n path,\n value: { $nin: matchingRelatedDocumentIDs },\n }\n }\n }\n}\n\n/**\n * Builds a MongoDB condition for a `contains` query nested on a join field.\n *\n * Finds documents in the joined collection that match the nested query, then follows the join's\n * `on` relationship to collect the parent IDs those documents point back to. Because the nested\n * query resolves against a single joined document, the user's filter and any injected access\n * constraint must be satisfied by the same document.\n */\nasync function buildJoinContainsSearchParam({\n branch,\n field,\n locale,\n nestedWhere,\n payload,\n req,\n}: {\n branch?: false | string\n field: FlattenedField\n locale?: string\n nestedWhere: unknown\n payload: Payload\n req?: Partial<PayloadRequest>\n}): Promise<SearchParam | undefined> {\n if (\n field.type !== 'join' ||\n typeof field.collection !== 'string' ||\n !isNestedRelationshipQuery(nestedWhere)\n ) {\n return undefined\n }\n\n const { collectionConfig, Model: JoinedModel } = getCollection({\n adapter: payload.db as MongooseAdapter,\n collectionSlug: field.collection,\n })\n\n const relationshipField = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: field.on,\n })\n\n if (!relationshipField) {\n throw new APIError('Relationship field was not found')\n }\n\n let joinPath = relationshipField.localizedPath\n if (relationshipField.pathHasLocalized && payload.config.localization) {\n joinPath = joinPath.replace('<locale>', locale || payload.config.localization.defaultLocale)\n }\n\n const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({\n branch,\n collectionSlug: field.collection,\n payload,\n req,\n where: nestedWhere,\n })\n const subQuery = await JoinedModel.buildQuery({\n branch,\n locale,\n payload,\n req,\n where: relatedWhere ?? {},\n })\n\n const parentIDs = await findRelatedDistinctValues({\n branchVisibility,\n Model: JoinedModel,\n path: joinPath,\n query: subQuery,\n })\n\n return {\n path: '_id',\n value: { $in: parentIDs },\n }\n}\n\nconst resolveRelatedBranchQuery = async ({\n branch,\n collectionSlug,\n payload,\n req,\n where,\n}: {\n branch?: false | string\n collectionSlug: string\n payload: Payload\n req?: Partial<PayloadRequest>\n where: Where\n}) => {\n const adapter = payload.db as MongooseAdapter\n const branchReadState = resolveBranchReadState({ branch, collectionSlug, req })\n const resolvedWhere = branchReadState.useBranching\n ? rewriteBranchIDs(where)\n : await resolveBranchQuery({ branch, collectionSlug, req, where })\n\n return {\n branchVisibility: branchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter,\n branch: branchReadState.branch,\n collectionSlug,\n })\n : [],\n where: resolvedWhere ?? {},\n }\n}\n\nconst findRelatedDocuments = async ({\n branchVisibility,\n Model,\n projection,\n query,\n}: {\n branchVisibility: PipelineStage[]\n Model: CollectionModel\n projection: Record<string, boolean>\n query: Record<string, unknown>\n}) => {\n if (branchVisibility.length) {\n return Model.aggregate([\n ...buildRelatedQueryPipeline({ branchVisibility, query }),\n { $project: projection },\n ])\n }\n\n return Model.find(query).lean().select(projection)\n}\n\nconst findRelatedDistinctValues = async ({\n branchVisibility,\n Model,\n path,\n query,\n}: {\n branchVisibility: PipelineStage[]\n Model: CollectionModel\n path: string\n query: Record<string, unknown>\n}) => {\n if (!branchVisibility.length) {\n return Model.distinct(path, query)\n }\n\n return Model.aggregate([\n ...buildRelatedQueryPipeline({ branchVisibility, query }),\n { $project: { value: `$${path}` } },\n { $unwind: '$value' },\n { $group: { _id: '$value' } },\n ]).then((results) => results.map(({ _id }) => _id))\n}\n"],"names":["Types","APIError","escapeRegExp","getFieldByPath","getLocalizedPaths","resolveBranchQuery","resolveBranchReadState","rewriteBranchIDs","hasManyRelationshipOperatorSet","isNestedRelationshipQuery","validOperatorSet","getCollection","isObjectID","buildBranchVisibilityStages","buildRelatedQueryPipeline","operatorMap","sanitizeQueryValue","buildSearchParam","branch","collectionSlug","fields","globalSlug","incomingPath","locale","operator","parentIsLocalized","payload","req","val","sanitizedPath","replace","paths","hasCustomID","customIDFieldType","collections","customIDType","undefined","idFieldType","push","complete","field","name","type","path","has","length","hasMany","relationTo","buildHasManyRelationshipSearchParam","nestedWhere","collection","buildJoinContainsSearchParam","Array","isArray","some","entry","sanitizedQueryValue","formattedOperator","rawQuery","formattedValue","value","pathsToQuery","slice","reverse","parentPaths","relationshipQuery","relationshipWhere","i","subPath","entries","parentField","collectionConfig","Model","SubModel","adapter","db","branchVisibility","where","relatedWhere","resolveRelatedBranchQuery","subQuery","buildQuery","select","_id","_branchDocID","joinPath","relationshipField","flattenedFields","on","localizedPath","pathHasLocalized","config","localization","defaultLocale","result","findRelatedDocuments","projection","query","$in","forEach","doc","ref","segment","split","map","item","flat","filter","documentID","stringID","toString","ObjectId","isValid","nextSubPath","id","in","findRelatedDistinctValues","operatorKey","hasNumberIDRelation","multiIDCondition","isRelatedToCustomNumberID","parseFloat","words","$and","word","$options","$regex","$not","RelatedModel","pathLocale","localeCodes","find","localeCode","at","matchingRelatedDocumentsQuery","findRelatedDocumentIDs","document","matchingRelatedDocumentIDs","Object","keys","$nin","$elemMatch","JoinedModel","parentIDs","branchReadState","resolvedWhere","useBranching","aggregate","$project","lean","distinct","$unwind","$group","then","results"],"mappings":"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"}
@@ -69,6 +69,7 @@ export const queryDrafts = async function queryDrafts({ branch, collection: coll
69
69
  adapter: this,
70
70
  fields,
71
71
  select: withBranchVersionSelect({
72
+ branch,
72
73
  collectionSlug,
73
74
  req,
74
75
  select
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/queryDrafts.ts"],"sourcesContent":["import type { PaginateOptions, PipelineStage, QueryOptions } from 'mongoose'\nimport type { QueryDrafts } from 'payload'\n\nimport {\n buildVersionCollectionFields,\n combineQueries,\n flattenWhereToOperators,\n projectBranchVersionParent,\n resolveBranchReadState,\n resolveBranchVersionQuery,\n rewriteBranchVersionParents,\n withBranchVersionSelect,\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 queryDrafts: QueryDrafts = async function queryDrafts(\n this: MongooseAdapter,\n {\n branch,\n collection: collectionSlug,\n joins,\n limit,\n locale,\n page,\n pagination,\n req,\n select,\n sort: sortArg,\n where = {},\n },\n) {\n const { collectionConfig, Model } = getCollection({\n adapter: this,\n collectionSlug,\n versions: true,\n })\n const branchReadState = resolveBranchReadState({ branch, collectionSlug, req })\n\n let hasNearConstraint\n let sort\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 fields = buildVersionCollectionFields(this.payload.config, collectionConfig, true)\n\n const sortAggregation: PipelineStage[] = []\n if (!hasNearConstraint) {\n sort = buildSortParam({\n adapter: this,\n config: this.payload.config,\n fields,\n locale,\n sort: sortArg || collectionConfig.defaultSort,\n sortAggregation,\n timestamps: true,\n versions: true,\n })\n }\n\n const branchedWhere = branchReadState.useBranching\n ? rewriteBranchVersionParents(where)\n : await resolveBranchVersionQuery({\n branch,\n collectionSlug,\n req,\n where,\n })\n const branchVisibility = branchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter: this,\n branch: branchReadState.branch,\n collectionSlug,\n mode: 'drafts',\n })\n : []\n\n const combinedWhere = combineQueries({ latest: { equals: true } }, branchedWhere ?? {})\n\n const versionQuery = await buildQuery({\n adapter: this,\n branch,\n fields,\n locale,\n req,\n where: combinedWhere,\n })\n\n const projection = buildProjectionFromSelect({\n adapter: this,\n fields,\n select: withBranchVersionSelect({ collectionSlug, req, select }),\n })\n\n const session = await getSession(this, req)\n const options: QueryOptions = {\n session,\n }\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 &&\n (hasNearConstraint || !versionQuery || Object.keys(versionQuery).length === 0)\n const paginationOptions: PaginateOptions = {\n lean: true,\n leanWithId: true,\n options,\n page,\n pagination,\n projection,\n sort,\n useEstimatedCount,\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 (\n !useEstimatedCount &&\n Object.keys(versionQuery).length === 0 &&\n this.disableIndexHints !== true\n ) {\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(versionQuery, {\n collation: paginationOptions.collation,\n hint: { _id: 1 },\n session,\n }),\n )\n }\n }\n\n if (limit && 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\n let result\n\n const aggregate = await buildJoinAggregation({\n adapter: this,\n branch,\n collection: collectionSlug,\n collectionConfig,\n joins,\n locale,\n projection,\n query: versionQuery,\n req,\n versions: true,\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: versionQuery,\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(versionQuery, 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 versions: true,\n })\n }\n\n transform({\n adapter: this,\n data: result.docs,\n fields: buildVersionCollectionFields(this.payload.config, collectionConfig),\n operation: 'read',\n })\n\n for (let i = 0; i < result.docs.length; i++) {\n // A branch version's `parent` is the shadow row's primary key, so the\n // canonical document ID comes from `_branchParent` when present.\n const id = projectBranchVersionParent(result.docs[i] as Record<string, unknown>)\n result.docs[i] = result.docs[i].version ?? {}\n result.docs[i].id = id\n }\n\n return result\n}\n"],"names":["buildVersionCollectionFields","combineQueries","flattenWhereToOperators","projectBranchVersionParent","resolveBranchReadState","resolveBranchVersionQuery","rewriteBranchVersionParents","withBranchVersionSelect","buildBranchVisibilityStages","buildQuery","buildSortParam","aggregatePaginate","buildJoinAggregation","buildProjectionFromSelect","getCollection","getSession","resolveJoins","transform","queryDrafts","branch","collection","collectionSlug","joins","limit","locale","page","pagination","req","select","sort","sortArg","where","collectionConfig","Model","adapter","versions","branchReadState","hasNearConstraint","constraints","some","prop","Object","keys","key","fields","payload","config","sortAggregation","defaultSort","timestamps","branchedWhere","useBranching","branchVisibility","mode","combinedWhere","latest","equals","versionQuery","projection","session","options","useEstimatedCount","length","paginationOptions","lean","leanWithId","collation","localizationConfig","localization","defaultLocale","disableIndexHints","useCustomCountFn","Promise","resolve","countDocuments","hint","_id","result","aggregate","query","joinAggregation","undefined","paginate","useJoinAggregations","docs","data","operation","i","id","version"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/queryDrafts.ts"],"sourcesContent":["import type { PaginateOptions, PipelineStage, QueryOptions } from 'mongoose'\nimport type { QueryDrafts } from 'payload'\n\nimport {\n buildVersionCollectionFields,\n combineQueries,\n flattenWhereToOperators,\n projectBranchVersionParent,\n resolveBranchReadState,\n resolveBranchVersionQuery,\n rewriteBranchVersionParents,\n withBranchVersionSelect,\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 queryDrafts: QueryDrafts = async function queryDrafts(\n this: MongooseAdapter,\n {\n branch,\n collection: collectionSlug,\n joins,\n limit,\n locale,\n page,\n pagination,\n req,\n select,\n sort: sortArg,\n where = {},\n },\n) {\n const { collectionConfig, Model } = getCollection({\n adapter: this,\n collectionSlug,\n versions: true,\n })\n const branchReadState = resolveBranchReadState({ branch, collectionSlug, req })\n\n let hasNearConstraint\n let sort\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 fields = buildVersionCollectionFields(this.payload.config, collectionConfig, true)\n\n const sortAggregation: PipelineStage[] = []\n if (!hasNearConstraint) {\n sort = buildSortParam({\n adapter: this,\n config: this.payload.config,\n fields,\n locale,\n sort: sortArg || collectionConfig.defaultSort,\n sortAggregation,\n timestamps: true,\n versions: true,\n })\n }\n\n const branchedWhere = branchReadState.useBranching\n ? rewriteBranchVersionParents(where)\n : await resolveBranchVersionQuery({\n branch,\n collectionSlug,\n req,\n where,\n })\n const branchVisibility = branchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter: this,\n branch: branchReadState.branch,\n collectionSlug,\n mode: 'drafts',\n })\n : []\n\n const combinedWhere = combineQueries({ latest: { equals: true } }, branchedWhere ?? {})\n\n const versionQuery = await buildQuery({\n adapter: this,\n branch,\n fields,\n locale,\n req,\n where: combinedWhere,\n })\n\n const projection = buildProjectionFromSelect({\n adapter: this,\n fields,\n select: withBranchVersionSelect({ branch, collectionSlug, req, select }),\n })\n\n const session = await getSession(this, req)\n const options: QueryOptions = {\n session,\n }\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 &&\n (hasNearConstraint || !versionQuery || Object.keys(versionQuery).length === 0)\n const paginationOptions: PaginateOptions = {\n lean: true,\n leanWithId: true,\n options,\n page,\n pagination,\n projection,\n sort,\n useEstimatedCount,\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 (\n !useEstimatedCount &&\n Object.keys(versionQuery).length === 0 &&\n this.disableIndexHints !== true\n ) {\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(versionQuery, {\n collation: paginationOptions.collation,\n hint: { _id: 1 },\n session,\n }),\n )\n }\n }\n\n if (limit && 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\n let result\n\n const aggregate = await buildJoinAggregation({\n adapter: this,\n branch,\n collection: collectionSlug,\n collectionConfig,\n joins,\n locale,\n projection,\n query: versionQuery,\n req,\n versions: true,\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: versionQuery,\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(versionQuery, 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 versions: true,\n })\n }\n\n transform({\n adapter: this,\n data: result.docs,\n fields: buildVersionCollectionFields(this.payload.config, collectionConfig),\n operation: 'read',\n })\n\n for (let i = 0; i < result.docs.length; i++) {\n // A branch version's `parent` is the shadow row's primary key, so the\n // canonical document ID comes from `_branchParent` when present.\n const id = projectBranchVersionParent(result.docs[i] as Record<string, unknown>)\n result.docs[i] = result.docs[i].version ?? {}\n result.docs[i].id = id\n }\n\n return result\n}\n"],"names":["buildVersionCollectionFields","combineQueries","flattenWhereToOperators","projectBranchVersionParent","resolveBranchReadState","resolveBranchVersionQuery","rewriteBranchVersionParents","withBranchVersionSelect","buildBranchVisibilityStages","buildQuery","buildSortParam","aggregatePaginate","buildJoinAggregation","buildProjectionFromSelect","getCollection","getSession","resolveJoins","transform","queryDrafts","branch","collection","collectionSlug","joins","limit","locale","page","pagination","req","select","sort","sortArg","where","collectionConfig","Model","adapter","versions","branchReadState","hasNearConstraint","constraints","some","prop","Object","keys","key","fields","payload","config","sortAggregation","defaultSort","timestamps","branchedWhere","useBranching","branchVisibility","mode","combinedWhere","latest","equals","versionQuery","projection","session","options","useEstimatedCount","length","paginationOptions","lean","leanWithId","collation","localizationConfig","localization","defaultLocale","disableIndexHints","useCustomCountFn","Promise","resolve","countDocuments","hint","_id","result","aggregate","query","joinAggregation","undefined","paginate","useJoinAggregations","docs","data","operation","i","id","version"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"updateGlobal.d.ts","sourceRoot":"","sources":["../src/updateGlobal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,SAAS,CAAA;AAe7D,eAAO,MAAM,YAAY,EAAE,YAgG1B,CAAA"}
1
+ {"version":3,"file":"updateGlobal.d.ts","sourceRoot":"","sources":["../src/updateGlobal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,SAAS,CAAA;AAe7D,eAAO,MAAM,YAAY,EAAE,YA6F1B,CAAA"}
@@ -56,9 +56,19 @@ export const updateGlobal = async function updateGlobal(args) {
56
56
  },
57
57
  globalType: globalSlug
58
58
  } : isBranchableGlobal ? {
59
- _branch: {
60
- $eq: 'main'
61
- },
59
+ $or: [
60
+ {
61
+ _branch: 'main'
62
+ },
63
+ {
64
+ _branch: {
65
+ $exists: false
66
+ }
67
+ },
68
+ {
69
+ _branch: null
70
+ }
71
+ ],
62
72
  globalType: globalSlug
63
73
  } : {
64
74
  globalType: globalSlug
@@ -107,19 +117,11 @@ export const updateGlobal = async function updateGlobal(args) {
107
117
  });
108
118
  return result;
109
119
  }
110
- // `_branch` is forced rather than taken from `data`. The incoming document is a
111
- // round-trip of a read, and `_branch` is stripped from reads — so the field's
112
- // `main` default silently refills it, and writing that back would flip the
113
- // branch's row onto main and leave two rows claiming to be production.
114
- const writeData = writeBranch ? {
115
- ...data,
116
- _branch: writeBranch
117
- } : data;
118
120
  if (returning === false) {
119
- await Model.updateOne(filter, writeData, baseOptions);
121
+ await Model.updateOne(filter, data, baseOptions);
120
122
  return null;
121
123
  }
122
- const result = await Model.findOneAndUpdate(filter, writeData, findOptions);
124
+ const result = await Model.findOneAndUpdate(filter, data, findOptions);
123
125
  transform({
124
126
  adapter: this,
125
127
  data: result,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/updateGlobal.ts"],"sourcesContent":["import type { QueryOptions } from 'mongoose'\nimport type { UpdateGlobal, UpdateGlobalArgs } from 'payload'\n\nimport { resolveBranchGlobalWrite } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getGlobal } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\nimport { transform } from './utilities/transform.js'\n\ntype BranchUpdateGlobalArgs<T extends Record<string, unknown>> = {\n branchConflictData?: Record<string, unknown>\n} & UpdateGlobalArgs<T>\n\nexport const updateGlobal: UpdateGlobal = async function updateGlobal<\n T extends Record<string, unknown>,\n>(this: MongooseAdapter, args: UpdateGlobalArgs<T>) {\n const {\n slug: globalSlug,\n branch,\n branchConflictData,\n data,\n options: optionsArgs = {},\n req,\n returning,\n select,\n } = args as BranchUpdateGlobalArgs<T>\n const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug })\n\n const fields = globalConfig.fields\n\n transform({ adapter: this, data, fields, globalSlug, operation: 'write' })\n if (branchConflictData) {\n transform({ adapter: this, data: branchConflictData, fields, globalSlug, operation: 'write' })\n }\n\n const baseOptions = {\n ...optionsArgs,\n session: await getSession(this, req),\n // Timestamps are manually added by the write transform\n timestamps: false,\n } satisfies QueryOptions\n\n const findOptions: QueryOptions = {\n ...baseOptions,\n lean: true,\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: globalConfig.flattenedFields,\n select,\n }),\n returnDocument: 'after',\n }\n\n const writeBranch = resolveBranchGlobalWrite({ branch, globalSlug, req })\n const isBranchableGlobal = this.payload.config.branching?.branchableGlobals.has(globalSlug)\n\n // On a branch the write targets that branch's own row, upserting it from\n // main's current content the first time the global is touched.\n const filter = writeBranch\n ? { _branch: { $eq: writeBranch }, globalType: globalSlug }\n : isBranchableGlobal\n ? { _branch: { $eq: 'main' }, globalType: globalSlug }\n : { globalType: globalSlug }\n\n if (writeBranch) {\n const mainDoc = await Model.findOne(\n { _branch: { $eq: 'main' }, globalType: globalSlug },\n {},\n baseOptions,\n ).lean()\n const { _id, __v, ...mainData } = (mainDoc ?? {}) as Record<string, unknown>\n const writeData = { ...((branchConflictData ?? data) as object), _branch: writeBranch }\n const insertData: Record<string, unknown> = { ...mainData, globalType: globalSlug }\n\n for (const key of Object.keys(writeData)) {\n delete insertData[key]\n }\n\n const upsertOptions = { ...findOptions, upsert: true }\n const update = { $set: writeData, $setOnInsert: insertData }\n\n if (returning === false) {\n await Model.findOneAndUpdate(filter, update, { ...baseOptions, upsert: true })\n return null as unknown as T\n }\n\n const result = (await Model.findOneAndUpdate(filter, update, upsertOptions)) as unknown as T\n\n transform({ adapter: this, data: result, fields, globalSlug, operation: 'read' })\n\n return result\n }\n\n // `_branch` is forced rather than taken from `data`. The incoming document is a\n // round-trip of a read, and `_branch` is stripped from reads — so the field's\n // `main` default silently refills it, and writing that back would flip the\n // branch's row onto main and leave two rows claiming to be production.\n const writeData = writeBranch ? { ...(data as object), _branch: writeBranch } : data\n\n if (returning === false) {\n await Model.updateOne(filter, writeData, baseOptions)\n return null as unknown as T\n }\n\n const result = (await Model.findOneAndUpdate(filter, writeData, findOptions)) as unknown as T\n\n transform({ adapter: this, data: result, fields, globalSlug, operation: 'read' })\n\n return result\n}\n"],"names":["resolveBranchGlobalWrite","buildProjectionFromSelect","getGlobal","getSession","transform","updateGlobal","args","slug","globalSlug","branch","branchConflictData","data","options","optionsArgs","req","returning","select","globalConfig","Model","adapter","fields","operation","baseOptions","session","timestamps","findOptions","lean","projection","flattenedFields","returnDocument","writeBranch","isBranchableGlobal","payload","config","branching","branchableGlobals","has","filter","_branch","$eq","globalType","mainDoc","findOne","_id","__v","mainData","writeData","insertData","key","Object","keys","upsertOptions","upsert","update","$set","$setOnInsert","findOneAndUpdate","result","updateOne"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/updateGlobal.ts"],"sourcesContent":["import type { QueryOptions } from 'mongoose'\nimport type { UpdateGlobal, UpdateGlobalArgs } from 'payload'\n\nimport { resolveBranchGlobalWrite } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getGlobal } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\nimport { transform } from './utilities/transform.js'\n\ntype BranchUpdateGlobalArgs<T extends Record<string, unknown>> = {\n branchConflictData?: Record<string, unknown>\n} & UpdateGlobalArgs<T>\n\nexport const updateGlobal: UpdateGlobal = async function updateGlobal<\n T extends Record<string, unknown>,\n>(this: MongooseAdapter, args: UpdateGlobalArgs<T>) {\n const {\n slug: globalSlug,\n branch,\n branchConflictData,\n data,\n options: optionsArgs = {},\n req,\n returning,\n select,\n } = args as BranchUpdateGlobalArgs<T>\n const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug })\n\n const fields = globalConfig.fields\n\n transform({ adapter: this, data, fields, globalSlug, operation: 'write' })\n if (branchConflictData) {\n transform({ adapter: this, data: branchConflictData, fields, globalSlug, operation: 'write' })\n }\n\n const baseOptions = {\n ...optionsArgs,\n session: await getSession(this, req),\n // Timestamps are manually added by the write transform\n timestamps: false,\n } satisfies QueryOptions\n\n const findOptions: QueryOptions = {\n ...baseOptions,\n lean: true,\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: globalConfig.flattenedFields,\n select,\n }),\n returnDocument: 'after',\n }\n\n const writeBranch = resolveBranchGlobalWrite({ branch, globalSlug, req })\n const isBranchableGlobal = this.payload.config.branching?.branchableGlobals.has(globalSlug)\n\n // On a branch the write targets that branch's own row, upserting it from\n // main's current content the first time the global is touched.\n const filter = writeBranch\n ? { _branch: { $eq: writeBranch }, globalType: globalSlug }\n : isBranchableGlobal\n ? {\n $or: [{ _branch: 'main' }, { _branch: { $exists: false } }, { _branch: null }],\n globalType: globalSlug,\n }\n : { globalType: globalSlug }\n\n if (writeBranch) {\n const mainDoc = await Model.findOne(\n { _branch: { $eq: 'main' }, globalType: globalSlug },\n {},\n baseOptions,\n ).lean()\n const { _id, __v, ...mainData } = (mainDoc ?? {}) as Record<string, unknown>\n const writeData = { ...((branchConflictData ?? data) as object), _branch: writeBranch }\n const insertData: Record<string, unknown> = { ...mainData, globalType: globalSlug }\n\n for (const key of Object.keys(writeData)) {\n delete insertData[key]\n }\n\n const upsertOptions = { ...findOptions, upsert: true }\n const update = { $set: writeData, $setOnInsert: insertData }\n\n if (returning === false) {\n await Model.findOneAndUpdate(filter, update, { ...baseOptions, upsert: true })\n return null as unknown as T\n }\n\n const result = (await Model.findOneAndUpdate(filter, update, upsertOptions)) as unknown as T\n\n transform({ adapter: this, data: result, fields, globalSlug, operation: 'read' })\n\n return result\n }\n\n if (returning === false) {\n await Model.updateOne(filter, data, baseOptions)\n return null as unknown as T\n }\n\n const result = (await Model.findOneAndUpdate(filter, data, findOptions)) as unknown as T\n\n transform({ adapter: this, data: result, fields, globalSlug, operation: 'read' })\n\n return result\n}\n"],"names":["resolveBranchGlobalWrite","buildProjectionFromSelect","getGlobal","getSession","transform","updateGlobal","args","slug","globalSlug","branch","branchConflictData","data","options","optionsArgs","req","returning","select","globalConfig","Model","adapter","fields","operation","baseOptions","session","timestamps","findOptions","lean","projection","flattenedFields","returnDocument","writeBranch","isBranchableGlobal","payload","config","branching","branchableGlobals","has","filter","_branch","$eq","globalType","$or","$exists","mainDoc","findOne","_id","__v","mainData","writeData","insertData","key","Object","keys","upsertOptions","upsert","update","$set","$setOnInsert","findOneAndUpdate","result","updateOne"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"buildJoinAggregation.d.ts","sourceRoot":"","sources":["../../src/utilities/buildJoinAggregation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7C,OAAO,EAIL,KAAK,cAAc,EAKnB,KAAK,SAAS,EACd,KAAK,cAAc,EAKnB,KAAK,yBAAyB,EAE/B,MAAM,SAAS,CAAA;AAGhB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAQlD,KAAK,wBAAwB,GAAG;IAC9B,OAAO,EAAE,eAAe,CAAA;IACxB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,UAAU,EAAE,cAAc,CAAA;IAC1B,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAEjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7B,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,oBAAoB,gHAW9B,wBAAwB,KAAG,OAAO,CAAC,aAAa,EAAE,CAuiBpD,CAAA"}
1
+ {"version":3,"file":"buildJoinAggregation.d.ts","sourceRoot":"","sources":["../../src/utilities/buildJoinAggregation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7C,OAAO,EAIL,KAAK,cAAc,EAKnB,KAAK,SAAS,EACd,KAAK,cAAc,EAKnB,KAAK,yBAAyB,EAE/B,MAAM,SAAS,CAAA;AAGhB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAQlD,KAAK,wBAAwB,GAAG;IAC9B,OAAO,EAAE,eAAe,CAAA;IACxB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,UAAU,EAAE,cAAc,CAAA;IAC1B,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAEjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7B,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,oBAAoB,gHAW9B,wBAAwB,KAAG,OAAO,CAAC,aAAa,EAAE,CA2jBpD,CAAA"}
@@ -16,6 +16,17 @@ export const buildJoinAggregation = async ({ adapter, branch, collection, collec
16
16
  throw new APIError(`Could not retrieve sanitized join config for ${collection}.`);
17
17
  }
18
18
  const aggregate = [];
19
+ const outerBranchReadState = resolveBranchReadState({
20
+ branch,
21
+ collectionSlug: collection,
22
+ req
23
+ });
24
+ const canonicalParentField = '__payloadJoinParentID';
25
+ let localField = versions ? 'parent' : '_id';
26
+ if (outerBranchReadState.useBranching) {
27
+ localField = canonicalParentField;
28
+ }
29
+ const rootIDExpression = outerBranchReadState.useBranching ? `$${canonicalParentField}` : '$_id';
19
30
  const polymorphicJoinsConfig = adapter.payload.collections[collection]?.config?.polymorphicJoins;
20
31
  if (!polymorphicJoinsConfig) {
21
32
  throw new APIError(`Could not retrieve sanitized polymorphic joins config for ${collection}.`);
@@ -137,7 +148,7 @@ export const buildJoinAggregation = async ({ adapter, branch, collection, collec
137
148
  as: alias,
138
149
  from: JoinModel.collection.name,
139
150
  let: {
140
- root_id_: '$_id'
151
+ root_id_: rootIDExpression
141
152
  },
142
153
  pipeline: [
143
154
  ...basePipeline,
@@ -170,7 +181,7 @@ export const buildJoinAggregation = async ({ adapter, branch, collection, collec
170
181
  as: `${as}.totalDocs.${alias}`,
171
182
  from: JoinModel.collection.name,
172
183
  let: {
173
- root_id_: '$_id'
184
+ root_id_: rootIDExpression
174
185
  },
175
186
  pipeline: [
176
187
  ...basePipeline,
@@ -387,7 +398,7 @@ export const buildJoinAggregation = async ({ adapter, branch, collection, collec
387
398
  as: `${as}.totalDocs`,
388
399
  foreignField,
389
400
  from: JoinModel.collection.name,
390
- localField: versions ? 'parent' : '_id',
401
+ localField,
391
402
  pipeline: [
392
403
  {
393
404
  $match
@@ -422,7 +433,7 @@ export const buildJoinAggregation = async ({ adapter, branch, collection, collec
422
433
  as: `${as}.docs`,
423
434
  foreignField: `${foreignFieldPrefix}${join.field.on}${code}${polymorphicSuffix}`,
424
435
  from: JoinModel.collection.name,
425
- localField: versions ? 'parent' : '_id',
436
+ localField,
426
437
  pipeline
427
438
  }
428
439
  }, {
@@ -479,7 +490,7 @@ export const buildJoinAggregation = async ({ adapter, branch, collection, collec
479
490
  as: `${as}.docs`,
480
491
  foreignField: `${foreignFieldPrefix}${foreignField}`,
481
492
  from: JoinModel.collection.name,
482
- localField: versions ? 'parent' : '_id',
493
+ localField,
483
494
  pipeline
484
495
  }
485
496
  }, {
@@ -519,6 +530,26 @@ export const buildJoinAggregation = async ({ adapter, branch, collection, collec
519
530
  }
520
531
  }
521
532
  }
533
+ if (aggregate.length && outerBranchReadState.useBranching) {
534
+ aggregate.unshift({
535
+ $set: {
536
+ [canonicalParentField]: versions ? {
537
+ $ifNull: [
538
+ '$_branchParent',
539
+ '$parent'
540
+ ]
541
+ } : {
542
+ $ifNull: [
543
+ '$_branchDocID',
544
+ '$_id'
545
+ ]
546
+ }
547
+ }
548
+ });
549
+ aggregate.push({
550
+ $unset: canonicalParentField
551
+ });
552
+ }
522
553
  return aggregate;
523
554
  };
524
555
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/buildJoinAggregation.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\n\nimport {\n APIError,\n appendVersionToQueryKey,\n buildVersionCollectionFields,\n type CollectionSlug,\n combineQueries,\n type FlattenedField,\n getBranchPredicateSync,\n getQueryDraftsSort,\n type JoinQuery,\n type PayloadRequest,\n resolveBranchReadState,\n resolveBranchVersionQuery,\n rewriteBranchIDs,\n rewriteBranchVersionParents,\n type SanitizedCollectionConfig,\n type Where,\n} from 'payload'\nimport { fieldShouldBeLocalized, hasDraftsEnabled } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\nimport type { CollectionModel } from '../types.js'\n\nimport { buildBranchVisibilityStages } from '../queries/buildBranchVisibility.js'\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { buildSortParam } from '../queries/buildSortParam.js'\nimport { getCollection } from './getEntity.js'\n\ntype BuildJoinAggregationArgs = {\n adapter: MongooseAdapter\n branch?: false | string\n collection: CollectionSlug\n collectionConfig: SanitizedCollectionConfig\n draftsEnabled?: boolean\n joins?: JoinQuery\n locale?: string\n projection?: Record<string, true>\n // the where clause for the top collection\n query?: Record<string, unknown>\n req?: Partial<PayloadRequest>\n /** whether the query is from drafts */\n versions?: boolean\n}\n\nexport const buildJoinAggregation = async ({\n adapter,\n branch,\n collection,\n collectionConfig,\n draftsEnabled,\n joins,\n locale,\n projection,\n req,\n versions,\n}: BuildJoinAggregationArgs): Promise<PipelineStage[]> => {\n if (!adapter.useJoinAggregations) {\n return []\n }\n if (\n (Object.keys(collectionConfig.joins).length === 0 &&\n collectionConfig.polymorphicJoins.length == 0) ||\n joins === false\n ) {\n return []\n }\n\n const joinConfig = adapter.payload.collections[collection]?.config?.joins\n\n if (!joinConfig) {\n throw new APIError(`Could not retrieve sanitized join config for ${collection}.`)\n }\n\n const aggregate: PipelineStage[] = []\n const polymorphicJoinsConfig = adapter.payload.collections[collection]?.config?.polymorphicJoins\n\n if (!polymorphicJoinsConfig) {\n throw new APIError(`Could not retrieve sanitized polymorphic joins config for ${collection}.`)\n }\n\n for (const join of polymorphicJoinsConfig) {\n if (projection && !projection[join.joinPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const {\n count = false,\n limit: limitJoin = join.field.defaultLimit ?? 10,\n page,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin = {},\n } = joins?.[join.joinPath] || {}\n\n const aggregatedFields: FlattenedField[] = []\n for (const collectionSlug of join.field.collection) {\n const { collectionConfig } = getCollection({ adapter, collectionSlug })\n\n for (const field of collectionConfig.flattenedFields) {\n if (!aggregatedFields.some((eachField) => eachField.name === field.name)) {\n aggregatedFields.push(field)\n }\n }\n }\n\n const sort = buildSortParam({\n adapter,\n config: adapter.payload.config,\n fields: aggregatedFields,\n locale,\n sort: sortJoin,\n timestamps: true,\n })\n\n const $match = await buildQuery({\n adapter,\n branch,\n fields: aggregatedFields,\n locale,\n req,\n where: whereJoin,\n })\n\n const sortProperty = Object.keys(sort)[0]! // assert because buildSortParam always returns at least 1 key.\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n const projectSort = sortProperty !== '_id' && sortProperty !== 'relationTo'\n\n const aliases: string[] = []\n\n const as = join.joinPath\n\n for (const collectionSlug of join.field.collection) {\n const alias = `${as}.docs.${collectionSlug}`\n aliases.push(alias)\n\n const joinBranchPredicate = getBranchPredicateSync({\n branch,\n collectionSlug,\n req,\n })\n const joinBranchReadState = resolveBranchReadState({\n branch,\n collectionSlug,\n req,\n })\n const branchMatch = joinBranchPredicate\n ? await buildQuery({\n adapter,\n branch,\n fields: adapter.payload.collections[collectionSlug]!.config.flattenedFields,\n locale,\n req,\n where: joinBranchPredicate,\n })\n : undefined\n const branchVisibility = joinBranchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter,\n branch: joinBranchReadState.branch,\n collectionSlug,\n })\n : []\n const basePipeline: Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[] = [\n {\n $addFields: {\n relationTo: {\n $literal: collectionSlug,\n },\n },\n },\n {\n $match: {\n $and: [\n {\n $expr: {\n $eq: [`$${join.field.on}`, '$$root_id_'],\n },\n },\n $match,\n ...(branchMatch ? [branchMatch] : []),\n ],\n },\n },\n ...branchVisibility,\n ...(joinBranchPredicate || branchVisibility.length\n ? ([{ $set: { _id: { $ifNull: ['$_branchDocID', '$_id'] } } }] as Exclude<\n PipelineStage,\n PipelineStage.Merge | PipelineStage.Out\n >[])\n : []),\n ]\n\n const { Model: JoinModel } = getCollection({ adapter, collectionSlug })\n\n aggregate.push({\n $lookup: {\n as: alias,\n from: JoinModel.collection.name,\n let: {\n root_id_: '$_id',\n },\n pipeline: [\n ...basePipeline,\n {\n $sort: {\n [sortProperty]: sortDirection,\n },\n },\n ...(limitJoin > 0\n ? [\n {\n // Unfortunately, we can't use $skip here because we can lose data, instead we do $slice then\n $limit: page ? page * limitJoin : limitJoin,\n },\n ]\n : []),\n {\n $project: {\n value: '$_id',\n ...(projectSort && {\n [sortProperty]: 1,\n }),\n relationTo: 1,\n },\n },\n ],\n },\n })\n\n if (count) {\n aggregate.push({\n $lookup: {\n as: `${as}.totalDocs.${alias}`,\n from: JoinModel.collection.name,\n let: {\n root_id_: '$_id',\n },\n pipeline: [\n ...basePipeline,\n {\n $count: 'result',\n },\n ],\n },\n })\n }\n }\n\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $concatArrays: aliases.map((alias) => `$${alias}`),\n },\n },\n })\n\n if (count) {\n aggregate.push({\n $addFields: {\n [`${as}.totalDocs`]: {\n $add: aliases.map((alias) => ({\n $ifNull: [\n {\n $first: `$${as}.totalDocs.${alias}.result`,\n },\n 0,\n ],\n })),\n },\n },\n })\n }\n\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $sortArray: {\n input: `$${as}.docs`,\n sortBy: {\n [sortProperty]: sortDirection,\n },\n },\n },\n },\n })\n\n const sliceValue = page ? [(page - 1) * limitJoin, limitJoin] : [limitJoin]\n\n aggregate.push({\n $addFields: {\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n },\n },\n })\n\n if (limitJoin > 0) {\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, ...sliceValue],\n },\n },\n })\n }\n }\n\n for (const slug of Object.keys(joinConfig)) {\n const joinsList = joinConfig[slug]\n\n if (!joinsList) {\n throw new APIError(`Failed to retrieve array of joins for ${slug} in collectio ${collection}`)\n }\n\n for (const join of joinsList) {\n const projectionPath = versions ? `version.${join.joinPath}` : join.joinPath\n if (projection && !projection[projectionPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const collectionConfig = adapter.payload.collections[join.field.collection as string]?.config\n\n if (!collectionConfig) {\n throw new APIError(\n `Collection config for ${join.field.collection.toString()} was not found`,\n )\n }\n\n let JoinModel: CollectionModel | undefined\n\n const useDrafts = (draftsEnabled || versions) && hasDraftsEnabled(collectionConfig)\n\n if (useDrafts) {\n JoinModel = adapter.versions[collectionConfig.slug]\n } else {\n JoinModel = adapter.collections[collectionConfig.slug]\n }\n\n if (!JoinModel) {\n throw new APIError(`Join Model was not found for ${collectionConfig.slug}`)\n }\n\n const {\n count,\n limit: limitJoin = join.field.defaultLimit ?? 10,\n page,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin = {},\n } = joins?.[join.joinPath] || {}\n\n if (Array.isArray(join.field.collection)) {\n throw new Error('Unreachable')\n }\n\n const fields = useDrafts\n ? buildVersionCollectionFields(adapter.payload.config, collectionConfig, true)\n : collectionConfig.flattenedFields\n\n const sort = buildSortParam({\n adapter,\n config: adapter.payload.config,\n fields,\n locale,\n sort: useDrafts ? getQueryDraftsSort({ collectionConfig, sort: sortJoin }) : sortJoin,\n timestamps: true,\n })\n const sortProperty = Object.keys(sort)[0]!\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n // A join subquery must carry the same branch predicate as the top-level\n // read, or a branch would see main's related documents.\n const joinBranchPredicate = getBranchPredicateSync({\n branch,\n collectionSlug: collectionConfig.slug,\n req,\n })\n const joinBranchReadState = resolveBranchReadState({\n branch,\n collectionSlug: collectionConfig.slug,\n req,\n })\n\n const resolvedWhereJoin = useDrafts\n ? joinBranchReadState.useBranching\n ? (rewriteBranchVersionParents(appendVersionToQueryKey(whereJoin)) ?? {})\n : ((await resolveBranchVersionQuery({\n branch,\n collectionSlug: collectionConfig.slug,\n req,\n where: appendVersionToQueryKey(whereJoin),\n })) ?? {})\n : joinBranchReadState.useBranching\n ? (rewriteBranchIDs(whereJoin) ?? {})\n : joinBranchPredicate\n ? ({ and: [whereJoin, joinBranchPredicate] } as Where)\n : whereJoin\n\n const $match = await JoinModel.buildQuery({\n branch,\n locale,\n payload: adapter.payload,\n req,\n where: useDrafts\n ? combineQueries(resolvedWhereJoin, {\n latest: {\n equals: true,\n },\n })\n : resolvedWhereJoin,\n })\n const branchVisibility = joinBranchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter,\n branch: joinBranchReadState.branch,\n collectionSlug: collectionConfig.slug,\n mode: useDrafts ? 'drafts' : 'documents',\n })\n : []\n\n const pipeline: Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[] = [\n { $match },\n ...branchVisibility,\n // Surface the canonical document ID rather than the shadow row's own\n // primary key, so join results address documents the same way every\n // other read does.\n ...(joinBranchPredicate || branchVisibility.length\n ? ([\n useDrafts\n ? { $set: { parent: { $ifNull: ['$_branchParent', '$parent'] } } }\n : { $set: { _id: { $ifNull: ['$_branchDocID', '$_id'] } } },\n ] as Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[])\n : []),\n {\n $sort: { [sortProperty]: sortDirection },\n },\n ]\n\n if (page) {\n pipeline.push({\n $skip: (page - 1) * limitJoin,\n })\n }\n\n if (limitJoin > 0) {\n pipeline.push({\n $limit: limitJoin + 1,\n })\n }\n\n let polymorphicSuffix = ''\n if (Array.isArray(join.targetField.relationTo)) {\n polymorphicSuffix = '.value'\n }\n\n const addTotalDocsAggregation = (as: string, foreignField: string) =>\n aggregate.push(\n {\n $lookup: {\n as: `${as}.totalDocs`,\n foreignField,\n from: JoinModel.collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline: [\n {\n $match,\n },\n ...branchVisibility,\n {\n $count: 'result',\n },\n ],\n },\n },\n {\n $addFields: {\n [`${as}.totalDocs`]: { $ifNull: [{ $first: `$${as}.totalDocs.result` }, 0] },\n },\n },\n )\n\n let foreignFieldPrefix = ''\n\n if (useDrafts) {\n foreignFieldPrefix = 'version.'\n }\n\n if (adapter.payload.config.localization && locale === 'all') {\n adapter.payload.config.localization.localeCodes.forEach((code) => {\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${code}`\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${foreignFieldPrefix}${join.field.on}${code}${polymorphicSuffix}`,\n from: JoinModel.collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: useDrafts ? `$$doc.parent` : '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: limitJoin\n ? { $gt: [{ $size: `$${as}.docs` }, limitJoin] }\n : false,\n // Boolean indicating if more docs than limit\n },\n },\n )\n\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n\n if (count) {\n addTotalDocsAggregation(\n as,\n `${foreignFieldPrefix}${join.field.on}${code}${polymorphicSuffix}`,\n )\n }\n })\n } else {\n const localeSuffix =\n fieldShouldBeLocalized({\n field: join.field,\n parentIsLocalized: join.parentIsLocalized,\n }) &&\n adapter.payload.config.localization &&\n locale\n ? `.${locale}`\n : ''\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${localeSuffix}`\n\n let foreignField: string\n\n if (join.getForeignPath) {\n foreignField = `${join.getForeignPath({ locale })}${polymorphicSuffix}`\n } else {\n foreignField = `${join.field.on}${polymorphicSuffix}`\n }\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${foreignFieldPrefix}${foreignField}`,\n from: JoinModel.collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: useDrafts ? `$$doc.parent` : '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n }, // Boolean indicating if more docs than limit\n },\n },\n )\n\n if (count) {\n addTotalDocsAggregation(as, `${foreignFieldPrefix}${foreignField}`)\n }\n\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n }\n }\n }\n\n return aggregate\n}\n"],"names":["APIError","appendVersionToQueryKey","buildVersionCollectionFields","combineQueries","getBranchPredicateSync","getQueryDraftsSort","resolveBranchReadState","resolveBranchVersionQuery","rewriteBranchIDs","rewriteBranchVersionParents","fieldShouldBeLocalized","hasDraftsEnabled","buildBranchVisibilityStages","buildQuery","buildSortParam","getCollection","buildJoinAggregation","adapter","branch","collection","collectionConfig","draftsEnabled","joins","locale","projection","req","versions","useJoinAggregations","Object","keys","length","polymorphicJoins","joinConfig","payload","collections","config","aggregate","polymorphicJoinsConfig","join","joinPath","count","limit","limitJoin","field","defaultLimit","page","sort","sortJoin","defaultSort","where","whereJoin","aggregatedFields","collectionSlug","flattenedFields","some","eachField","name","push","fields","timestamps","$match","sortProperty","sortDirection","projectSort","aliases","as","alias","joinBranchPredicate","joinBranchReadState","branchMatch","undefined","branchVisibility","useBranching","basePipeline","$addFields","relationTo","$literal","$and","$expr","$eq","on","$set","_id","$ifNull","Model","JoinModel","$lookup","from","let","root_id_","pipeline","$sort","$limit","$project","value","$count","$concatArrays","map","$add","$first","$sortArray","input","sortBy","sliceValue","$gt","$size","Number","MAX_VALUE","$slice","slug","joinsList","projectionPath","toString","useDrafts","Array","isArray","Error","resolvedWhereJoin","and","latest","equals","mode","parent","$skip","polymorphicSuffix","targetField","addTotalDocsAggregation","foreignField","localField","foreignFieldPrefix","localization","localeCodes","forEach","code","$map","in","localeSuffix","parentIsLocalized","getForeignPath"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/buildJoinAggregation.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\n\nimport {\n APIError,\n appendVersionToQueryKey,\n buildVersionCollectionFields,\n type CollectionSlug,\n combineQueries,\n type FlattenedField,\n getBranchPredicateSync,\n getQueryDraftsSort,\n type JoinQuery,\n type PayloadRequest,\n resolveBranchReadState,\n resolveBranchVersionQuery,\n rewriteBranchIDs,\n rewriteBranchVersionParents,\n type SanitizedCollectionConfig,\n type Where,\n} from 'payload'\nimport { fieldShouldBeLocalized, hasDraftsEnabled } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\nimport type { CollectionModel } from '../types.js'\n\nimport { buildBranchVisibilityStages } from '../queries/buildBranchVisibility.js'\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { buildSortParam } from '../queries/buildSortParam.js'\nimport { getCollection } from './getEntity.js'\n\ntype BuildJoinAggregationArgs = {\n adapter: MongooseAdapter\n branch?: false | string\n collection: CollectionSlug\n collectionConfig: SanitizedCollectionConfig\n draftsEnabled?: boolean\n joins?: JoinQuery\n locale?: string\n projection?: Record<string, true>\n // the where clause for the top collection\n query?: Record<string, unknown>\n req?: Partial<PayloadRequest>\n /** whether the query is from drafts */\n versions?: boolean\n}\n\nexport const buildJoinAggregation = async ({\n adapter,\n branch,\n collection,\n collectionConfig,\n draftsEnabled,\n joins,\n locale,\n projection,\n req,\n versions,\n}: BuildJoinAggregationArgs): Promise<PipelineStage[]> => {\n if (!adapter.useJoinAggregations) {\n return []\n }\n if (\n (Object.keys(collectionConfig.joins).length === 0 &&\n collectionConfig.polymorphicJoins.length == 0) ||\n joins === false\n ) {\n return []\n }\n\n const joinConfig = adapter.payload.collections[collection]?.config?.joins\n\n if (!joinConfig) {\n throw new APIError(`Could not retrieve sanitized join config for ${collection}.`)\n }\n\n const aggregate: PipelineStage[] = []\n const outerBranchReadState = resolveBranchReadState({ branch, collectionSlug: collection, req })\n const canonicalParentField = '__payloadJoinParentID'\n let localField = versions ? 'parent' : '_id'\n\n if (outerBranchReadState.useBranching) {\n localField = canonicalParentField\n }\n\n const rootIDExpression = outerBranchReadState.useBranching ? `$${canonicalParentField}` : '$_id'\n const polymorphicJoinsConfig = adapter.payload.collections[collection]?.config?.polymorphicJoins\n\n if (!polymorphicJoinsConfig) {\n throw new APIError(`Could not retrieve sanitized polymorphic joins config for ${collection}.`)\n }\n\n for (const join of polymorphicJoinsConfig) {\n if (projection && !projection[join.joinPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const {\n count = false,\n limit: limitJoin = join.field.defaultLimit ?? 10,\n page,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin = {},\n } = joins?.[join.joinPath] || {}\n\n const aggregatedFields: FlattenedField[] = []\n for (const collectionSlug of join.field.collection) {\n const { collectionConfig } = getCollection({ adapter, collectionSlug })\n\n for (const field of collectionConfig.flattenedFields) {\n if (!aggregatedFields.some((eachField) => eachField.name === field.name)) {\n aggregatedFields.push(field)\n }\n }\n }\n\n const sort = buildSortParam({\n adapter,\n config: adapter.payload.config,\n fields: aggregatedFields,\n locale,\n sort: sortJoin,\n timestamps: true,\n })\n\n const $match = await buildQuery({\n adapter,\n branch,\n fields: aggregatedFields,\n locale,\n req,\n where: whereJoin,\n })\n\n const sortProperty = Object.keys(sort)[0]! // assert because buildSortParam always returns at least 1 key.\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n const projectSort = sortProperty !== '_id' && sortProperty !== 'relationTo'\n\n const aliases: string[] = []\n\n const as = join.joinPath\n\n for (const collectionSlug of join.field.collection) {\n const alias = `${as}.docs.${collectionSlug}`\n aliases.push(alias)\n\n const joinBranchPredicate = getBranchPredicateSync({\n branch,\n collectionSlug,\n req,\n })\n const joinBranchReadState = resolveBranchReadState({\n branch,\n collectionSlug,\n req,\n })\n const branchMatch = joinBranchPredicate\n ? await buildQuery({\n adapter,\n branch,\n fields: adapter.payload.collections[collectionSlug]!.config.flattenedFields,\n locale,\n req,\n where: joinBranchPredicate,\n })\n : undefined\n const branchVisibility = joinBranchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter,\n branch: joinBranchReadState.branch,\n collectionSlug,\n })\n : []\n const basePipeline: Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[] = [\n {\n $addFields: {\n relationTo: {\n $literal: collectionSlug,\n },\n },\n },\n {\n $match: {\n $and: [\n {\n $expr: {\n $eq: [`$${join.field.on}`, '$$root_id_'],\n },\n },\n $match,\n ...(branchMatch ? [branchMatch] : []),\n ],\n },\n },\n ...branchVisibility,\n ...(joinBranchPredicate || branchVisibility.length\n ? ([{ $set: { _id: { $ifNull: ['$_branchDocID', '$_id'] } } }] as Exclude<\n PipelineStage,\n PipelineStage.Merge | PipelineStage.Out\n >[])\n : []),\n ]\n\n const { Model: JoinModel } = getCollection({ adapter, collectionSlug })\n\n aggregate.push({\n $lookup: {\n as: alias,\n from: JoinModel.collection.name,\n let: {\n root_id_: rootIDExpression,\n },\n pipeline: [\n ...basePipeline,\n {\n $sort: {\n [sortProperty]: sortDirection,\n },\n },\n ...(limitJoin > 0\n ? [\n {\n // Unfortunately, we can't use $skip here because we can lose data, instead we do $slice then\n $limit: page ? page * limitJoin : limitJoin,\n },\n ]\n : []),\n {\n $project: {\n value: '$_id',\n ...(projectSort && {\n [sortProperty]: 1,\n }),\n relationTo: 1,\n },\n },\n ],\n },\n })\n\n if (count) {\n aggregate.push({\n $lookup: {\n as: `${as}.totalDocs.${alias}`,\n from: JoinModel.collection.name,\n let: {\n root_id_: rootIDExpression,\n },\n pipeline: [\n ...basePipeline,\n {\n $count: 'result',\n },\n ],\n },\n })\n }\n }\n\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $concatArrays: aliases.map((alias) => `$${alias}`),\n },\n },\n })\n\n if (count) {\n aggregate.push({\n $addFields: {\n [`${as}.totalDocs`]: {\n $add: aliases.map((alias) => ({\n $ifNull: [\n {\n $first: `$${as}.totalDocs.${alias}.result`,\n },\n 0,\n ],\n })),\n },\n },\n })\n }\n\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $sortArray: {\n input: `$${as}.docs`,\n sortBy: {\n [sortProperty]: sortDirection,\n },\n },\n },\n },\n })\n\n const sliceValue = page ? [(page - 1) * limitJoin, limitJoin] : [limitJoin]\n\n aggregate.push({\n $addFields: {\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n },\n },\n })\n\n if (limitJoin > 0) {\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, ...sliceValue],\n },\n },\n })\n }\n }\n\n for (const slug of Object.keys(joinConfig)) {\n const joinsList = joinConfig[slug]\n\n if (!joinsList) {\n throw new APIError(`Failed to retrieve array of joins for ${slug} in collectio ${collection}`)\n }\n\n for (const join of joinsList) {\n const projectionPath = versions ? `version.${join.joinPath}` : join.joinPath\n if (projection && !projection[projectionPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const collectionConfig = adapter.payload.collections[join.field.collection as string]?.config\n\n if (!collectionConfig) {\n throw new APIError(\n `Collection config for ${join.field.collection.toString()} was not found`,\n )\n }\n\n let JoinModel: CollectionModel | undefined\n\n const useDrafts = (draftsEnabled || versions) && hasDraftsEnabled(collectionConfig)\n\n if (useDrafts) {\n JoinModel = adapter.versions[collectionConfig.slug]\n } else {\n JoinModel = adapter.collections[collectionConfig.slug]\n }\n\n if (!JoinModel) {\n throw new APIError(`Join Model was not found for ${collectionConfig.slug}`)\n }\n\n const {\n count,\n limit: limitJoin = join.field.defaultLimit ?? 10,\n page,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin = {},\n } = joins?.[join.joinPath] || {}\n\n if (Array.isArray(join.field.collection)) {\n throw new Error('Unreachable')\n }\n\n const fields = useDrafts\n ? buildVersionCollectionFields(adapter.payload.config, collectionConfig, true)\n : collectionConfig.flattenedFields\n\n const sort = buildSortParam({\n adapter,\n config: adapter.payload.config,\n fields,\n locale,\n sort: useDrafts ? getQueryDraftsSort({ collectionConfig, sort: sortJoin }) : sortJoin,\n timestamps: true,\n })\n const sortProperty = Object.keys(sort)[0]!\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n // A join subquery must carry the same branch predicate as the top-level\n // read, or a branch would see main's related documents.\n const joinBranchPredicate = getBranchPredicateSync({\n branch,\n collectionSlug: collectionConfig.slug,\n req,\n })\n const joinBranchReadState = resolveBranchReadState({\n branch,\n collectionSlug: collectionConfig.slug,\n req,\n })\n\n const resolvedWhereJoin = useDrafts\n ? joinBranchReadState.useBranching\n ? (rewriteBranchVersionParents(appendVersionToQueryKey(whereJoin)) ?? {})\n : ((await resolveBranchVersionQuery({\n branch,\n collectionSlug: collectionConfig.slug,\n req,\n where: appendVersionToQueryKey(whereJoin),\n })) ?? {})\n : joinBranchReadState.useBranching\n ? (rewriteBranchIDs(whereJoin) ?? {})\n : joinBranchPredicate\n ? ({ and: [whereJoin, joinBranchPredicate] } as Where)\n : whereJoin\n\n const $match = await JoinModel.buildQuery({\n branch,\n locale,\n payload: adapter.payload,\n req,\n where: useDrafts\n ? combineQueries(resolvedWhereJoin, {\n latest: {\n equals: true,\n },\n })\n : resolvedWhereJoin,\n })\n const branchVisibility = joinBranchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter,\n branch: joinBranchReadState.branch,\n collectionSlug: collectionConfig.slug,\n mode: useDrafts ? 'drafts' : 'documents',\n })\n : []\n\n const pipeline: Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[] = [\n { $match },\n ...branchVisibility,\n // Surface the canonical document ID rather than the shadow row's own\n // primary key, so join results address documents the same way every\n // other read does.\n ...(joinBranchPredicate || branchVisibility.length\n ? ([\n useDrafts\n ? { $set: { parent: { $ifNull: ['$_branchParent', '$parent'] } } }\n : { $set: { _id: { $ifNull: ['$_branchDocID', '$_id'] } } },\n ] as Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[])\n : []),\n {\n $sort: { [sortProperty]: sortDirection },\n },\n ]\n\n if (page) {\n pipeline.push({\n $skip: (page - 1) * limitJoin,\n })\n }\n\n if (limitJoin > 0) {\n pipeline.push({\n $limit: limitJoin + 1,\n })\n }\n\n let polymorphicSuffix = ''\n if (Array.isArray(join.targetField.relationTo)) {\n polymorphicSuffix = '.value'\n }\n\n const addTotalDocsAggregation = (as: string, foreignField: string) =>\n aggregate.push(\n {\n $lookup: {\n as: `${as}.totalDocs`,\n foreignField,\n from: JoinModel.collection.name,\n localField,\n pipeline: [\n {\n $match,\n },\n ...branchVisibility,\n {\n $count: 'result',\n },\n ],\n },\n },\n {\n $addFields: {\n [`${as}.totalDocs`]: { $ifNull: [{ $first: `$${as}.totalDocs.result` }, 0] },\n },\n },\n )\n\n let foreignFieldPrefix = ''\n\n if (useDrafts) {\n foreignFieldPrefix = 'version.'\n }\n\n if (adapter.payload.config.localization && locale === 'all') {\n adapter.payload.config.localization.localeCodes.forEach((code) => {\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${code}`\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${foreignFieldPrefix}${join.field.on}${code}${polymorphicSuffix}`,\n from: JoinModel.collection.name,\n localField,\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: useDrafts ? `$$doc.parent` : '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: limitJoin\n ? { $gt: [{ $size: `$${as}.docs` }, limitJoin] }\n : false,\n // Boolean indicating if more docs than limit\n },\n },\n )\n\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n\n if (count) {\n addTotalDocsAggregation(\n as,\n `${foreignFieldPrefix}${join.field.on}${code}${polymorphicSuffix}`,\n )\n }\n })\n } else {\n const localeSuffix =\n fieldShouldBeLocalized({\n field: join.field,\n parentIsLocalized: join.parentIsLocalized,\n }) &&\n adapter.payload.config.localization &&\n locale\n ? `.${locale}`\n : ''\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${localeSuffix}`\n\n let foreignField: string\n\n if (join.getForeignPath) {\n foreignField = `${join.getForeignPath({ locale })}${polymorphicSuffix}`\n } else {\n foreignField = `${join.field.on}${polymorphicSuffix}`\n }\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${foreignFieldPrefix}${foreignField}`,\n from: JoinModel.collection.name,\n localField,\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: useDrafts ? `$$doc.parent` : '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n }, // Boolean indicating if more docs than limit\n },\n },\n )\n\n if (count) {\n addTotalDocsAggregation(as, `${foreignFieldPrefix}${foreignField}`)\n }\n\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n }\n }\n }\n\n if (aggregate.length && outerBranchReadState.useBranching) {\n aggregate.unshift({\n $set: {\n [canonicalParentField]: versions\n ? { $ifNull: ['$_branchParent', '$parent'] }\n : { $ifNull: ['$_branchDocID', '$_id'] },\n },\n })\n aggregate.push({ $unset: canonicalParentField })\n }\n\n return aggregate\n}\n"],"names":["APIError","appendVersionToQueryKey","buildVersionCollectionFields","combineQueries","getBranchPredicateSync","getQueryDraftsSort","resolveBranchReadState","resolveBranchVersionQuery","rewriteBranchIDs","rewriteBranchVersionParents","fieldShouldBeLocalized","hasDraftsEnabled","buildBranchVisibilityStages","buildQuery","buildSortParam","getCollection","buildJoinAggregation","adapter","branch","collection","collectionConfig","draftsEnabled","joins","locale","projection","req","versions","useJoinAggregations","Object","keys","length","polymorphicJoins","joinConfig","payload","collections","config","aggregate","outerBranchReadState","collectionSlug","canonicalParentField","localField","useBranching","rootIDExpression","polymorphicJoinsConfig","join","joinPath","count","limit","limitJoin","field","defaultLimit","page","sort","sortJoin","defaultSort","where","whereJoin","aggregatedFields","flattenedFields","some","eachField","name","push","fields","timestamps","$match","sortProperty","sortDirection","projectSort","aliases","as","alias","joinBranchPredicate","joinBranchReadState","branchMatch","undefined","branchVisibility","basePipeline","$addFields","relationTo","$literal","$and","$expr","$eq","on","$set","_id","$ifNull","Model","JoinModel","$lookup","from","let","root_id_","pipeline","$sort","$limit","$project","value","$count","$concatArrays","map","$add","$first","$sortArray","input","sortBy","sliceValue","$gt","$size","Number","MAX_VALUE","$slice","slug","joinsList","projectionPath","toString","useDrafts","Array","isArray","Error","resolvedWhereJoin","and","latest","equals","mode","parent","$skip","polymorphicSuffix","targetField","addTotalDocsAggregation","foreignField","foreignFieldPrefix","localization","localeCodes","forEach","code","$map","in","localeSuffix","parentIsLocalized","getForeignPath","unshift","$unset"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolveJoins.d.ts","sourceRoot":"","sources":["../../src/utilities/resolveJoins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAyB,MAAM,SAAS,CAAA;AAiB/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAOlD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,mCAAmC;IACnC,OAAO,EAAE,eAAe,CAAA;IACxB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAA;IACtB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B,iEAAiE;IACjE,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACjC,+CAA+C;IAC/C,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,EACjC,OAAO,EACP,MAAM,EACN,cAAc,EACd,IAAI,EACJ,KAAK,EACL,MAAM,EACN,UAAU,EACV,GAAG,EACH,QAAgB,GACjB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4dlC"}
1
+ {"version":3,"file":"resolveJoins.d.ts","sourceRoot":"","sources":["../../src/utilities/resolveJoins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAyB,MAAM,SAAS,CAAA;AAkB/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAOlD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,mCAAmC;IACnC,OAAO,EAAE,eAAe,CAAA;IACxB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAA;IACtB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B,iEAAiE;IACjE,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACjC,+CAA+C;IAC/C,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,EACjC,OAAO,EACP,MAAM,EACN,cAAc,EACd,IAAI,EACJ,KAAK,EACL,MAAM,EACN,UAAU,EACV,GAAG,EACH,QAAgB,GACjB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+dlC"}