@strapi/core 5.51.0 → 5.51.2

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 (107) hide show
  1. package/dist/Strapi.d.ts.map +1 -1
  2. package/dist/Strapi.js +12 -6
  3. package/dist/Strapi.js.map +1 -1
  4. package/dist/Strapi.mjs +12 -6
  5. package/dist/Strapi.mjs.map +1 -1
  6. package/dist/compile.js +1 -1
  7. package/dist/compile.js.map +1 -1
  8. package/dist/compile.mjs +1 -1
  9. package/dist/compile.mjs.map +1 -1
  10. package/dist/configuration/urls.js +2 -2
  11. package/dist/configuration/urls.js.map +1 -1
  12. package/dist/configuration/urls.mjs +2 -2
  13. package/dist/configuration/urls.mjs.map +1 -1
  14. package/dist/ee/index.js +2 -2
  15. package/dist/ee/index.js.map +1 -1
  16. package/dist/ee/index.mjs +2 -2
  17. package/dist/ee/index.mjs.map +1 -1
  18. package/dist/index.d.ts +0 -3
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/loaders/apis.d.ts.map +1 -1
  23. package/dist/loaders/apis.js +3 -1
  24. package/dist/loaders/apis.js.map +1 -1
  25. package/dist/loaders/apis.mjs +3 -1
  26. package/dist/loaders/apis.mjs.map +1 -1
  27. package/dist/loaders/plugins/get-enabled-plugins.js +1 -1
  28. package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
  29. package/dist/loaders/plugins/get-enabled-plugins.mjs +1 -1
  30. package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
  31. package/dist/loaders/plugins/index.js +2 -2
  32. package/dist/loaders/plugins/index.js.map +1 -1
  33. package/dist/loaders/plugins/index.mjs +2 -2
  34. package/dist/loaders/plugins/index.mjs.map +1 -1
  35. package/dist/migrations/database/5.0.0-discard-drafts.js +9 -9
  36. package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
  37. package/dist/migrations/database/5.0.0-discard-drafts.mjs +9 -9
  38. package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
  39. package/dist/package.json.js +14 -14
  40. package/dist/package.json.mjs +14 -14
  41. package/dist/services/content-api/index.js +1 -1
  42. package/dist/services/content-api/index.js.map +1 -1
  43. package/dist/services/content-api/index.mjs +1 -1
  44. package/dist/services/content-api/index.mjs.map +1 -1
  45. package/dist/services/content-api/permissions/engine.d.ts +3 -3
  46. package/dist/services/content-api/permissions/engine.d.ts.map +1 -1
  47. package/dist/services/content-api/permissions/engine.js +1 -5
  48. package/dist/services/content-api/permissions/engine.js.map +1 -1
  49. package/dist/services/content-api/permissions/engine.mjs +2 -2
  50. package/dist/services/content-api/permissions/engine.mjs.map +1 -1
  51. package/dist/services/core-store.js +1 -1
  52. package/dist/services/core-store.js.map +1 -1
  53. package/dist/services/core-store.mjs +1 -1
  54. package/dist/services/core-store.mjs.map +1 -1
  55. package/dist/services/document-service/entries.d.ts.map +1 -1
  56. package/dist/services/document-service/entries.js +16 -2
  57. package/dist/services/document-service/entries.js.map +1 -1
  58. package/dist/services/document-service/entries.mjs +16 -2
  59. package/dist/services/document-service/entries.mjs.map +1 -1
  60. package/dist/services/document-service/repository.js +2 -2
  61. package/dist/services/document-service/repository.js.map +1 -1
  62. package/dist/services/document-service/repository.mjs +2 -2
  63. package/dist/services/document-service/repository.mjs.map +1 -1
  64. package/dist/services/document-service/utils/clean-component-join-table.js +2 -2
  65. package/dist/services/document-service/utils/clean-component-join-table.js.map +1 -1
  66. package/dist/services/document-service/utils/clean-component-join-table.mjs +2 -2
  67. package/dist/services/document-service/utils/clean-component-join-table.mjs.map +1 -1
  68. package/dist/services/document-service/utils/clone-relations.js +1 -1
  69. package/dist/services/document-service/utils/clone-relations.js.map +1 -1
  70. package/dist/services/document-service/utils/clone-relations.mjs +1 -1
  71. package/dist/services/document-service/utils/clone-relations.mjs.map +1 -1
  72. package/dist/services/entity-validator/blocks-validator.js +1 -1
  73. package/dist/services/entity-validator/blocks-validator.js.map +1 -1
  74. package/dist/services/entity-validator/blocks-validator.mjs +1 -1
  75. package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
  76. package/dist/services/entity-validator/index.d.ts +1 -0
  77. package/dist/services/entity-validator/index.d.ts.map +1 -1
  78. package/dist/services/entity-validator/index.js +174 -29
  79. package/dist/services/entity-validator/index.js.map +1 -1
  80. package/dist/services/entity-validator/index.mjs +153 -26
  81. package/dist/services/entity-validator/index.mjs.map +1 -1
  82. package/dist/services/metrics/sender.js +1 -1
  83. package/dist/services/metrics/sender.js.map +1 -1
  84. package/dist/services/metrics/sender.mjs +1 -1
  85. package/dist/services/metrics/sender.mjs.map +1 -1
  86. package/dist/services/server/koa-methods.d.ts +6 -0
  87. package/dist/services/server/koa-methods.d.ts.map +1 -1
  88. package/dist/services/server/koa-methods.js.map +1 -1
  89. package/dist/services/server/koa-methods.mjs.map +1 -1
  90. package/dist/services/server/middleware.js +1 -1
  91. package/dist/services/server/middleware.js.map +1 -1
  92. package/dist/services/server/middleware.mjs +1 -1
  93. package/dist/services/server/middleware.mjs.map +1 -1
  94. package/dist/services/server/register-middlewares.js +1 -1
  95. package/dist/services/server/register-middlewares.js.map +1 -1
  96. package/dist/services/server/register-middlewares.mjs +1 -1
  97. package/dist/services/server/register-middlewares.mjs.map +1 -1
  98. package/dist/services/server/routing.js +1 -1
  99. package/dist/services/server/routing.js.map +1 -1
  100. package/dist/services/server/routing.mjs +1 -1
  101. package/dist/services/server/routing.mjs.map +1 -1
  102. package/dist/services/session-manager.d.ts.map +1 -1
  103. package/dist/services/session-manager.js +5 -5
  104. package/dist/services/session-manager.js.map +1 -1
  105. package/dist/services/session-manager.mjs +5 -5
  106. package/dist/services/session-manager.mjs.map +1 -1
  107. package/package.json +14 -14
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","sources":["../../../src/services/document-service/repository.ts"],"sourcesContent":["import { omit, assoc, curry, isEmpty, pick } from 'lodash/fp';\n\nimport {\n async,\n contentTypes as contentTypesUtils,\n validate,\n errors,\n createModelCache,\n} from '@strapi/utils';\n\nimport type { UID, Modules } from '@strapi/types';\nimport { wrapInTransaction, type RepositoryFactoryMethod } from './common';\nimport * as DP from './draft-and-publish';\nimport * as i18n from './internationalization';\nimport { copyNonLocalizedFields } from './internationalization';\nimport * as components from './components';\n\nimport { createEntriesService } from './entries';\nimport { ALLOWED_DOCUMENT_ROOT_PARAM_KEYS, pickSelectionParams } from './params';\nimport { createDocumentId } from '../../utils/transform-content-types-to-models';\nimport { getDeepPopulate } from './utils/populate';\nimport { transformParamsToQuery } from './transform/query';\nimport { transformParamsDocumentId } from './transform/id-transform';\nimport { createEventManager } from './events';\nimport * as unidirectionalRelations from './utils/unidirectional-relations';\nimport * as bidirectionalRelations from './utils/bidirectional-relations';\nimport * as selfReferentialRelations from './utils/self-referential-relations';\nimport entityValidator from '../entity-validator';\nimport { addFirstPublishedAtToDraft, filterDataFirstPublishedAt } from './first-published-at';\nimport { runParallelWithOrderedErrors } from './utils/ordered-parallel';\nimport { copyCloneRelationRows, prepareCloneData } from './utils/clone-relations';\n\nconst { validators } = validate;\n\n// we have to typecast to reconcile the differences between validator and database getModel\nconst getModel = ((schema: UID.Schema) => strapi.getModel(schema)) as (schema: string) => any;\n\n// config.api.documents.strictParams: false/undefined (pass through), true (throw on invalid)\n\n// BCP 47–style locale format: 2–3 letter language code (any case), optional subtags (-XX or -XXX...), max 35 chars\nconst LOCALE_FORMAT = /^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$/;\nconst MAX_LOCALE_LENGTH = 35;\n\n/** Treat as \"param not provided\": null, undefined, or empty string (e.g. from query/JSON). */\nconst isParamEmpty = (v: unknown): boolean => v === undefined || v === null || v === '';\n\nexport const createContentTypeRepository: RepositoryFactoryMethod = (\n uid,\n validator = entityValidator\n) => {\n const contentType = strapi.contentType(uid);\n const hasDraftAndPublish = contentTypesUtils.hasDraftAndPublish(contentType);\n\n // Define the validations that should be performed\n const sortValidations = ['nonAttributesOperators', 'dynamicZones', 'morphRelations'];\n const fieldValidations = ['scalarAttributes'];\n const filtersValidations = ['nonAttributesOperators', 'dynamicZones', 'morphRelations'];\n const populateValidations = {\n sort: sortValidations,\n field: fieldValidations,\n filters: filtersValidations,\n populate: ['nonAttributesOperators'],\n };\n\n /**\n * Checks status parameter. When strict is true, throws on invalid status.\n * Valid values are 'published' and 'draft'; for types without D&P they are currently ignored but may throw in the future\n */\n const checkStatus = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) {\n return params;\n }\n\n if (isParamEmpty(params.status)) {\n delete params.status;\n return params;\n }\n\n if (params.status !== 'published' && params.status !== 'draft') {\n throw new errors.ValidationError(\n `Invalid parameter at 'status'. Expected 'published' or 'draft', received: ${params.status}`\n );\n }\n\n return params;\n };\n\n /**\n * Checks locale parameter. When strict is true, throws on invalid locale value.\n * Accepts only: string (single locale or '*'), array of locale strings (e.g. bulk publish),\n * empty string, null, or undefined (removed but allowed)\n */\n const checkLocale = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) {\n return params;\n }\n\n if (isParamEmpty(params.locale)) {\n delete params.locale;\n return params;\n }\n\n // Reject objects (we only accept string, array of strings, empty string, null, undefined)\n if (typeof params.locale === 'object' && !Array.isArray(params.locale)) {\n throw new errors.ValidationError(\n `Invalid parameter at 'locale'. Expected a string, array of strings, empty string, null, or undefined; received: object`,\n { received: params.locale }\n );\n }\n\n const validateAndNormalizeOne = (value: unknown, path: string): string => {\n if (typeof value !== 'string') {\n throw new errors.ValidationError(\n `Invalid parameter at '${path}'. Expected a string, received: ${typeof value}`,\n { received: value }\n );\n }\n if (value === '*') return value;\n const isEmpty = value.length === 0;\n const tooLong = value.length > MAX_LOCALE_LENGTH;\n const invalidFormat = !LOCALE_FORMAT.test(value);\n if (isEmpty || tooLong || invalidFormat) {\n let reason: string;\n if (isEmpty) {\n reason = 'Locale cannot be empty';\n } else if (tooLong) {\n reason = `Locale exceeds maximum length of ${MAX_LOCALE_LENGTH} characters`;\n } else {\n reason = 'Locale must be a valid BCP 47 format (e.g. en, en-US, zh-Hans)';\n }\n throw new errors.ValidationError(`Invalid parameter at '${path}'. ${reason}.`);\n }\n return value;\n };\n\n if (Array.isArray(params.locale)) {\n const filtered = (params.locale as unknown[]).filter(\n (item): item is string => typeof item === 'string' && !isParamEmpty(item)\n );\n if (filtered.length === 0) {\n delete params.locale;\n return params;\n }\n params.locale = filtered.map((item, i) => validateAndNormalizeOne(item, `locale[${i}]`));\n return params;\n }\n\n params.locale = validateAndNormalizeOne(params.locale, 'locale');\n return params;\n };\n\n /**\n * Pagination param parsing (used only when strict).\n * Contract: empty (null/undefined/'') → undefined (omit from result).\n * present but invalid → throw ValidationError.\n * present and valid → return normalized value.\n */\n const parsePaginationInt = (\n name: string,\n value: unknown,\n strict: boolean,\n spec: { min: number; allowMinusOne?: boolean }\n ): number | undefined => {\n if (isParamEmpty(value)) return undefined;\n const num = Number(value);\n const valid =\n Number.isInteger(num) && (num >= spec.min || (spec.allowMinusOne === true && num === -1));\n if (!valid && strict) {\n const expected = spec.allowMinusOne\n ? `integer >= ${spec.min} or -1`\n : `integer >= ${spec.min}`;\n throw new errors.ValidationError(\n `Invalid parameter at '${name}'. Expected ${expected}, received: ${value}`\n );\n }\n return valid ? num : undefined;\n };\n\n const parseWithCount = (value: unknown): boolean | undefined => {\n if (isParamEmpty(value)) return undefined;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string' && (value === 'true' || value === 'false'))\n return value === 'true';\n throw new errors.ValidationError(\n `Invalid parameter at 'withCount'. Expected a boolean, received: ${typeof value}`\n );\n };\n\n const PAGINATION_KEYS = ['page', 'pageSize', 'start', 'limit', 'withCount'] as const;\n\n /**\n * When strict: empty → omit, invalid → throw, valid → include.\n * When not strict: return params unchanged.\n */\n const checkPagination = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) return params;\n\n const hasPage = !isParamEmpty(params.page) || !isParamEmpty(params.pageSize);\n const hasOffset = !isParamEmpty(params.start) || !isParamEmpty(params.limit);\n if (hasPage && hasOffset) {\n throw new errors.ValidationError(\n 'Invalid pagination parameters. Cannot use both page-based (page, pageSize) and offset-based (start, limit) pagination in the same query.'\n );\n }\n\n const page = parsePaginationInt('page', params.page, strict, { min: 1 });\n const pageSize = parsePaginationInt('pageSize', params.pageSize, strict, { min: 1 });\n const start = parsePaginationInt('start', params.start, strict, { min: 0 });\n const limit = parsePaginationInt('limit', params.limit, strict, {\n min: 1,\n allowMinusOne: true,\n });\n const withCount = parseWithCount(params.withCount);\n\n const result = { ...omit(PAGINATION_KEYS, params) };\n if (page !== undefined) result.page = page;\n if (pageSize !== undefined) result.pageSize = pageSize;\n if (start !== undefined) result.start = start;\n if (limit !== undefined) result.limit = limit;\n if (withCount !== undefined) result.withCount = withCount;\n return result;\n };\n\n /**\n * When strict is true, strip to allowed root-level keys so only those reach the query.\n * Extra params (e.g. from content API addQueryParams) are allowed in so middlewares see them,\n * but are stripped here before the query pipeline; they never affect the document query.\n */\n const checkUnrecognizedRootParams = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) {\n return params;\n }\n\n return pick(ALLOWED_DOCUMENT_ROOT_PARAM_KEYS as unknown as string[], params) as Record<\n string,\n unknown\n >;\n };\n\n const validateParams = async (\n params: Modules.Documents.Params.All\n ): Promise<Modules.Documents.Params.All> => {\n // Cache model lookups for this request to avoid repeating the same work\n const modelCache = createModelCache(getModel);\n\n const ctx = { schema: contentType, getModel: modelCache.getModel };\n\n // Only validate what is actually provided\n const validations: Promise<unknown>[] = [];\n\n if (params.filters && !isEmpty(params.filters)) {\n validations.push(validators.validateFilters(ctx, params.filters, filtersValidations));\n }\n\n if (params.sort && !isEmpty(params.sort)) {\n validations.push(validators.validateSort(ctx, params.sort, sortValidations));\n }\n\n if (params.fields && !isEmpty(params.fields)) {\n validations.push(validators.validateFields(ctx, params.fields, fieldValidations));\n }\n\n if (params.populate && !isEmpty(params.populate)) {\n validations.push(validators.validatePopulate(ctx, params.populate, populateValidations));\n }\n\n // Run validations together but keep the same error order as before\n await runParallelWithOrderedErrors(validations);\n\n // Clean up cache after validation\n modelCache.clear();\n\n // Strip lookup from params, it's only used internally\n if (params.lookup) {\n throw new errors.ValidationError(\"Invalid params: 'lookup'\");\n }\n\n // Validate status, locale, and pagination based on config\n // config.api.documents.strictParams: false/undefined (pass through), true (throw on invalid)\n const rawStrictParams: unknown = strapi.config.get('api.documents.strictParams', undefined);\n\n if (rawStrictParams !== undefined && rawStrictParams !== false && rawStrictParams !== true) {\n throw new errors.ValidationError(\n `Invalid config.api.documents.strictParams value: \"${rawStrictParams}\". Expected boolean (true or false).`\n );\n }\n\n const strict = rawStrictParams === true;\n\n let processedParams: Record<string, unknown>;\n if (strict) {\n processedParams = checkUnrecognizedRootParams(params as Record<string, unknown>, strict);\n processedParams = checkStatus(processedParams, strict);\n processedParams = checkLocale(processedParams, strict);\n processedParams = checkPagination(processedParams, strict);\n } else {\n processedParams = params as Record<string, unknown>;\n }\n\n return processedParams as Modules.Documents.Params.All;\n };\n\n const entries = createEntriesService(uid, validator);\n\n const eventManager = createEventManager(strapi, uid);\n const emitEvent = curry(eventManager.emitEvent);\n\n async function findMany(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid)\n )(params || {});\n\n return strapi.db.query(uid).findMany(query);\n }\n\n async function findFirst(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid)\n )(params);\n\n return strapi.db.query(uid).findOne(query);\n }\n\n // TODO: do we really want to add filters on the findOne now that we have findFirst ?\n async function findOne(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId }, query)\n )(params);\n\n return strapi.db.query(uid).findOne(query);\n }\n\n async function deleteDocument(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const lookupQuery = await async.pipe(\n validateParams,\n omit('status'),\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId }, query)\n )(params);\n\n const selectionQuery = await async.pipe(\n validateParams,\n omit('status'),\n pickSelectionParams,\n transformParamsToQuery(uid)\n )(params);\n\n if (hasDraftAndPublish && params.status === 'draft') {\n throw new Error('Cannot delete a draft document');\n }\n\n const entriesToDelete = await strapi.db.query(uid).findMany(lookupQuery);\n\n const deletedEntries = await async.map(entriesToDelete, (entryToDelete: any) =>\n entries.delete(entryToDelete.id, selectionQuery)\n );\n\n entriesToDelete.forEach(emitEvent('entry.delete'));\n\n return { documentId, entries: deletedEntries };\n }\n\n async function create(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n DP.setStatusToDraft(contentType),\n DP.statusToData(contentType),\n i18n.defaultLocale(contentType),\n i18n.localeToData(contentType)\n )(params);\n\n const doc = await entries.create(queryParams);\n\n emitEvent('entry.create', doc);\n\n if (hasDraftAndPublish && params.status === 'published') {\n return publish({\n ...params,\n documentId: doc.documentId,\n }).then((doc) => doc.entries[0]);\n }\n\n return doc;\n }\n\n async function clone(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n // Get deep populate\n const entriesToClone = await strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n // DP Enabled: Clone drafts\n // DP Disabled: Clone only the existing version (published)\n publishedAt: { $null: hasDraftAndPublish },\n },\n populate: getDeepPopulate(uid, { relationalFields: ['id'] }),\n });\n\n const newDocumentId = createDocumentId();\n\n const clonedEntries = await async.map(\n entriesToClone,\n async (entryToClone: Record<string, unknown>) => {\n const sourceEntryId = entryToClone.id as number;\n const originalData = omit(['id', 'createdAt', 'updatedAt'], entryToClone) as Record<\n string,\n unknown\n >;\n const { data, relationsToCopy } = await prepareCloneData(\n originalData,\n queryParams.data,\n contentType,\n (modelUid) => strapi.getModel(modelUid as UID.Schema)\n );\n const dataWithDocumentId = assoc('documentId', newDocumentId, data);\n const doc = await entries.create({\n ...queryParams,\n data: dataWithDocumentId,\n status: 'draft',\n });\n\n await copyCloneRelationRows(strapi, uid, sourceEntryId, doc.id, relationsToCopy);\n\n if (relationsToCopy.length === 0) {\n return doc;\n }\n\n const selectionQuery = transformParamsToQuery(\n uid,\n pickSelectionParams({ ...queryParams, status: 'draft' }) as any\n );\n\n return strapi.db.query(uid).findOne({ ...selectionQuery, where: { id: doc.id } });\n }\n );\n\n clonedEntries.forEach(emitEvent('entry.create'));\n\n return { documentId: clonedEntries.at(0)?.documentId, entries: clonedEntries };\n }\n\n async function update(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n filterDataFirstPublishedAt,\n DP.setStatusToDraft(contentType),\n DP.statusToLookup(contentType),\n DP.statusToData(contentType),\n // Default locale will be set if not provided\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n i18n.localeToData(contentType)\n )(params);\n\n const { data, ...restParams } = await transformParamsDocumentId(uid, queryParams || {});\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams || {}) as any);\n\n // Validation\n // Find if document exists\n const entryToUpdate = await strapi.db\n .query(uid)\n .findOne({ ...query, where: { ...queryParams?.lookup, ...query?.where, documentId } });\n\n let updatedDraft = null;\n if (entryToUpdate) {\n updatedDraft = await entries.update(entryToUpdate, queryParams);\n emitEvent('entry.update', updatedDraft);\n }\n\n if (!updatedDraft) {\n const documentExists = await strapi.db\n .query(contentType.uid)\n .findOne({ where: { documentId } });\n\n if (documentExists) {\n const mergedData = await copyNonLocalizedFields(contentType, documentId, {\n ...queryParams.data,\n documentId,\n });\n\n updatedDraft = await entries.create({\n ...queryParams,\n data: mergedData,\n });\n emitEvent('entry.create', updatedDraft);\n }\n }\n\n if (hasDraftAndPublish && updatedDraft && params.status === 'published') {\n return publish({\n ...params,\n documentId,\n }).then((doc) => doc.entries[0]);\n }\n\n return updatedDraft;\n }\n\n async function count(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultStatus(contentType),\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid)\n )(params);\n\n return strapi.db.query(uid).count(query);\n }\n\n async function publish(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n const [draftsToPublish, oldPublishedVersions] = await Promise.all([\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: null, // Ignore lookup\n },\n // Populate relations, media, compos and dz\n populate: getDeepPopulate(uid, { relationalFields: ['documentId', 'locale'] }),\n }),\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: { $ne: null },\n },\n select: ['id', 'locale'],\n }),\n ]);\n\n // Load any unidirectional relation targetting the old published entries\n const relationsToSync = await unidirectionalRelations.load(\n uid,\n {\n newVersions: draftsToPublish,\n oldVersions: oldPublishedVersions,\n },\n {\n shouldPropagateRelation: components.createComponentRelationFilter(),\n }\n );\n\n const bidirectionalRelationsToSync = await bidirectionalRelations.load(uid, {\n newVersions: draftsToPublish,\n oldVersions: oldPublishedVersions,\n });\n\n const selfRelationsToSync = await selfReferentialRelations.load(\n uid,\n draftsToPublish,\n 'published'\n );\n\n // Delete old published versions\n await async.map(oldPublishedVersions, (entry: any) => entries.delete(entry.id));\n\n // Add firstPublishedAt to draft if it doesn't exist\n const updatedDraft = await async.map(draftsToPublish, (draft: any) =>\n addFirstPublishedAtToDraft(draft, entries.update, contentType)\n );\n\n // Transform draft entry data and create published versions\n const publishedEntries = await async.map(updatedDraft, (draft: any) =>\n entries.publish(draft, queryParams)\n );\n\n // Sync unidirectional relations with the new published entries\n await unidirectionalRelations.sync(\n [...oldPublishedVersions, ...updatedDraft],\n publishedEntries,\n relationsToSync\n );\n\n await bidirectionalRelations.sync(\n [...oldPublishedVersions, ...updatedDraft],\n publishedEntries,\n bidirectionalRelationsToSync\n );\n\n // Map both old published IDs and updated draft IDs to the new published entries.\n await selfReferentialRelations.sync(\n [...oldPublishedVersions, ...updatedDraft],\n publishedEntries,\n selfRelationsToSync\n );\n\n publishedEntries.forEach(emitEvent('entry.publish'));\n\n return { documentId, entries: publishedEntries };\n }\n\n async function unpublish(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId, publishedAt: { $ne: null } }, query)\n )(params);\n\n // Delete all published versions\n const versionsToDelete = await strapi.db.query(uid).findMany(query);\n await async.map(versionsToDelete, (entry: any) => entries.delete(entry.id));\n\n versionsToDelete.forEach(emitEvent('entry.unpublish'));\n return { documentId, entries: versionsToDelete };\n }\n\n async function discardDraft(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n const [versionsToDraft, oldDrafts] = await Promise.all([\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: { $ne: null },\n },\n // Populate relations, media, compos and dz\n populate: getDeepPopulate(uid, { relationalFields: ['documentId', 'locale'] }),\n }),\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: null,\n },\n select: ['id', 'locale'],\n }),\n ]);\n\n // Load any unidirectional relation targeting the old drafts\n const relationsToSync = await unidirectionalRelations.load(\n uid,\n {\n newVersions: versionsToDraft,\n oldVersions: oldDrafts,\n },\n {\n shouldPropagateRelation: components.createComponentRelationFilter(),\n }\n );\n\n const bidirectionalRelationsToSync = await bidirectionalRelations.load(uid, {\n newVersions: versionsToDraft,\n oldVersions: oldDrafts,\n });\n\n const selfRelationsToSync = await selfReferentialRelations.load(uid, versionsToDraft, 'draft');\n\n // Delete old drafts\n await async.map(oldDrafts, (entry: any) => entries.delete(entry.id));\n\n // Transform published entry data and create draft versions\n const draftEntries = await async.map(versionsToDraft, (entry: any) =>\n entries.discardDraft(entry, queryParams)\n );\n\n // Sync unidirectional relations with the new draft entries\n await unidirectionalRelations.sync(\n [...oldDrafts, ...versionsToDraft],\n draftEntries,\n relationsToSync\n );\n\n await bidirectionalRelations.sync(\n [...oldDrafts, ...versionsToDraft],\n draftEntries,\n bidirectionalRelationsToSync\n );\n\n // Map both old draft IDs and published source IDs to the new draft entries.\n await selfReferentialRelations.sync(\n [...oldDrafts, ...versionsToDraft],\n draftEntries,\n selfRelationsToSync\n );\n\n draftEntries.forEach(emitEvent('entry.draft-discard'));\n return { documentId, entries: draftEntries };\n }\n\n async function updateComponents(entry: any, data: any) {\n return components.updateComponents(uid, entry, data);\n }\n\n function omitComponentData(data: any) {\n return components.omitComponentData(contentType, data);\n }\n\n return {\n findMany: wrapInTransaction(findMany),\n findFirst: wrapInTransaction(findFirst),\n findOne: wrapInTransaction(findOne),\n delete: wrapInTransaction(deleteDocument),\n create: wrapInTransaction(create),\n clone: wrapInTransaction(clone),\n update: wrapInTransaction(update),\n count: wrapInTransaction(count),\n publish: hasDraftAndPublish ? wrapInTransaction(publish) : (undefined as any),\n unpublish: hasDraftAndPublish ? wrapInTransaction(unpublish) : (undefined as any),\n discardDraft: hasDraftAndPublish ? wrapInTransaction(discardDraft) : (undefined as any),\n\n updateComponents,\n omitComponentData,\n };\n};\n"],"names":["validators","validate","getModel","schema","strapi","LOCALE_FORMAT","MAX_LOCALE_LENGTH","isParamEmpty","v","undefined","createContentTypeRepository","uid","validator","entityValidator","contentType","hasDraftAndPublish","contentTypesUtils","sortValidations","fieldValidations","filtersValidations","populateValidations","sort","field","filters","populate","checkStatus","params","strict","status","errors","ValidationError","checkLocale","locale","Array","isArray","received","validateAndNormalizeOne","value","path","isEmpty","length","tooLong","invalidFormat","test","reason","filtered","filter","item","map","i","parsePaginationInt","name","spec","num","Number","valid","isInteger","min","allowMinusOne","expected","parseWithCount","PAGINATION_KEYS","checkPagination","hasPage","page","pageSize","hasOffset","start","limit","withCount","result","omit","checkUnrecognizedRootParams","pick","ALLOWED_DOCUMENT_ROOT_PARAM_KEYS","validateParams","modelCache","createModelCache","ctx","validations","push","validateFilters","validateSort","fields","validateFields","validatePopulate","runParallelWithOrderedErrors","clear","lookup","rawStrictParams","config","get","processedParams","entries","createEntriesService","eventManager","createEventManager","emitEvent","curry","findMany","query","async","pipe","DP","i18n","transformParamsDocumentId","transformParamsToQuery","db","findFirst","findOne","opts","documentId","assoc","where","deleteDocument","lookupQuery","selectionQuery","pickSelectionParams","Error","entriesToDelete","deletedEntries","entryToDelete","delete","id","forEach","create","queryParams","doc","publish","then","clone","entriesToClone","publishedAt","$null","getDeepPopulate","relationalFields","newDocumentId","createDocumentId","clonedEntries","entryToClone","sourceEntryId","originalData","data","relationsToCopy","prepareCloneData","modelUid","dataWithDocumentId","copyCloneRelationRows","at","update","filterDataFirstPublishedAt","restParams","entryToUpdate","updatedDraft","documentExists","mergedData","copyNonLocalizedFields","count","draftsToPublish","oldPublishedVersions","Promise","all","$ne","select","relationsToSync","unidirectionalRelations","newVersions","oldVersions","shouldPropagateRelation","components","bidirectionalRelationsToSync","bidirectionalRelations","selfRelationsToSync","selfReferentialRelations","entry","draft","addFirstPublishedAtToDraft","publishedEntries","unpublish","versionsToDelete","discardDraft","versionsToDraft","oldDrafts","draftEntries","updateComponents","omitComponentData","wrapInTransaction"],"mappings":"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"}
1
+ {"version":3,"file":"repository.mjs","sources":["../../../src/services/document-service/repository.ts"],"sourcesContent":["import { omit, assoc, curry, isEmpty, pick } from 'lodash/fp';\n\nimport {\n async,\n contentTypes as contentTypesUtils,\n validate,\n errors,\n createModelCache,\n} from '@strapi/utils';\n\nimport type { UID, Modules } from '@strapi/types';\nimport { wrapInTransaction, type RepositoryFactoryMethod } from './common';\nimport * as DP from './draft-and-publish';\nimport * as i18n from './internationalization';\nimport { copyNonLocalizedFields } from './internationalization';\nimport * as components from './components';\n\nimport { createEntriesService } from './entries';\nimport { ALLOWED_DOCUMENT_ROOT_PARAM_KEYS, pickSelectionParams } from './params';\nimport { createDocumentId } from '../../utils/transform-content-types-to-models';\nimport { getDeepPopulate } from './utils/populate';\nimport { transformParamsToQuery } from './transform/query';\nimport { transformParamsDocumentId } from './transform/id-transform';\nimport { createEventManager } from './events';\nimport * as unidirectionalRelations from './utils/unidirectional-relations';\nimport * as bidirectionalRelations from './utils/bidirectional-relations';\nimport * as selfReferentialRelations from './utils/self-referential-relations';\nimport entityValidator from '../entity-validator';\nimport { addFirstPublishedAtToDraft, filterDataFirstPublishedAt } from './first-published-at';\nimport { runParallelWithOrderedErrors } from './utils/ordered-parallel';\nimport { copyCloneRelationRows, prepareCloneData } from './utils/clone-relations';\n\nconst { validators } = validate;\n\n// we have to typecast to reconcile the differences between validator and database getModel\nconst getModel = ((schema: UID.Schema) => strapi.getModel(schema)) as (schema: string) => any;\n\n// config.api.documents.strictParams: false/undefined (pass through), true (throw on invalid)\n\n// BCP 47–style locale format: 2–3 letter language code (any case), optional subtags (-XX or -XXX...), max 35 chars\nconst LOCALE_FORMAT = /^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$/;\nconst MAX_LOCALE_LENGTH = 35;\n\n/** Treat as \"param not provided\": null, undefined, or empty string (e.g. from query/JSON). */\nconst isParamEmpty = (v: unknown): boolean => v === undefined || v === null || v === '';\n\nexport const createContentTypeRepository: RepositoryFactoryMethod = (\n uid,\n validator = entityValidator\n) => {\n const contentType = strapi.contentType(uid);\n const hasDraftAndPublish = contentTypesUtils.hasDraftAndPublish(contentType);\n\n // Define the validations that should be performed\n const sortValidations = ['nonAttributesOperators', 'dynamicZones', 'morphRelations'];\n const fieldValidations = ['scalarAttributes'];\n const filtersValidations = ['nonAttributesOperators', 'dynamicZones', 'morphRelations'];\n const populateValidations = {\n sort: sortValidations,\n field: fieldValidations,\n filters: filtersValidations,\n populate: ['nonAttributesOperators'],\n };\n\n /**\n * Checks status parameter. When strict is true, throws on invalid status.\n * Valid values are 'published' and 'draft'; for types without D&P they are currently ignored but may throw in the future\n */\n const checkStatus = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) {\n return params;\n }\n\n if (isParamEmpty(params.status)) {\n delete params.status;\n return params;\n }\n\n if (params.status !== 'published' && params.status !== 'draft') {\n throw new errors.ValidationError(\n `Invalid parameter at 'status'. Expected 'published' or 'draft', received: ${params.status}`\n );\n }\n\n return params;\n };\n\n /**\n * Checks locale parameter. When strict is true, throws on invalid locale value.\n * Accepts only: string (single locale or '*'), array of locale strings (e.g. bulk publish),\n * empty string, null, or undefined (removed but allowed)\n */\n const checkLocale = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) {\n return params;\n }\n\n if (isParamEmpty(params.locale)) {\n delete params.locale;\n return params;\n }\n\n // Reject objects (we only accept string, array of strings, empty string, null, undefined)\n if (typeof params.locale === 'object' && !Array.isArray(params.locale)) {\n throw new errors.ValidationError(\n `Invalid parameter at 'locale'. Expected a string, array of strings, empty string, null, or undefined; received: object`,\n { received: params.locale }\n );\n }\n\n const validateAndNormalizeOne = (value: unknown, path: string): string => {\n if (typeof value !== 'string') {\n throw new errors.ValidationError(\n `Invalid parameter at '${path}'. Expected a string, received: ${typeof value}`,\n { received: value }\n );\n }\n if (value === '*') return value;\n const isEmpty = value.length === 0;\n const tooLong = value.length > MAX_LOCALE_LENGTH;\n const invalidFormat = !LOCALE_FORMAT.test(value);\n if (isEmpty || tooLong || invalidFormat) {\n let reason: string;\n if (isEmpty) {\n reason = 'Locale cannot be empty';\n } else if (tooLong) {\n reason = `Locale exceeds maximum length of ${MAX_LOCALE_LENGTH} characters`;\n } else {\n reason = 'Locale must be a valid BCP 47 format (e.g. en, en-US, zh-Hans)';\n }\n throw new errors.ValidationError(`Invalid parameter at '${path}'. ${reason}.`);\n }\n return value;\n };\n\n if (Array.isArray(params.locale)) {\n const filtered = (params.locale as unknown[]).filter(\n (item): item is string => typeof item === 'string' && !isParamEmpty(item)\n );\n if (filtered.length === 0) {\n delete params.locale;\n return params;\n }\n params.locale = filtered.map((item, i) => validateAndNormalizeOne(item, `locale[${i}]`));\n return params;\n }\n\n params.locale = validateAndNormalizeOne(params.locale, 'locale');\n return params;\n };\n\n /**\n * Pagination param parsing (used only when strict).\n * Contract: empty (null/undefined/'') → undefined (omit from result).\n * present but invalid → throw ValidationError.\n * present and valid → return normalized value.\n */\n const parsePaginationInt = (\n name: string,\n value: unknown,\n strict: boolean,\n spec: { min: number; allowMinusOne?: boolean }\n ): number | undefined => {\n if (isParamEmpty(value)) return undefined;\n const num = Number(value);\n const valid =\n Number.isInteger(num) && (num >= spec.min || (spec.allowMinusOne === true && num === -1));\n if (!valid && strict) {\n const expected = spec.allowMinusOne\n ? `integer >= ${spec.min} or -1`\n : `integer >= ${spec.min}`;\n throw new errors.ValidationError(\n `Invalid parameter at '${name}'. Expected ${expected}, received: ${value}`\n );\n }\n return valid ? num : undefined;\n };\n\n const parseWithCount = (value: unknown): boolean | undefined => {\n if (isParamEmpty(value)) return undefined;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string' && (value === 'true' || value === 'false'))\n return value === 'true';\n throw new errors.ValidationError(\n `Invalid parameter at 'withCount'. Expected a boolean, received: ${typeof value}`\n );\n };\n\n const PAGINATION_KEYS = ['page', 'pageSize', 'start', 'limit', 'withCount'] as const;\n\n /**\n * When strict: empty → omit, invalid → throw, valid → include.\n * When not strict: return params unchanged.\n */\n const checkPagination = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) return params;\n\n const hasPage = !isParamEmpty(params.page) || !isParamEmpty(params.pageSize);\n const hasOffset = !isParamEmpty(params.start) || !isParamEmpty(params.limit);\n if (hasPage && hasOffset) {\n throw new errors.ValidationError(\n 'Invalid pagination parameters. Cannot use both page-based (page, pageSize) and offset-based (start, limit) pagination in the same query.'\n );\n }\n\n const page = parsePaginationInt('page', params.page, strict, { min: 1 });\n const pageSize = parsePaginationInt('pageSize', params.pageSize, strict, { min: 1 });\n const start = parsePaginationInt('start', params.start, strict, { min: 0 });\n const limit = parsePaginationInt('limit', params.limit, strict, {\n min: 1,\n allowMinusOne: true,\n });\n const withCount = parseWithCount(params.withCount);\n\n const result = { ...omit(PAGINATION_KEYS, params) };\n if (page !== undefined) result.page = page;\n if (pageSize !== undefined) result.pageSize = pageSize;\n if (start !== undefined) result.start = start;\n if (limit !== undefined) result.limit = limit;\n if (withCount !== undefined) result.withCount = withCount;\n return result;\n };\n\n /**\n * When strict is true, strip to allowed root-level keys so only those reach the query.\n * Extra params (e.g. from content API addQueryParams) are allowed in so middlewares see them,\n * but are stripped here before the query pipeline; they never affect the document query.\n */\n const checkUnrecognizedRootParams = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) {\n return params;\n }\n\n return pick(ALLOWED_DOCUMENT_ROOT_PARAM_KEYS as unknown as string[], params) as Record<\n string,\n unknown\n >;\n };\n\n const validateParams = async (\n params: Modules.Documents.Params.All\n ): Promise<Modules.Documents.Params.All> => {\n // Cache model lookups for this request to avoid repeating the same work\n const modelCache = createModelCache(getModel);\n\n const ctx = { schema: contentType, getModel: modelCache.getModel };\n\n // Only validate what is actually provided\n const validations: Promise<unknown>[] = [];\n\n if (params.filters && !isEmpty(params.filters)) {\n validations.push(validators.validateFilters(ctx, params.filters, filtersValidations));\n }\n\n if (params.sort && !isEmpty(params.sort)) {\n validations.push(validators.validateSort(ctx, params.sort, sortValidations));\n }\n\n if (params.fields && !isEmpty(params.fields)) {\n validations.push(validators.validateFields(ctx, params.fields, fieldValidations));\n }\n\n if (params.populate && !isEmpty(params.populate)) {\n validations.push(validators.validatePopulate(ctx, params.populate, populateValidations));\n }\n\n // Run validations together but keep the same error order as before\n await runParallelWithOrderedErrors(validations);\n\n // Clean up cache after validation\n modelCache.clear();\n\n // Strip lookup from params, it's only used internally\n if (params.lookup) {\n throw new errors.ValidationError(\"Invalid params: 'lookup'\");\n }\n\n // Validate status, locale, and pagination based on config\n // config.api.documents.strictParams: false/undefined (pass through), true (throw on invalid)\n const rawStrictParams: unknown = strapi.config.get('api.documents.strictParams', undefined);\n\n if (rawStrictParams !== undefined && rawStrictParams !== false && rawStrictParams !== true) {\n throw new errors.ValidationError(\n `Invalid config.api.documents.strictParams value: \"${rawStrictParams}\". Expected boolean (true or false).`\n );\n }\n\n const strict = rawStrictParams === true;\n\n let processedParams: Record<string, unknown>;\n if (strict) {\n processedParams = checkUnrecognizedRootParams(params as Record<string, unknown>, strict);\n processedParams = checkStatus(processedParams, strict);\n processedParams = checkLocale(processedParams, strict);\n processedParams = checkPagination(processedParams, strict);\n } else {\n processedParams = params as Record<string, unknown>;\n }\n\n return processedParams as Modules.Documents.Params.All;\n };\n\n const entries = createEntriesService(uid, validator);\n\n const eventManager = createEventManager(strapi, uid);\n const emitEvent = curry(eventManager.emitEvent);\n\n async function findMany(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid)\n )(params || {});\n\n return strapi.db.query(uid).findMany(query);\n }\n\n async function findFirst(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid)\n )(params);\n\n return strapi.db.query(uid).findOne(query);\n }\n\n // TODO: do we really want to add filters on the findOne now that we have findFirst ?\n async function findOne(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId }, query)\n )(params);\n\n return strapi.db.query(uid).findOne(query);\n }\n\n async function deleteDocument(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const lookupQuery = await async.pipe(\n validateParams,\n omit('status'),\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId }, query)\n )(params);\n\n const selectionQuery = await async.pipe(\n validateParams,\n omit('status'),\n pickSelectionParams,\n transformParamsToQuery(uid)\n )(params);\n\n if (hasDraftAndPublish && params.status === 'draft') {\n throw new Error('Cannot delete a draft document');\n }\n\n const entriesToDelete = await strapi.db.query(uid).findMany(lookupQuery);\n\n const deletedEntries = await async.map(entriesToDelete, (entryToDelete: any) =>\n entries.delete(entryToDelete.id, selectionQuery)\n );\n\n entriesToDelete.forEach(emitEvent('entry.delete'));\n\n return { documentId, entries: deletedEntries };\n }\n\n async function create(opts = {} as any) {\n const { documentId: _documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n DP.setStatusToDraft(contentType),\n DP.statusToData(contentType),\n i18n.defaultLocale(contentType),\n i18n.localeToData(contentType)\n )(params);\n\n const doc = await entries.create(queryParams);\n\n emitEvent('entry.create', doc);\n\n if (hasDraftAndPublish && params.status === 'published') {\n return publish({\n ...params,\n documentId: doc.documentId,\n }).then((doc) => doc.entries[0]);\n }\n\n return doc;\n }\n\n async function clone(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n // Get deep populate\n const entriesToClone = await strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n // DP Enabled: Clone drafts\n // DP Disabled: Clone only the existing version (published)\n publishedAt: { $null: hasDraftAndPublish },\n },\n populate: getDeepPopulate(uid, { relationalFields: ['id'] }),\n });\n\n const newDocumentId = createDocumentId();\n\n const clonedEntries = await async.map(\n entriesToClone,\n async (entryToClone: Record<string, unknown>) => {\n const sourceEntryId = entryToClone.id as number;\n const originalData = omit(['id', 'createdAt', 'updatedAt'], entryToClone) as Record<\n string,\n unknown\n >;\n const { data, relationsToCopy } = await prepareCloneData(\n originalData,\n queryParams.data,\n contentType,\n (modelUid) => strapi.getModel(modelUid as UID.Schema)\n );\n const dataWithDocumentId = assoc('documentId', newDocumentId, data);\n const doc = await entries.create({\n ...queryParams,\n data: dataWithDocumentId,\n status: 'draft',\n });\n\n await copyCloneRelationRows(strapi, uid, sourceEntryId, doc.id, relationsToCopy);\n\n if (relationsToCopy.length === 0) {\n return doc;\n }\n\n const selectionQuery = transformParamsToQuery(\n uid,\n pickSelectionParams({ ...queryParams, status: 'draft' }) as any\n );\n\n return strapi.db.query(uid).findOne({ ...selectionQuery, where: { id: doc.id } });\n }\n );\n\n clonedEntries.forEach(emitEvent('entry.create'));\n\n return { documentId: clonedEntries.at(0)?.documentId, entries: clonedEntries };\n }\n\n async function update(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n filterDataFirstPublishedAt,\n DP.setStatusToDraft(contentType),\n DP.statusToLookup(contentType),\n DP.statusToData(contentType),\n // Default locale will be set if not provided\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n i18n.localeToData(contentType)\n )(params);\n\n const { data: _data, ...restParams } = await transformParamsDocumentId(uid, queryParams || {});\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams || {}) as any);\n\n // Validation\n // Find if document exists\n const entryToUpdate = await strapi.db\n .query(uid)\n .findOne({ ...query, where: { ...queryParams?.lookup, ...query?.where, documentId } });\n\n let updatedDraft = null;\n if (entryToUpdate) {\n updatedDraft = await entries.update(entryToUpdate, queryParams);\n emitEvent('entry.update', updatedDraft);\n }\n\n if (!updatedDraft) {\n const documentExists = await strapi.db\n .query(contentType.uid)\n .findOne({ where: { documentId } });\n\n if (documentExists) {\n const mergedData = await copyNonLocalizedFields(contentType, documentId, {\n ...queryParams.data,\n documentId,\n });\n\n updatedDraft = await entries.create({\n ...queryParams,\n data: mergedData,\n });\n emitEvent('entry.create', updatedDraft);\n }\n }\n\n if (hasDraftAndPublish && updatedDraft && params.status === 'published') {\n return publish({\n ...params,\n documentId,\n }).then((doc) => doc.entries[0]);\n }\n\n return updatedDraft;\n }\n\n async function count(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultStatus(contentType),\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid)\n )(params);\n\n return strapi.db.query(uid).count(query);\n }\n\n async function publish(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n const [draftsToPublish, oldPublishedVersions] = await Promise.all([\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: null, // Ignore lookup\n },\n // Populate relations, media, compos and dz\n populate: getDeepPopulate(uid, { relationalFields: ['documentId', 'locale'] }),\n }),\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: { $ne: null },\n },\n select: ['id', 'locale'],\n }),\n ]);\n\n // Load any unidirectional relation targetting the old published entries\n const relationsToSync = await unidirectionalRelations.load(\n uid,\n {\n newVersions: draftsToPublish,\n oldVersions: oldPublishedVersions,\n },\n {\n shouldPropagateRelation: components.createComponentRelationFilter(),\n }\n );\n\n const bidirectionalRelationsToSync = await bidirectionalRelations.load(uid, {\n newVersions: draftsToPublish,\n oldVersions: oldPublishedVersions,\n });\n\n const selfRelationsToSync = await selfReferentialRelations.load(\n uid,\n draftsToPublish,\n 'published'\n );\n\n // Delete old published versions\n await async.map(oldPublishedVersions, (entry: any) => entries.delete(entry.id));\n\n // Add firstPublishedAt to draft if it doesn't exist\n const updatedDraft = await async.map(draftsToPublish, (draft: any) =>\n addFirstPublishedAtToDraft(draft, entries.update, contentType)\n );\n\n // Transform draft entry data and create published versions\n const publishedEntries = await async.map(updatedDraft, (draft: any) =>\n entries.publish(draft, queryParams)\n );\n\n // Sync unidirectional relations with the new published entries\n await unidirectionalRelations.sync(\n [...oldPublishedVersions, ...updatedDraft],\n publishedEntries,\n relationsToSync\n );\n\n await bidirectionalRelations.sync(\n [...oldPublishedVersions, ...updatedDraft],\n publishedEntries,\n bidirectionalRelationsToSync\n );\n\n // Map both old published IDs and updated draft IDs to the new published entries.\n await selfReferentialRelations.sync(\n [...oldPublishedVersions, ...updatedDraft],\n publishedEntries,\n selfRelationsToSync\n );\n\n publishedEntries.forEach(emitEvent('entry.publish'));\n\n return { documentId, entries: publishedEntries };\n }\n\n async function unpublish(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId, publishedAt: { $ne: null } }, query)\n )(params);\n\n // Delete all published versions\n const versionsToDelete = await strapi.db.query(uid).findMany(query);\n await async.map(versionsToDelete, (entry: any) => entries.delete(entry.id));\n\n versionsToDelete.forEach(emitEvent('entry.unpublish'));\n return { documentId, entries: versionsToDelete };\n }\n\n async function discardDraft(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n const [versionsToDraft, oldDrafts] = await Promise.all([\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: { $ne: null },\n },\n // Populate relations, media, compos and dz\n populate: getDeepPopulate(uid, { relationalFields: ['documentId', 'locale'] }),\n }),\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: null,\n },\n select: ['id', 'locale'],\n }),\n ]);\n\n // Load any unidirectional relation targeting the old drafts\n const relationsToSync = await unidirectionalRelations.load(\n uid,\n {\n newVersions: versionsToDraft,\n oldVersions: oldDrafts,\n },\n {\n shouldPropagateRelation: components.createComponentRelationFilter(),\n }\n );\n\n const bidirectionalRelationsToSync = await bidirectionalRelations.load(uid, {\n newVersions: versionsToDraft,\n oldVersions: oldDrafts,\n });\n\n const selfRelationsToSync = await selfReferentialRelations.load(uid, versionsToDraft, 'draft');\n\n // Delete old drafts\n await async.map(oldDrafts, (entry: any) => entries.delete(entry.id));\n\n // Transform published entry data and create draft versions\n const draftEntries = await async.map(versionsToDraft, (entry: any) =>\n entries.discardDraft(entry, queryParams)\n );\n\n // Sync unidirectional relations with the new draft entries\n await unidirectionalRelations.sync(\n [...oldDrafts, ...versionsToDraft],\n draftEntries,\n relationsToSync\n );\n\n await bidirectionalRelations.sync(\n [...oldDrafts, ...versionsToDraft],\n draftEntries,\n bidirectionalRelationsToSync\n );\n\n // Map both old draft IDs and published source IDs to the new draft entries.\n await selfReferentialRelations.sync(\n [...oldDrafts, ...versionsToDraft],\n draftEntries,\n selfRelationsToSync\n );\n\n draftEntries.forEach(emitEvent('entry.draft-discard'));\n return { documentId, entries: draftEntries };\n }\n\n async function updateComponents(entry: any, data: any) {\n return components.updateComponents(uid, entry, data);\n }\n\n function omitComponentData(data: any) {\n return components.omitComponentData(contentType, data);\n }\n\n return {\n findMany: wrapInTransaction(findMany),\n findFirst: wrapInTransaction(findFirst),\n findOne: wrapInTransaction(findOne),\n delete: wrapInTransaction(deleteDocument),\n create: wrapInTransaction(create),\n clone: wrapInTransaction(clone),\n update: wrapInTransaction(update),\n count: wrapInTransaction(count),\n publish: hasDraftAndPublish ? wrapInTransaction(publish) : (undefined as any),\n unpublish: hasDraftAndPublish ? wrapInTransaction(unpublish) : (undefined as any),\n discardDraft: hasDraftAndPublish ? wrapInTransaction(discardDraft) : (undefined as any),\n\n updateComponents,\n omitComponentData,\n };\n};\n"],"names":["validators","validate","getModel","schema","strapi","LOCALE_FORMAT","MAX_LOCALE_LENGTH","isParamEmpty","v","undefined","createContentTypeRepository","uid","validator","entityValidator","contentType","hasDraftAndPublish","contentTypesUtils","sortValidations","fieldValidations","filtersValidations","populateValidations","sort","field","filters","populate","checkStatus","params","strict","status","errors","ValidationError","checkLocale","locale","Array","isArray","received","validateAndNormalizeOne","value","path","isEmpty","length","tooLong","invalidFormat","test","reason","filtered","filter","item","map","i","parsePaginationInt","name","spec","num","Number","valid","isInteger","min","allowMinusOne","expected","parseWithCount","PAGINATION_KEYS","checkPagination","hasPage","page","pageSize","hasOffset","start","limit","withCount","result","omit","checkUnrecognizedRootParams","pick","ALLOWED_DOCUMENT_ROOT_PARAM_KEYS","validateParams","modelCache","createModelCache","ctx","validations","push","validateFilters","validateSort","fields","validateFields","validatePopulate","runParallelWithOrderedErrors","clear","lookup","rawStrictParams","config","get","processedParams","entries","createEntriesService","eventManager","createEventManager","emitEvent","curry","findMany","query","async","pipe","DP","i18n","transformParamsDocumentId","transformParamsToQuery","db","findFirst","findOne","opts","documentId","assoc","where","deleteDocument","lookupQuery","selectionQuery","pickSelectionParams","Error","entriesToDelete","deletedEntries","entryToDelete","delete","id","forEach","create","_documentId","queryParams","doc","publish","then","clone","entriesToClone","publishedAt","$null","getDeepPopulate","relationalFields","newDocumentId","createDocumentId","clonedEntries","entryToClone","sourceEntryId","originalData","data","relationsToCopy","prepareCloneData","modelUid","dataWithDocumentId","copyCloneRelationRows","at","update","filterDataFirstPublishedAt","_data","restParams","entryToUpdate","updatedDraft","documentExists","mergedData","copyNonLocalizedFields","count","draftsToPublish","oldPublishedVersions","Promise","all","$ne","select","relationsToSync","unidirectionalRelations","newVersions","oldVersions","shouldPropagateRelation","components","bidirectionalRelationsToSync","bidirectionalRelations","selfRelationsToSync","selfReferentialRelations","entry","draft","addFirstPublishedAtToDraft","publishedEntries","unpublish","versionsToDelete","discardDraft","versionsToDraft","oldDrafts","draftEntries","updateComponents","omitComponentData","wrapInTransaction"],"mappings":"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"}
@@ -113,7 +113,7 @@ const findContentTypeParentForComponentInstance = async (componentSchema, compon
113
113
  }
114
114
  // If we reach here, this component instance's parent DOES support D&P
115
115
  // Continue to process this component instance for ghost relations
116
- } catch (error) {
116
+ } catch {
117
117
  continue;
118
118
  }
119
119
  }
@@ -136,7 +136,7 @@ const findContentTypeParentForComponentInstance = async (componentSchema, compon
136
136
  }
137
137
  }
138
138
  return ghostEntries;
139
- } catch (error) {
139
+ } catch {
140
140
  return [];
141
141
  }
142
142
  };
@@ -1 +1 @@
1
- {"version":3,"file":"clean-component-join-table.js","sources":["../../../../src/services/document-service/utils/clean-component-join-table.ts"],"sourcesContent":["import type { Database } from '@strapi/database';\nimport type { Schema } from '@strapi/types';\nimport { findComponentParent, getParentSchemasForComponent } from '../components';\n\n/**\n * Cleans ghost relations with publication state mismatches from a join table\n * Uses schema-based draft/publish checking like prevention fix\n */\nexport const cleanComponentJoinTable = async (\n db: Database,\n joinTableName: string,\n relation: any,\n sourceModel: any\n): Promise<number> => {\n try {\n // Get the target model metadata\n const targetModel = db.metadata.get(relation.target);\n if (!targetModel) {\n db.logger.debug(`Target model ${relation.target} not found, skipping ${joinTableName}`);\n return 0;\n }\n\n // Check if source supports draft/publish, if it doesnt it should contain duplicate states\n const sourceContentType = strapi.contentTypes[sourceModel.uid];\n // It could be a model, which does not have the draftAndPublish option\n const sourceSupportsDraftPublish = sourceContentType?.options?.draftAndPublish;\n\n if (sourceContentType && !sourceSupportsDraftPublish) {\n return 0;\n }\n\n // Check if target supports draft/publish using schema-based approach (like prevention fix)\n const targetContentType =\n strapi.contentTypes[relation.target as keyof typeof strapi.contentTypes];\n const targetSupportsDraftPublish = targetContentType?.options?.draftAndPublish || false;\n\n if (!targetSupportsDraftPublish) {\n return 0;\n }\n\n // Find entries with publication state mismatches\n const ghostEntries = await findPublicationStateMismatches(\n db,\n joinTableName,\n relation,\n targetModel,\n sourceModel\n );\n\n if (ghostEntries.length === 0) {\n return 0;\n }\n\n // Remove ghost entries\n await db.connection(joinTableName).whereIn('id', ghostEntries).del();\n db.logger.debug(\n `Removed ${ghostEntries.length} ghost relations with publication state mismatches from ${joinTableName}`\n );\n\n return ghostEntries.length;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n db.logger.error(`Failed to clean join table \"${joinTableName}\": ${errorMessage}`);\n return 0;\n }\n};\n\nconst findContentTypeParentForComponentInstance = async (\n componentSchema: Schema.Component,\n componentId: number | string\n): Promise<{ uid: string; table: string; parentId: number | string } | null> => {\n // Get the parent schemas that could contain this component\n const parentSchemas = getParentSchemasForComponent(componentSchema);\n if (parentSchemas.length === 0) {\n // No potential parents\n return null;\n }\n\n // Find the actual parent for THIS specific component instance\n const parent = await findComponentParent(componentSchema, componentId, parentSchemas);\n if (!parent) {\n // No parent found for this component instance\n return null;\n }\n\n if (strapi.components[parent.uid as keyof typeof strapi.components]) {\n // If the parent is a component, we need to check its parents recursively\n const parentComponentSchema = strapi.components[parent.uid as keyof typeof strapi.components];\n return findContentTypeParentForComponentInstance(parentComponentSchema, parent.parentId);\n }\n\n if (strapi.contentTypes[parent.uid as keyof typeof strapi.contentTypes]) {\n // Found a content type parent\n return parent;\n }\n\n return null;\n};\n\n/**\n * Finds join table entries with publication state mismatches\n * Uses existing component parent detection from document service\n */\nconst findPublicationStateMismatches = async (\n db: Database,\n joinTableName: string,\n relation: any,\n targetModel: any,\n sourceModel: any\n): Promise<number[]> => {\n try {\n // Get join column names using proper functions (addressing PR feedback)\n const sourceColumn = relation.joinTable.joinColumn.name;\n const targetColumn = relation.joinTable.inverseJoinColumn.name;\n\n // Get all join entries with their target entities\n const query = db\n .connection(joinTableName)\n .select(\n `${joinTableName}.id as join_id`,\n `${joinTableName}.${sourceColumn} as source_id`,\n `${joinTableName}.${targetColumn} as target_id`,\n `${targetModel.tableName}.published_at as target_published_at`\n )\n .leftJoin(\n targetModel.tableName,\n `${joinTableName}.${targetColumn}`,\n `${targetModel.tableName}.id`\n );\n\n const joinEntries = await query;\n\n // Group by source_id to find duplicates pointing to draft/published versions of same entity\n const entriesBySource: { [key: string]: any[] } = {};\n for (const entry of joinEntries) {\n const sourceId = entry.source_id;\n if (!entriesBySource[sourceId]) {\n entriesBySource[sourceId] = [];\n }\n entriesBySource[sourceId].push(entry);\n }\n\n const ghostEntries: number[] = [];\n\n // Check if this is a join table (ends with _lnk)\n const isRelationJoinTable = joinTableName.endsWith('_lnk');\n const isComponentModel =\n !sourceModel.uid?.startsWith('api::') &&\n !sourceModel.uid?.startsWith('plugin::') &&\n sourceModel.uid?.includes('.');\n\n // Check for draft/publish inconsistencies\n for (const [sourceId, entries] of Object.entries(entriesBySource)) {\n // Skip entries with single relations\n if (entries.length <= 1) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // For component join tables, check if THIS specific component instance's parent supports D&P\n if (isRelationJoinTable && isComponentModel) {\n try {\n const componentSchema = strapi.components[sourceModel.uid] as Schema.Component;\n if (!componentSchema) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const parent = await findContentTypeParentForComponentInstance(componentSchema, sourceId);\n if (!parent) {\n continue;\n }\n\n // Check if THIS component instance's parent supports draft/publish\n const parentContentType =\n strapi.contentTypes[parent.uid as keyof typeof strapi.contentTypes];\n if (!parentContentType?.options?.draftAndPublish) {\n // This component instance's parent does NOT support D&P - skip cleanup\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // If we reach here, this component instance's parent DOES support D&P\n // Continue to process this component instance for ghost relations\n } catch (error) {\n // Skip this component instance on error\n // eslint-disable-next-line no-continue\n continue;\n }\n }\n\n // Find ghost relations (same logic as original but with improved parent checking)\n for (const entry of entries) {\n if (entry.target_published_at === null) {\n // This is a draft target - find its published version\n const draftTarget = await db\n .connection(targetModel.tableName)\n .select('document_id')\n .where('id', entry.target_id)\n .first();\n\n if (draftTarget) {\n const publishedVersion = await db\n .connection(targetModel.tableName)\n .select('id', 'document_id')\n .where('document_id', draftTarget.document_id)\n .whereNotNull('published_at')\n .first();\n\n if (publishedVersion) {\n // Check if we also have a relation to the published version\n const publishedRelation = entries.find((e) => e.target_id === publishedVersion.id);\n if (publishedRelation) {\n ghostEntries.push(publishedRelation.join_id);\n }\n }\n }\n }\n }\n }\n\n return ghostEntries;\n } catch (error) {\n return [];\n }\n};\n"],"names":["cleanComponentJoinTable","db","joinTableName","relation","sourceModel","targetModel","metadata","get","target","logger","debug","sourceContentType","strapi","contentTypes","uid","sourceSupportsDraftPublish","options","draftAndPublish","targetContentType","targetSupportsDraftPublish","ghostEntries","findPublicationStateMismatches","length","connection","whereIn","del","error","errorMessage","Error","message","String","findContentTypeParentForComponentInstance","componentSchema","componentId","parentSchemas","getParentSchemasForComponent","parent","findComponentParent","components","parentComponentSchema","parentId","sourceColumn","joinTable","joinColumn","name","targetColumn","inverseJoinColumn","query","select","tableName","leftJoin","joinEntries","entriesBySource","entry","sourceId","source_id","push","isRelationJoinTable","endsWith","isComponentModel","startsWith","includes","entries","Object","parentContentType","target_published_at","draftTarget","where","target_id","first","publishedVersion","document_id","whereNotNull","publishedRelation","find","e","id","join_id"],"mappings":"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"}
1
+ {"version":3,"file":"clean-component-join-table.js","sources":["../../../../src/services/document-service/utils/clean-component-join-table.ts"],"sourcesContent":["import type { Database } from '@strapi/database';\nimport type { Schema } from '@strapi/types';\nimport { findComponentParent, getParentSchemasForComponent } from '../components';\n\n/**\n * Cleans ghost relations with publication state mismatches from a join table\n * Uses schema-based draft/publish checking like prevention fix\n */\nexport const cleanComponentJoinTable = async (\n db: Database,\n joinTableName: string,\n relation: any,\n sourceModel: any\n): Promise<number> => {\n try {\n // Get the target model metadata\n const targetModel = db.metadata.get(relation.target);\n if (!targetModel) {\n db.logger.debug(`Target model ${relation.target} not found, skipping ${joinTableName}`);\n return 0;\n }\n\n // Check if source supports draft/publish, if it doesnt it should contain duplicate states\n const sourceContentType = strapi.contentTypes[sourceModel.uid];\n // It could be a model, which does not have the draftAndPublish option\n const sourceSupportsDraftPublish = sourceContentType?.options?.draftAndPublish;\n\n if (sourceContentType && !sourceSupportsDraftPublish) {\n return 0;\n }\n\n // Check if target supports draft/publish using schema-based approach (like prevention fix)\n const targetContentType =\n strapi.contentTypes[relation.target as keyof typeof strapi.contentTypes];\n const targetSupportsDraftPublish = targetContentType?.options?.draftAndPublish || false;\n\n if (!targetSupportsDraftPublish) {\n return 0;\n }\n\n // Find entries with publication state mismatches\n const ghostEntries = await findPublicationStateMismatches(\n db,\n joinTableName,\n relation,\n targetModel,\n sourceModel\n );\n\n if (ghostEntries.length === 0) {\n return 0;\n }\n\n // Remove ghost entries\n await db.connection(joinTableName).whereIn('id', ghostEntries).del();\n db.logger.debug(\n `Removed ${ghostEntries.length} ghost relations with publication state mismatches from ${joinTableName}`\n );\n\n return ghostEntries.length;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n db.logger.error(`Failed to clean join table \"${joinTableName}\": ${errorMessage}`);\n return 0;\n }\n};\n\nconst findContentTypeParentForComponentInstance = async (\n componentSchema: Schema.Component,\n componentId: number | string\n): Promise<{ uid: string; table: string; parentId: number | string } | null> => {\n // Get the parent schemas that could contain this component\n const parentSchemas = getParentSchemasForComponent(componentSchema);\n if (parentSchemas.length === 0) {\n // No potential parents\n return null;\n }\n\n // Find the actual parent for THIS specific component instance\n const parent = await findComponentParent(componentSchema, componentId, parentSchemas);\n if (!parent) {\n // No parent found for this component instance\n return null;\n }\n\n if (strapi.components[parent.uid as keyof typeof strapi.components]) {\n // If the parent is a component, we need to check its parents recursively\n const parentComponentSchema = strapi.components[parent.uid as keyof typeof strapi.components];\n return findContentTypeParentForComponentInstance(parentComponentSchema, parent.parentId);\n }\n\n if (strapi.contentTypes[parent.uid as keyof typeof strapi.contentTypes]) {\n // Found a content type parent\n return parent;\n }\n\n return null;\n};\n\n/**\n * Finds join table entries with publication state mismatches\n * Uses existing component parent detection from document service\n */\nconst findPublicationStateMismatches = async (\n db: Database,\n joinTableName: string,\n relation: any,\n targetModel: any,\n sourceModel: any\n): Promise<number[]> => {\n try {\n // Get join column names using proper functions (addressing PR feedback)\n const sourceColumn = relation.joinTable.joinColumn.name;\n const targetColumn = relation.joinTable.inverseJoinColumn.name;\n\n // Get all join entries with their target entities\n const query = db\n .connection(joinTableName)\n .select(\n `${joinTableName}.id as join_id`,\n `${joinTableName}.${sourceColumn} as source_id`,\n `${joinTableName}.${targetColumn} as target_id`,\n `${targetModel.tableName}.published_at as target_published_at`\n )\n .leftJoin(\n targetModel.tableName,\n `${joinTableName}.${targetColumn}`,\n `${targetModel.tableName}.id`\n );\n\n const joinEntries = await query;\n\n // Group by source_id to find duplicates pointing to draft/published versions of same entity\n const entriesBySource: { [key: string]: any[] } = {};\n for (const entry of joinEntries) {\n const sourceId = entry.source_id;\n if (!entriesBySource[sourceId]) {\n entriesBySource[sourceId] = [];\n }\n entriesBySource[sourceId].push(entry);\n }\n\n const ghostEntries: number[] = [];\n\n // Check if this is a join table (ends with _lnk)\n const isRelationJoinTable = joinTableName.endsWith('_lnk');\n const isComponentModel =\n !sourceModel.uid?.startsWith('api::') &&\n !sourceModel.uid?.startsWith('plugin::') &&\n sourceModel.uid?.includes('.');\n\n // Check for draft/publish inconsistencies\n for (const [sourceId, entries] of Object.entries(entriesBySource)) {\n // Skip entries with single relations\n if (entries.length <= 1) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // For component join tables, check if THIS specific component instance's parent supports D&P\n if (isRelationJoinTable && isComponentModel) {\n try {\n const componentSchema = strapi.components[sourceModel.uid] as Schema.Component;\n if (!componentSchema) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const parent = await findContentTypeParentForComponentInstance(componentSchema, sourceId);\n if (!parent) {\n continue;\n }\n\n // Check if THIS component instance's parent supports draft/publish\n const parentContentType =\n strapi.contentTypes[parent.uid as keyof typeof strapi.contentTypes];\n if (!parentContentType?.options?.draftAndPublish) {\n // This component instance's parent does NOT support D&P - skip cleanup\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // If we reach here, this component instance's parent DOES support D&P\n // Continue to process this component instance for ghost relations\n } catch {\n // Skip this component instance on error\n // eslint-disable-next-line no-continue\n continue;\n }\n }\n\n // Find ghost relations (same logic as original but with improved parent checking)\n for (const entry of entries) {\n if (entry.target_published_at === null) {\n // This is a draft target - find its published version\n const draftTarget = await db\n .connection(targetModel.tableName)\n .select('document_id')\n .where('id', entry.target_id)\n .first();\n\n if (draftTarget) {\n const publishedVersion = await db\n .connection(targetModel.tableName)\n .select('id', 'document_id')\n .where('document_id', draftTarget.document_id)\n .whereNotNull('published_at')\n .first();\n\n if (publishedVersion) {\n // Check if we also have a relation to the published version\n const publishedRelation = entries.find((e) => e.target_id === publishedVersion.id);\n if (publishedRelation) {\n ghostEntries.push(publishedRelation.join_id);\n }\n }\n }\n }\n }\n }\n\n return ghostEntries;\n } catch {\n return [];\n }\n};\n"],"names":["cleanComponentJoinTable","db","joinTableName","relation","sourceModel","targetModel","metadata","get","target","logger","debug","sourceContentType","strapi","contentTypes","uid","sourceSupportsDraftPublish","options","draftAndPublish","targetContentType","targetSupportsDraftPublish","ghostEntries","findPublicationStateMismatches","length","connection","whereIn","del","error","errorMessage","Error","message","String","findContentTypeParentForComponentInstance","componentSchema","componentId","parentSchemas","getParentSchemasForComponent","parent","findComponentParent","components","parentComponentSchema","parentId","sourceColumn","joinTable","joinColumn","name","targetColumn","inverseJoinColumn","query","select","tableName","leftJoin","joinEntries","entriesBySource","entry","sourceId","source_id","push","isRelationJoinTable","endsWith","isComponentModel","startsWith","includes","entries","Object","parentContentType","target_published_at","draftTarget","where","target_id","first","publishedVersion","document_id","whereNotNull","publishedRelation","find","e","id","join_id"],"mappings":"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"}
@@ -111,7 +111,7 @@ const findContentTypeParentForComponentInstance = async (componentSchema, compon
111
111
  }
112
112
  // If we reach here, this component instance's parent DOES support D&P
113
113
  // Continue to process this component instance for ghost relations
114
- } catch (error) {
114
+ } catch {
115
115
  continue;
116
116
  }
117
117
  }
@@ -134,7 +134,7 @@ const findContentTypeParentForComponentInstance = async (componentSchema, compon
134
134
  }
135
135
  }
136
136
  return ghostEntries;
137
- } catch (error) {
137
+ } catch {
138
138
  return [];
139
139
  }
140
140
  };
@@ -1 +1 @@
1
- {"version":3,"file":"clean-component-join-table.mjs","sources":["../../../../src/services/document-service/utils/clean-component-join-table.ts"],"sourcesContent":["import type { Database } from '@strapi/database';\nimport type { Schema } from '@strapi/types';\nimport { findComponentParent, getParentSchemasForComponent } from '../components';\n\n/**\n * Cleans ghost relations with publication state mismatches from a join table\n * Uses schema-based draft/publish checking like prevention fix\n */\nexport const cleanComponentJoinTable = async (\n db: Database,\n joinTableName: string,\n relation: any,\n sourceModel: any\n): Promise<number> => {\n try {\n // Get the target model metadata\n const targetModel = db.metadata.get(relation.target);\n if (!targetModel) {\n db.logger.debug(`Target model ${relation.target} not found, skipping ${joinTableName}`);\n return 0;\n }\n\n // Check if source supports draft/publish, if it doesnt it should contain duplicate states\n const sourceContentType = strapi.contentTypes[sourceModel.uid];\n // It could be a model, which does not have the draftAndPublish option\n const sourceSupportsDraftPublish = sourceContentType?.options?.draftAndPublish;\n\n if (sourceContentType && !sourceSupportsDraftPublish) {\n return 0;\n }\n\n // Check if target supports draft/publish using schema-based approach (like prevention fix)\n const targetContentType =\n strapi.contentTypes[relation.target as keyof typeof strapi.contentTypes];\n const targetSupportsDraftPublish = targetContentType?.options?.draftAndPublish || false;\n\n if (!targetSupportsDraftPublish) {\n return 0;\n }\n\n // Find entries with publication state mismatches\n const ghostEntries = await findPublicationStateMismatches(\n db,\n joinTableName,\n relation,\n targetModel,\n sourceModel\n );\n\n if (ghostEntries.length === 0) {\n return 0;\n }\n\n // Remove ghost entries\n await db.connection(joinTableName).whereIn('id', ghostEntries).del();\n db.logger.debug(\n `Removed ${ghostEntries.length} ghost relations with publication state mismatches from ${joinTableName}`\n );\n\n return ghostEntries.length;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n db.logger.error(`Failed to clean join table \"${joinTableName}\": ${errorMessage}`);\n return 0;\n }\n};\n\nconst findContentTypeParentForComponentInstance = async (\n componentSchema: Schema.Component,\n componentId: number | string\n): Promise<{ uid: string; table: string; parentId: number | string } | null> => {\n // Get the parent schemas that could contain this component\n const parentSchemas = getParentSchemasForComponent(componentSchema);\n if (parentSchemas.length === 0) {\n // No potential parents\n return null;\n }\n\n // Find the actual parent for THIS specific component instance\n const parent = await findComponentParent(componentSchema, componentId, parentSchemas);\n if (!parent) {\n // No parent found for this component instance\n return null;\n }\n\n if (strapi.components[parent.uid as keyof typeof strapi.components]) {\n // If the parent is a component, we need to check its parents recursively\n const parentComponentSchema = strapi.components[parent.uid as keyof typeof strapi.components];\n return findContentTypeParentForComponentInstance(parentComponentSchema, parent.parentId);\n }\n\n if (strapi.contentTypes[parent.uid as keyof typeof strapi.contentTypes]) {\n // Found a content type parent\n return parent;\n }\n\n return null;\n};\n\n/**\n * Finds join table entries with publication state mismatches\n * Uses existing component parent detection from document service\n */\nconst findPublicationStateMismatches = async (\n db: Database,\n joinTableName: string,\n relation: any,\n targetModel: any,\n sourceModel: any\n): Promise<number[]> => {\n try {\n // Get join column names using proper functions (addressing PR feedback)\n const sourceColumn = relation.joinTable.joinColumn.name;\n const targetColumn = relation.joinTable.inverseJoinColumn.name;\n\n // Get all join entries with their target entities\n const query = db\n .connection(joinTableName)\n .select(\n `${joinTableName}.id as join_id`,\n `${joinTableName}.${sourceColumn} as source_id`,\n `${joinTableName}.${targetColumn} as target_id`,\n `${targetModel.tableName}.published_at as target_published_at`\n )\n .leftJoin(\n targetModel.tableName,\n `${joinTableName}.${targetColumn}`,\n `${targetModel.tableName}.id`\n );\n\n const joinEntries = await query;\n\n // Group by source_id to find duplicates pointing to draft/published versions of same entity\n const entriesBySource: { [key: string]: any[] } = {};\n for (const entry of joinEntries) {\n const sourceId = entry.source_id;\n if (!entriesBySource[sourceId]) {\n entriesBySource[sourceId] = [];\n }\n entriesBySource[sourceId].push(entry);\n }\n\n const ghostEntries: number[] = [];\n\n // Check if this is a join table (ends with _lnk)\n const isRelationJoinTable = joinTableName.endsWith('_lnk');\n const isComponentModel =\n !sourceModel.uid?.startsWith('api::') &&\n !sourceModel.uid?.startsWith('plugin::') &&\n sourceModel.uid?.includes('.');\n\n // Check for draft/publish inconsistencies\n for (const [sourceId, entries] of Object.entries(entriesBySource)) {\n // Skip entries with single relations\n if (entries.length <= 1) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // For component join tables, check if THIS specific component instance's parent supports D&P\n if (isRelationJoinTable && isComponentModel) {\n try {\n const componentSchema = strapi.components[sourceModel.uid] as Schema.Component;\n if (!componentSchema) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const parent = await findContentTypeParentForComponentInstance(componentSchema, sourceId);\n if (!parent) {\n continue;\n }\n\n // Check if THIS component instance's parent supports draft/publish\n const parentContentType =\n strapi.contentTypes[parent.uid as keyof typeof strapi.contentTypes];\n if (!parentContentType?.options?.draftAndPublish) {\n // This component instance's parent does NOT support D&P - skip cleanup\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // If we reach here, this component instance's parent DOES support D&P\n // Continue to process this component instance for ghost relations\n } catch (error) {\n // Skip this component instance on error\n // eslint-disable-next-line no-continue\n continue;\n }\n }\n\n // Find ghost relations (same logic as original but with improved parent checking)\n for (const entry of entries) {\n if (entry.target_published_at === null) {\n // This is a draft target - find its published version\n const draftTarget = await db\n .connection(targetModel.tableName)\n .select('document_id')\n .where('id', entry.target_id)\n .first();\n\n if (draftTarget) {\n const publishedVersion = await db\n .connection(targetModel.tableName)\n .select('id', 'document_id')\n .where('document_id', draftTarget.document_id)\n .whereNotNull('published_at')\n .first();\n\n if (publishedVersion) {\n // Check if we also have a relation to the published version\n const publishedRelation = entries.find((e) => e.target_id === publishedVersion.id);\n if (publishedRelation) {\n ghostEntries.push(publishedRelation.join_id);\n }\n }\n }\n }\n }\n }\n\n return ghostEntries;\n } catch (error) {\n return [];\n }\n};\n"],"names":["cleanComponentJoinTable","db","joinTableName","relation","sourceModel","targetModel","metadata","get","target","logger","debug","sourceContentType","strapi","contentTypes","uid","sourceSupportsDraftPublish","options","draftAndPublish","targetContentType","targetSupportsDraftPublish","ghostEntries","findPublicationStateMismatches","length","connection","whereIn","del","error","errorMessage","Error","message","String","findContentTypeParentForComponentInstance","componentSchema","componentId","parentSchemas","getParentSchemasForComponent","parent","findComponentParent","components","parentComponentSchema","parentId","sourceColumn","joinTable","joinColumn","name","targetColumn","inverseJoinColumn","query","select","tableName","leftJoin","joinEntries","entriesBySource","entry","sourceId","source_id","push","isRelationJoinTable","endsWith","isComponentModel","startsWith","includes","entries","Object","parentContentType","target_published_at","draftTarget","where","target_id","first","publishedVersion","document_id","whereNotNull","publishedRelation","find","e","id","join_id"],"mappings":"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"}
1
+ {"version":3,"file":"clean-component-join-table.mjs","sources":["../../../../src/services/document-service/utils/clean-component-join-table.ts"],"sourcesContent":["import type { Database } from '@strapi/database';\nimport type { Schema } from '@strapi/types';\nimport { findComponentParent, getParentSchemasForComponent } from '../components';\n\n/**\n * Cleans ghost relations with publication state mismatches from a join table\n * Uses schema-based draft/publish checking like prevention fix\n */\nexport const cleanComponentJoinTable = async (\n db: Database,\n joinTableName: string,\n relation: any,\n sourceModel: any\n): Promise<number> => {\n try {\n // Get the target model metadata\n const targetModel = db.metadata.get(relation.target);\n if (!targetModel) {\n db.logger.debug(`Target model ${relation.target} not found, skipping ${joinTableName}`);\n return 0;\n }\n\n // Check if source supports draft/publish, if it doesnt it should contain duplicate states\n const sourceContentType = strapi.contentTypes[sourceModel.uid];\n // It could be a model, which does not have the draftAndPublish option\n const sourceSupportsDraftPublish = sourceContentType?.options?.draftAndPublish;\n\n if (sourceContentType && !sourceSupportsDraftPublish) {\n return 0;\n }\n\n // Check if target supports draft/publish using schema-based approach (like prevention fix)\n const targetContentType =\n strapi.contentTypes[relation.target as keyof typeof strapi.contentTypes];\n const targetSupportsDraftPublish = targetContentType?.options?.draftAndPublish || false;\n\n if (!targetSupportsDraftPublish) {\n return 0;\n }\n\n // Find entries with publication state mismatches\n const ghostEntries = await findPublicationStateMismatches(\n db,\n joinTableName,\n relation,\n targetModel,\n sourceModel\n );\n\n if (ghostEntries.length === 0) {\n return 0;\n }\n\n // Remove ghost entries\n await db.connection(joinTableName).whereIn('id', ghostEntries).del();\n db.logger.debug(\n `Removed ${ghostEntries.length} ghost relations with publication state mismatches from ${joinTableName}`\n );\n\n return ghostEntries.length;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n db.logger.error(`Failed to clean join table \"${joinTableName}\": ${errorMessage}`);\n return 0;\n }\n};\n\nconst findContentTypeParentForComponentInstance = async (\n componentSchema: Schema.Component,\n componentId: number | string\n): Promise<{ uid: string; table: string; parentId: number | string } | null> => {\n // Get the parent schemas that could contain this component\n const parentSchemas = getParentSchemasForComponent(componentSchema);\n if (parentSchemas.length === 0) {\n // No potential parents\n return null;\n }\n\n // Find the actual parent for THIS specific component instance\n const parent = await findComponentParent(componentSchema, componentId, parentSchemas);\n if (!parent) {\n // No parent found for this component instance\n return null;\n }\n\n if (strapi.components[parent.uid as keyof typeof strapi.components]) {\n // If the parent is a component, we need to check its parents recursively\n const parentComponentSchema = strapi.components[parent.uid as keyof typeof strapi.components];\n return findContentTypeParentForComponentInstance(parentComponentSchema, parent.parentId);\n }\n\n if (strapi.contentTypes[parent.uid as keyof typeof strapi.contentTypes]) {\n // Found a content type parent\n return parent;\n }\n\n return null;\n};\n\n/**\n * Finds join table entries with publication state mismatches\n * Uses existing component parent detection from document service\n */\nconst findPublicationStateMismatches = async (\n db: Database,\n joinTableName: string,\n relation: any,\n targetModel: any,\n sourceModel: any\n): Promise<number[]> => {\n try {\n // Get join column names using proper functions (addressing PR feedback)\n const sourceColumn = relation.joinTable.joinColumn.name;\n const targetColumn = relation.joinTable.inverseJoinColumn.name;\n\n // Get all join entries with their target entities\n const query = db\n .connection(joinTableName)\n .select(\n `${joinTableName}.id as join_id`,\n `${joinTableName}.${sourceColumn} as source_id`,\n `${joinTableName}.${targetColumn} as target_id`,\n `${targetModel.tableName}.published_at as target_published_at`\n )\n .leftJoin(\n targetModel.tableName,\n `${joinTableName}.${targetColumn}`,\n `${targetModel.tableName}.id`\n );\n\n const joinEntries = await query;\n\n // Group by source_id to find duplicates pointing to draft/published versions of same entity\n const entriesBySource: { [key: string]: any[] } = {};\n for (const entry of joinEntries) {\n const sourceId = entry.source_id;\n if (!entriesBySource[sourceId]) {\n entriesBySource[sourceId] = [];\n }\n entriesBySource[sourceId].push(entry);\n }\n\n const ghostEntries: number[] = [];\n\n // Check if this is a join table (ends with _lnk)\n const isRelationJoinTable = joinTableName.endsWith('_lnk');\n const isComponentModel =\n !sourceModel.uid?.startsWith('api::') &&\n !sourceModel.uid?.startsWith('plugin::') &&\n sourceModel.uid?.includes('.');\n\n // Check for draft/publish inconsistencies\n for (const [sourceId, entries] of Object.entries(entriesBySource)) {\n // Skip entries with single relations\n if (entries.length <= 1) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // For component join tables, check if THIS specific component instance's parent supports D&P\n if (isRelationJoinTable && isComponentModel) {\n try {\n const componentSchema = strapi.components[sourceModel.uid] as Schema.Component;\n if (!componentSchema) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const parent = await findContentTypeParentForComponentInstance(componentSchema, sourceId);\n if (!parent) {\n continue;\n }\n\n // Check if THIS component instance's parent supports draft/publish\n const parentContentType =\n strapi.contentTypes[parent.uid as keyof typeof strapi.contentTypes];\n if (!parentContentType?.options?.draftAndPublish) {\n // This component instance's parent does NOT support D&P - skip cleanup\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // If we reach here, this component instance's parent DOES support D&P\n // Continue to process this component instance for ghost relations\n } catch {\n // Skip this component instance on error\n // eslint-disable-next-line no-continue\n continue;\n }\n }\n\n // Find ghost relations (same logic as original but with improved parent checking)\n for (const entry of entries) {\n if (entry.target_published_at === null) {\n // This is a draft target - find its published version\n const draftTarget = await db\n .connection(targetModel.tableName)\n .select('document_id')\n .where('id', entry.target_id)\n .first();\n\n if (draftTarget) {\n const publishedVersion = await db\n .connection(targetModel.tableName)\n .select('id', 'document_id')\n .where('document_id', draftTarget.document_id)\n .whereNotNull('published_at')\n .first();\n\n if (publishedVersion) {\n // Check if we also have a relation to the published version\n const publishedRelation = entries.find((e) => e.target_id === publishedVersion.id);\n if (publishedRelation) {\n ghostEntries.push(publishedRelation.join_id);\n }\n }\n }\n }\n }\n }\n\n return ghostEntries;\n } catch {\n return [];\n }\n};\n"],"names":["cleanComponentJoinTable","db","joinTableName","relation","sourceModel","targetModel","metadata","get","target","logger","debug","sourceContentType","strapi","contentTypes","uid","sourceSupportsDraftPublish","options","draftAndPublish","targetContentType","targetSupportsDraftPublish","ghostEntries","findPublicationStateMismatches","length","connection","whereIn","del","error","errorMessage","Error","message","String","findContentTypeParentForComponentInstance","componentSchema","componentId","parentSchemas","getParentSchemasForComponent","parent","findComponentParent","components","parentComponentSchema","parentId","sourceColumn","joinTable","joinColumn","name","targetColumn","inverseJoinColumn","query","select","tableName","leftJoin","joinEntries","entriesBySource","entry","sourceId","source_id","push","isRelationJoinTable","endsWith","isComponentModel","startsWith","includes","entries","Object","parentContentType","target_published_at","draftTarget","where","target_id","first","publishedVersion","document_id","whereNotNull","publishedRelation","find","e","id","join_id"],"mappings":"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"}
@@ -102,7 +102,7 @@ const copyCloneRelationRows = async (strapi, uid, sourceEntryId, targetEntryId,
102
102
  const { joinColumn } = joinTable;
103
103
  const rows = await strapi.db.connection(joinTable.name).where({
104
104
  [joinColumn.name]: sourceEntryId,
105
- ...'on' in joinTable && joinTable.on || {}
105
+ ...'on' in joinTable && joinTable.on || undefined
106
106
  }).select('*').transacting(trx);
107
107
  const rowsToCopy = rows.map((row)=>{
108
108
  const copiedRow = {
@@ -1 +1 @@
1
- {"version":3,"file":"clone-relations.js","sources":["../../../../src/services/document-service/utils/clone-relations.ts"],"sourcesContent":["import { merge, set } from 'lodash/fp';\n\nimport type { Core, Schema, UID } from '@strapi/types';\nimport type { traverseEntity } from '@strapi/utils';\nimport { traverseEntityRelations } from '../transform/relations/utils/map-relation';\n\nconst RELATION_OPERATIONS = ['connect', 'disconnect', 'set'] as const;\ntype TraversableData = Parameters<typeof traverseEntity>[2];\n\ntype CloneRelationAttribute = Schema.Attribute.Relation & {\n targetAttribute?: string;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n};\n\nconst isRelationAttribute = (attribute: unknown): attribute is CloneRelationAttribute => {\n return (\n isRecord(attribute) && attribute.type === 'relation' && typeof attribute.relation === 'string'\n );\n};\n\nconst isRelationOperationPayload = (value: unknown): value is Record<string, unknown> => {\n return (\n isRecord(value) &&\n RELATION_OPERATIONS.some((operation) => Object.prototype.hasOwnProperty.call(value, operation))\n );\n};\n\nconst hasMeaningfulRelationOperations = (value: Record<string, unknown>) => {\n if (Object.prototype.hasOwnProperty.call(value, 'set')) {\n return true;\n }\n\n return ['connect', 'disconnect'].some((operation) => {\n const operationValue = value[operation];\n return Array.isArray(operationValue) ? operationValue.length > 0 : operationValue != null;\n });\n};\n\nconst canTransformRelationOperationPayload = (attribute: Schema.Attribute.Relation) => {\n return attribute.useJoinTable !== false && attribute.relation !== 'morphToOne';\n};\n\nconst isBidirectionalOneToOne = (attribute: CloneRelationAttribute) => {\n return (\n attribute.relation === 'oneToOne' &&\n [attribute.inversedBy, attribute.mappedBy, attribute.targetAttribute].some(\n (inverseAttribute) => inverseAttribute != null\n )\n );\n};\n\nconst hasPopulatedRelation = (value: unknown) => {\n return isRecord(value) && ('id' in value || 'documentId' in value);\n};\n\nconst collectRelationOperationOverrides = async (\n submittedData: Record<string, unknown>,\n contentType: Schema.ContentType,\n getModel: (uid: string) => Schema.Schema\n) => {\n const overrides = new Map<string, Record<string, unknown>>();\n\n await traverseEntityRelations(\n ({ path, value }) => {\n if (isRelationOperationPayload(value) && hasMeaningfulRelationOperations(value)) {\n overrides.set(path.rawWithIndices!, value);\n }\n },\n { schema: contentType, getModel },\n submittedData as TraversableData\n );\n\n return [...overrides.entries()].sort(([leftPath], [rightPath]) =>\n leftPath.localeCompare(rightPath)\n );\n};\n\nexport const prepareCloneData = async (\n originalData: Record<string, unknown>,\n submittedData: Record<string, unknown> | undefined,\n contentType: Schema.ContentType,\n getModel: (uid: string) => Schema.Schema\n) => {\n const submitted = submittedData ?? {};\n const relationOperationOverrides = await collectRelationOperationOverrides(\n submitted,\n contentType,\n getModel\n );\n let data = merge(originalData, submitted) as Record<string, unknown>;\n const relationsToCopy: string[] = [];\n\n for (const [attributeName, attribute] of Object.entries(contentType.attributes)) {\n if (!isRelationAttribute(attribute) || !canTransformRelationOperationPayload(attribute)) {\n continue;\n }\n\n const relationWasSubmitted = Object.prototype.hasOwnProperty.call(submitted, attributeName);\n const submittedValue = submitted[attributeName];\n const isOperationPayload = isRelationOperationPayload(submittedValue);\n const hasMeaningfulOperations =\n isOperationPayload && hasMeaningfulRelationOperations(submittedValue);\n\n const relationIsUnchanged =\n !relationWasSubmitted || (isOperationPayload && !hasMeaningfulOperations);\n\n if (\n relationIsUnchanged &&\n isBidirectionalOneToOne(attribute) &&\n hasPopulatedRelation(originalData[attributeName])\n ) {\n // Normal relation attachment enforces oneToOne ownership by removing the source link.\n // Leave unchanged relations out of create and copy their join row after the clone exists.\n delete data[attributeName];\n relationsToCopy.push(attributeName);\n }\n }\n\n for (const [path, value] of relationOperationOverrides) {\n data = set(path, value, data) as Record<string, unknown>;\n }\n\n return { data, relationsToCopy };\n};\n\nexport const copyCloneRelationRows = async (\n strapi: Core.Strapi,\n uid: UID.ContentType,\n sourceEntryId: number,\n targetEntryId: number,\n attributeNames: string[]\n) => {\n if (attributeNames.length === 0) {\n return;\n }\n\n const { attributes } = strapi.db.metadata.get(uid);\n const idColumn = strapi.db.metadata.identifiers.ID_COLUMN;\n const batchSize = strapi.db.dialect.getBatchInsertSize();\n\n await strapi.db.transaction(async ({ trx }) => {\n for (const attributeName of attributeNames) {\n const attribute = attributes[attributeName];\n\n if (attribute?.type !== 'relation' || !('joinTable' in attribute) || !attribute.joinTable) {\n continue;\n }\n\n const { joinTable } = attribute;\n const { joinColumn } = joinTable;\n const rows = (await strapi.db\n .connection(joinTable.name)\n .where({\n [joinColumn.name]: sourceEntryId,\n ...(('on' in joinTable && joinTable.on) || {}),\n })\n .select('*')\n .transacting(trx)) as Record<string, unknown>[];\n\n const rowsToCopy = rows.map((row) => {\n const copiedRow = { ...row, [joinColumn.name]: targetEntryId };\n delete copiedRow[idColumn];\n return copiedRow;\n });\n\n for (let index = 0; index < rowsToCopy.length; index += batchSize) {\n await strapi.db\n .connection(joinTable.name)\n .insert(rowsToCopy.slice(index, index + batchSize))\n .transacting(trx);\n }\n }\n });\n};\n"],"names":["RELATION_OPERATIONS","isRecord","value","Array","isArray","isRelationAttribute","attribute","type","relation","isRelationOperationPayload","some","operation","Object","prototype","hasOwnProperty","call","hasMeaningfulRelationOperations","operationValue","length","canTransformRelationOperationPayload","useJoinTable","isBidirectionalOneToOne","inversedBy","mappedBy","targetAttribute","inverseAttribute","hasPopulatedRelation","collectRelationOperationOverrides","submittedData","contentType","getModel","overrides","Map","traverseEntityRelations","path","set","rawWithIndices","schema","entries","sort","leftPath","rightPath","localeCompare","prepareCloneData","originalData","submitted","relationOperationOverrides","data","merge","relationsToCopy","attributeName","attributes","relationWasSubmitted","submittedValue","isOperationPayload","hasMeaningfulOperations","relationIsUnchanged","push","copyCloneRelationRows","strapi","uid","sourceEntryId","targetEntryId","attributeNames","db","metadata","get","idColumn","identifiers","ID_COLUMN","batchSize","dialect","getBatchInsertSize","transaction","trx","joinTable","joinColumn","rows","connection","name","where","on","select","transacting","rowsToCopy","map","row","copiedRow","index","insert","slice"],"mappings":"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"}
1
+ {"version":3,"file":"clone-relations.js","sources":["../../../../src/services/document-service/utils/clone-relations.ts"],"sourcesContent":["import { merge, set } from 'lodash/fp';\n\nimport type { Core, Schema, UID } from '@strapi/types';\nimport type { traverseEntity } from '@strapi/utils';\nimport { traverseEntityRelations } from '../transform/relations/utils/map-relation';\n\nconst RELATION_OPERATIONS = ['connect', 'disconnect', 'set'] as const;\ntype TraversableData = Parameters<typeof traverseEntity>[2];\n\ntype CloneRelationAttribute = Schema.Attribute.Relation & {\n targetAttribute?: string;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n};\n\nconst isRelationAttribute = (attribute: unknown): attribute is CloneRelationAttribute => {\n return (\n isRecord(attribute) && attribute.type === 'relation' && typeof attribute.relation === 'string'\n );\n};\n\nconst isRelationOperationPayload = (value: unknown): value is Record<string, unknown> => {\n return (\n isRecord(value) &&\n RELATION_OPERATIONS.some((operation) => Object.prototype.hasOwnProperty.call(value, operation))\n );\n};\n\nconst hasMeaningfulRelationOperations = (value: Record<string, unknown>) => {\n if (Object.prototype.hasOwnProperty.call(value, 'set')) {\n return true;\n }\n\n return ['connect', 'disconnect'].some((operation) => {\n const operationValue = value[operation];\n return Array.isArray(operationValue) ? operationValue.length > 0 : operationValue != null;\n });\n};\n\nconst canTransformRelationOperationPayload = (attribute: Schema.Attribute.Relation) => {\n return attribute.useJoinTable !== false && attribute.relation !== 'morphToOne';\n};\n\nconst isBidirectionalOneToOne = (attribute: CloneRelationAttribute) => {\n return (\n attribute.relation === 'oneToOne' &&\n [attribute.inversedBy, attribute.mappedBy, attribute.targetAttribute].some(\n (inverseAttribute) => inverseAttribute != null\n )\n );\n};\n\nconst hasPopulatedRelation = (value: unknown) => {\n return isRecord(value) && ('id' in value || 'documentId' in value);\n};\n\nconst collectRelationOperationOverrides = async (\n submittedData: Record<string, unknown>,\n contentType: Schema.ContentType,\n getModel: (uid: string) => Schema.Schema\n) => {\n const overrides = new Map<string, Record<string, unknown>>();\n\n await traverseEntityRelations(\n ({ path, value }) => {\n if (isRelationOperationPayload(value) && hasMeaningfulRelationOperations(value)) {\n overrides.set(path.rawWithIndices!, value);\n }\n },\n { schema: contentType, getModel },\n submittedData as TraversableData\n );\n\n return [...overrides.entries()].sort(([leftPath], [rightPath]) =>\n leftPath.localeCompare(rightPath)\n );\n};\n\nexport const prepareCloneData = async (\n originalData: Record<string, unknown>,\n submittedData: Record<string, unknown> | undefined,\n contentType: Schema.ContentType,\n getModel: (uid: string) => Schema.Schema\n) => {\n const submitted = submittedData ?? {};\n const relationOperationOverrides = await collectRelationOperationOverrides(\n submitted,\n contentType,\n getModel\n );\n let data = merge(originalData, submitted) as Record<string, unknown>;\n const relationsToCopy: string[] = [];\n\n for (const [attributeName, attribute] of Object.entries(contentType.attributes)) {\n if (!isRelationAttribute(attribute) || !canTransformRelationOperationPayload(attribute)) {\n continue;\n }\n\n const relationWasSubmitted = Object.prototype.hasOwnProperty.call(submitted, attributeName);\n const submittedValue = submitted[attributeName];\n const isOperationPayload = isRelationOperationPayload(submittedValue);\n const hasMeaningfulOperations =\n isOperationPayload && hasMeaningfulRelationOperations(submittedValue);\n\n const relationIsUnchanged =\n !relationWasSubmitted || (isOperationPayload && !hasMeaningfulOperations);\n\n if (\n relationIsUnchanged &&\n isBidirectionalOneToOne(attribute) &&\n hasPopulatedRelation(originalData[attributeName])\n ) {\n // Normal relation attachment enforces oneToOne ownership by removing the source link.\n // Leave unchanged relations out of create and copy their join row after the clone exists.\n delete data[attributeName];\n relationsToCopy.push(attributeName);\n }\n }\n\n for (const [path, value] of relationOperationOverrides) {\n data = set(path, value, data) as Record<string, unknown>;\n }\n\n return { data, relationsToCopy };\n};\n\nexport const copyCloneRelationRows = async (\n strapi: Core.Strapi,\n uid: UID.ContentType,\n sourceEntryId: number,\n targetEntryId: number,\n attributeNames: string[]\n) => {\n if (attributeNames.length === 0) {\n return;\n }\n\n const { attributes } = strapi.db.metadata.get(uid);\n const idColumn = strapi.db.metadata.identifiers.ID_COLUMN;\n const batchSize = strapi.db.dialect.getBatchInsertSize();\n\n await strapi.db.transaction(async ({ trx }) => {\n for (const attributeName of attributeNames) {\n const attribute = attributes[attributeName];\n\n if (attribute?.type !== 'relation' || !('joinTable' in attribute) || !attribute.joinTable) {\n continue;\n }\n\n const { joinTable } = attribute;\n const { joinColumn } = joinTable;\n const rows = (await strapi.db\n .connection(joinTable.name)\n .where({\n [joinColumn.name]: sourceEntryId,\n ...(('on' in joinTable && joinTable.on) || undefined),\n })\n .select('*')\n .transacting(trx)) as Record<string, unknown>[];\n\n const rowsToCopy = rows.map((row) => {\n const copiedRow = { ...row, [joinColumn.name]: targetEntryId };\n delete copiedRow[idColumn];\n return copiedRow;\n });\n\n for (let index = 0; index < rowsToCopy.length; index += batchSize) {\n await strapi.db\n .connection(joinTable.name)\n .insert(rowsToCopy.slice(index, index + batchSize))\n .transacting(trx);\n }\n }\n });\n};\n"],"names":["RELATION_OPERATIONS","isRecord","value","Array","isArray","isRelationAttribute","attribute","type","relation","isRelationOperationPayload","some","operation","Object","prototype","hasOwnProperty","call","hasMeaningfulRelationOperations","operationValue","length","canTransformRelationOperationPayload","useJoinTable","isBidirectionalOneToOne","inversedBy","mappedBy","targetAttribute","inverseAttribute","hasPopulatedRelation","collectRelationOperationOverrides","submittedData","contentType","getModel","overrides","Map","traverseEntityRelations","path","set","rawWithIndices","schema","entries","sort","leftPath","rightPath","localeCompare","prepareCloneData","originalData","submitted","relationOperationOverrides","data","merge","relationsToCopy","attributeName","attributes","relationWasSubmitted","submittedValue","isOperationPayload","hasMeaningfulOperations","relationIsUnchanged","push","copyCloneRelationRows","strapi","uid","sourceEntryId","targetEntryId","attributeNames","db","metadata","get","idColumn","identifiers","ID_COLUMN","batchSize","dialect","getBatchInsertSize","transaction","trx","joinTable","joinColumn","rows","connection","name","where","on","undefined","select","transacting","rowsToCopy","map","row","copiedRow","index","insert","slice"],"mappings":"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"}
@@ -100,7 +100,7 @@ const copyCloneRelationRows = async (strapi, uid, sourceEntryId, targetEntryId,
100
100
  const { joinColumn } = joinTable;
101
101
  const rows = await strapi.db.connection(joinTable.name).where({
102
102
  [joinColumn.name]: sourceEntryId,
103
- ...'on' in joinTable && joinTable.on || {}
103
+ ...'on' in joinTable && joinTable.on || undefined
104
104
  }).select('*').transacting(trx);
105
105
  const rowsToCopy = rows.map((row)=>{
106
106
  const copiedRow = {