@strapi/core 0.0.0-experimental.a1da9b829e36a866a425439d22ab6f484b547d9f → 0.0.0-experimental.a1edcc9d9fab426bad8fd1a111e6d06cb07849be

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.

Potentially problematic release.


This version of @strapi/core might be problematic. Click here for more details.

Files changed (183) hide show
  1. package/dist/Strapi.d.ts +1 -0
  2. package/dist/Strapi.d.ts.map +1 -1
  3. package/dist/Strapi.js +20 -4
  4. package/dist/Strapi.js.map +1 -1
  5. package/dist/Strapi.mjs +20 -4
  6. package/dist/Strapi.mjs.map +1 -1
  7. package/dist/configuration/config-loader.js.map +1 -1
  8. package/dist/configuration/config-loader.mjs.map +1 -1
  9. package/dist/configuration/urls.js.map +1 -1
  10. package/dist/configuration/urls.mjs.map +1 -1
  11. package/dist/constants.d.ts +3 -0
  12. package/dist/constants.d.ts.map +1 -0
  13. package/dist/constants.js +6 -0
  14. package/dist/constants.js.map +1 -0
  15. package/dist/constants.mjs +4 -0
  16. package/dist/constants.mjs.map +1 -0
  17. package/dist/container.js.map +1 -1
  18. package/dist/container.mjs.map +1 -1
  19. package/dist/core-api/routes/index.js.map +1 -1
  20. package/dist/core-api/routes/index.mjs.map +1 -1
  21. package/dist/core-api/routes/validation/mappers.d.ts.map +1 -1
  22. package/dist/core-api/routes/validation/mappers.js +35 -0
  23. package/dist/core-api/routes/validation/mappers.js.map +1 -1
  24. package/dist/core-api/routes/validation/mappers.mjs +35 -0
  25. package/dist/core-api/routes/validation/mappers.mjs.map +1 -1
  26. package/dist/core-api/routes/validation/utils.js.map +1 -1
  27. package/dist/core-api/routes/validation/utils.mjs.map +1 -1
  28. package/dist/core-api/service/collection-type.js.map +1 -1
  29. package/dist/core-api/service/collection-type.mjs.map +1 -1
  30. package/dist/core-api/service/single-type.js.map +1 -1
  31. package/dist/core-api/service/single-type.mjs.map +1 -1
  32. package/dist/domain/content-type/index.js.map +1 -1
  33. package/dist/domain/content-type/index.mjs.map +1 -1
  34. package/dist/domain/module/index.js.map +1 -1
  35. package/dist/domain/module/index.mjs.map +1 -1
  36. package/dist/ee/index.js.map +1 -1
  37. package/dist/ee/index.mjs.map +1 -1
  38. package/dist/ee/license.js +1 -2
  39. package/dist/ee/license.js.map +1 -1
  40. package/dist/ee/license.mjs +1 -2
  41. package/dist/ee/license.mjs.map +1 -1
  42. package/dist/loaders/apis.js.map +1 -1
  43. package/dist/loaders/apis.mjs.map +1 -1
  44. package/dist/loaders/components.js.map +1 -1
  45. package/dist/loaders/components.mjs.map +1 -1
  46. package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
  47. package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
  48. package/dist/loaders/plugins/index.js +1 -1
  49. package/dist/loaders/plugins/index.js.map +1 -1
  50. package/dist/loaders/plugins/index.mjs +1 -1
  51. package/dist/loaders/plugins/index.mjs.map +1 -1
  52. package/dist/loaders/src-index.js.map +1 -1
  53. package/dist/loaders/src-index.mjs.map +1 -1
  54. package/dist/middlewares/logger.js.map +1 -1
  55. package/dist/middlewares/logger.mjs.map +1 -1
  56. package/dist/middlewares/response-time.js.map +1 -1
  57. package/dist/middlewares/response-time.mjs.map +1 -1
  58. package/dist/middlewares/security.d.ts.map +1 -1
  59. package/dist/middlewares/security.js +2 -15
  60. package/dist/middlewares/security.js.map +1 -1
  61. package/dist/middlewares/security.mjs +2 -15
  62. package/dist/middlewares/security.mjs.map +1 -1
  63. package/dist/migrations/database/5.0.0-discard-drafts.d.ts +21 -7
  64. package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
  65. package/dist/migrations/database/5.0.0-discard-drafts.js +1501 -58
  66. package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
  67. package/dist/migrations/database/5.0.0-discard-drafts.mjs +1502 -59
  68. package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
  69. package/dist/migrations/first-published-at.js.map +1 -1
  70. package/dist/migrations/first-published-at.mjs.map +1 -1
  71. package/dist/package.json.js +13 -12
  72. package/dist/package.json.js.map +1 -1
  73. package/dist/package.json.mjs +13 -12
  74. package/dist/package.json.mjs.map +1 -1
  75. package/dist/providers/index.d.ts.map +1 -1
  76. package/dist/providers/index.js +2 -0
  77. package/dist/providers/index.js.map +1 -1
  78. package/dist/providers/index.mjs +2 -0
  79. package/dist/providers/index.mjs.map +1 -1
  80. package/dist/providers/session-manager.d.ts +3 -0
  81. package/dist/providers/session-manager.d.ts.map +1 -0
  82. package/dist/providers/session-manager.js +23 -0
  83. package/dist/providers/session-manager.js.map +1 -0
  84. package/dist/providers/session-manager.mjs +21 -0
  85. package/dist/providers/session-manager.mjs.map +1 -0
  86. package/dist/registries/apis.js.map +1 -1
  87. package/dist/registries/apis.mjs.map +1 -1
  88. package/dist/registries/custom-fields.js.map +1 -1
  89. package/dist/registries/custom-fields.mjs.map +1 -1
  90. package/dist/registries/namespace.js.map +1 -1
  91. package/dist/registries/namespace.mjs.map +1 -1
  92. package/dist/registries/plugins.js.map +1 -1
  93. package/dist/registries/plugins.mjs.map +1 -1
  94. package/dist/registries/policies.js.map +1 -1
  95. package/dist/registries/policies.mjs.map +1 -1
  96. package/dist/services/config.js.map +1 -1
  97. package/dist/services/config.mjs.map +1 -1
  98. package/dist/services/content-api/index.js.map +1 -1
  99. package/dist/services/content-api/index.mjs.map +1 -1
  100. package/dist/services/content-api/permissions/index.js.map +1 -1
  101. package/dist/services/content-api/permissions/index.mjs.map +1 -1
  102. package/dist/services/content-source-maps.d.ts +2 -1
  103. package/dist/services/content-source-maps.d.ts.map +1 -1
  104. package/dist/services/content-source-maps.js +29 -7
  105. package/dist/services/content-source-maps.js.map +1 -1
  106. package/dist/services/content-source-maps.mjs +29 -7
  107. package/dist/services/content-source-maps.mjs.map +1 -1
  108. package/dist/services/core-store.js.map +1 -1
  109. package/dist/services/core-store.mjs.map +1 -1
  110. package/dist/services/document-service/components.d.ts +26 -1
  111. package/dist/services/document-service/components.d.ts.map +1 -1
  112. package/dist/services/document-service/components.js +16 -4
  113. package/dist/services/document-service/components.js.map +1 -1
  114. package/dist/services/document-service/components.mjs +15 -5
  115. package/dist/services/document-service/components.mjs.map +1 -1
  116. package/dist/services/document-service/repository.js +1 -1
  117. package/dist/services/document-service/repository.js.map +1 -1
  118. package/dist/services/document-service/repository.mjs +1 -1
  119. package/dist/services/document-service/repository.mjs.map +1 -1
  120. package/dist/services/document-service/transform/fields.js.map +1 -1
  121. package/dist/services/document-service/transform/fields.mjs.map +1 -1
  122. package/dist/services/document-service/transform/id-map.js.map +1 -1
  123. package/dist/services/document-service/transform/id-map.mjs.map +1 -1
  124. package/dist/services/document-service/utils/clean-component-join-table.d.ts +7 -0
  125. package/dist/services/document-service/utils/clean-component-join-table.d.ts.map +1 -0
  126. package/dist/services/document-service/utils/clean-component-join-table.js +145 -0
  127. package/dist/services/document-service/utils/clean-component-join-table.js.map +1 -0
  128. package/dist/services/document-service/utils/clean-component-join-table.mjs +143 -0
  129. package/dist/services/document-service/utils/clean-component-join-table.mjs.map +1 -0
  130. package/dist/services/entity-service/index.js.map +1 -1
  131. package/dist/services/entity-service/index.mjs.map +1 -1
  132. package/dist/services/entity-validator/blocks-validator.js.map +1 -1
  133. package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
  134. package/dist/services/entity-validator/index.js.map +1 -1
  135. package/dist/services/entity-validator/index.mjs.map +1 -1
  136. package/dist/services/metrics/index.js +2 -1
  137. package/dist/services/metrics/index.js.map +1 -1
  138. package/dist/services/metrics/index.mjs +2 -1
  139. package/dist/services/metrics/index.mjs.map +1 -1
  140. package/dist/services/metrics/middleware.d.ts +2 -1
  141. package/dist/services/metrics/middleware.d.ts.map +1 -1
  142. package/dist/services/metrics/middleware.js +2 -2
  143. package/dist/services/metrics/middleware.js.map +1 -1
  144. package/dist/services/metrics/middleware.mjs +2 -2
  145. package/dist/services/metrics/middleware.mjs.map +1 -1
  146. package/dist/services/metrics/sender.d.ts.map +1 -1
  147. package/dist/services/metrics/sender.js +2 -1
  148. package/dist/services/metrics/sender.js.map +1 -1
  149. package/dist/services/metrics/sender.mjs +2 -1
  150. package/dist/services/metrics/sender.mjs.map +1 -1
  151. package/dist/services/server/compose-endpoint.js.map +1 -1
  152. package/dist/services/server/compose-endpoint.mjs.map +1 -1
  153. package/dist/services/server/index.js.map +1 -1
  154. package/dist/services/server/index.mjs.map +1 -1
  155. package/dist/services/server/middleware.js.map +1 -1
  156. package/dist/services/server/middleware.mjs.map +1 -1
  157. package/dist/services/server/register-routes.js.map +1 -1
  158. package/dist/services/server/register-routes.mjs.map +1 -1
  159. package/dist/services/server/routing.js.map +1 -1
  160. package/dist/services/server/routing.mjs.map +1 -1
  161. package/dist/services/session-manager.d.ts +167 -0
  162. package/dist/services/session-manager.d.ts.map +1 -0
  163. package/dist/services/session-manager.js +529 -0
  164. package/dist/services/session-manager.js.map +1 -0
  165. package/dist/services/session-manager.mjs +526 -0
  166. package/dist/services/session-manager.mjs.map +1 -0
  167. package/dist/services/webhook-runner.js +2 -2
  168. package/dist/services/webhook-runner.js.map +1 -1
  169. package/dist/services/webhook-runner.mjs +2 -2
  170. package/dist/services/webhook-runner.mjs.map +1 -1
  171. package/dist/services/worker-queue.js +2 -2
  172. package/dist/services/worker-queue.js.map +1 -1
  173. package/dist/services/worker-queue.mjs +2 -2
  174. package/dist/services/worker-queue.mjs.map +1 -1
  175. package/dist/utils/fetch.js.map +1 -1
  176. package/dist/utils/fetch.mjs.map +1 -1
  177. package/dist/utils/filepath-to-prop-path.js.map +1 -1
  178. package/dist/utils/filepath-to-prop-path.mjs.map +1 -1
  179. package/dist/utils/load-config-file.js.map +1 -1
  180. package/dist/utils/load-config-file.mjs.map +1 -1
  181. package/dist/utils/startup-logger.js.map +1 -1
  182. package/dist/utils/startup-logger.mjs.map +1 -1
  183. package/package.json +13 -12
@@ -1 +1 @@
1
- {"version":3,"file":"id-map.mjs","sources":["../../../../src/services/document-service/transform/id-map.ts"],"sourcesContent":["import type { Core, Data, UID } from '@strapi/types';\nimport { async, contentTypes } from '@strapi/utils';\n\nconst hasDraftAndPublish = (uid: UID.CollectionType) => {\n const model = strapi.getModel(uid);\n return contentTypes.hasDraftAndPublish(model);\n};\n\n/**\n * TODO: Find a better way to encode keys than this\n * This converts an object into a string by joining its keys and values,\n * so it can be used as a key in a Map.\n *\n * @example\n * const obj = { a: 1, b: 2 };\n * const key = encodeKey(obj);\n * ^ \"a:::1&&b:::2\"\n */\nconst encodeKey = (obj: any) => {\n // Ignore status field for models without draft and publish\n if (!hasDraftAndPublish(obj.uid)) {\n delete obj.status;\n }\n\n // Sort keys to always keep the same order when encoding\n const keys = Object.keys(obj).sort();\n return keys.map((key) => `${key}:::${obj[key]}`).join('&&');\n};\n\ninterface KeyFields {\n uid: string;\n documentId: Data.ID;\n locale?: string | null;\n status?: 'draft' | 'published';\n}\n\nexport interface IdMap {\n loadedIds: Map<string, string>;\n toLoadIds: Map<string, KeyFields>;\n // Make the Keys type to be the params of add\n add(keys: KeyFields): void;\n load(): Promise<void>;\n get(keys: KeyFields): string | undefined;\n clear(): void;\n}\n\n/**\n * Holds a registry of document ids and their corresponding entity ids.\n */\nconst createIdMap = ({ strapi }: { strapi: Core.Strapi }): IdMap => {\n const loadedIds = new Map();\n const toLoadIds = new Map();\n\n return {\n loadedIds,\n toLoadIds,\n /**\n * Register a new document id and its corresponding entity id.\n */\n add(keyFields: KeyFields) {\n const key = encodeKey({ status: 'published', locale: null, ...keyFields });\n\n // If the id is already loaded, do nothing\n if (loadedIds.has(key)) return;\n // If the id is already in the toLoadIds, do nothing\n if (toLoadIds.has(key)) return;\n\n // Add the id to the toLoadIds\n toLoadIds.set(key, keyFields);\n },\n\n /**\n * Load all ids from the registry.\n */\n async load() {\n // Document Id to Entry Id queries are batched by its uid and locale\n // TODO: Add publication state too\n const loadIdValues = Array.from(toLoadIds.values());\n\n // 1. Group ids to query together\n const idsByUidAndLocale = loadIdValues.reduce((acc, { documentId, ...rest }) => {\n const key = encodeKey(rest);\n const ids = acc[key] || { ...rest, documentIds: [] };\n ids.documentIds.push(documentId);\n return { ...acc, [key]: ids };\n }, {});\n\n // 2. Query ids\n await async.map(\n Object.values(idsByUidAndLocale),\n async ({ uid, locale, documentIds, status }: any) => {\n const findParams = {\n select: ['id', 'documentId', 'locale', 'publishedAt'],\n where: {\n documentId: { $in: documentIds },\n locale: locale || null,\n },\n } as any;\n\n if (hasDraftAndPublish(uid)) {\n findParams.where.publishedAt = status === 'draft' ? null : { $ne: null };\n }\n\n const result = await strapi?.db?.query(uid).findMany(findParams);\n\n // 3. Store result in loadedIds\n result?.forEach(({ documentId, id, locale, publishedAt }: any) => {\n const key = encodeKey({\n documentId,\n uid,\n locale,\n status: publishedAt ? 'published' : 'draft',\n });\n loadedIds.set(key, id);\n });\n }\n );\n\n // 4. Clear toLoadIds\n toLoadIds.clear();\n },\n\n /**\n * Get the entity id for a given document id.\n */\n get(keys: KeyFields) {\n const key = encodeKey({ status: 'published', locale: null, ...keys });\n return loadedIds.get(key);\n },\n\n /**\n * Clear the registry.\n */\n clear() {\n loadedIds.clear();\n toLoadIds.clear();\n },\n };\n};\n\nexport { createIdMap };\n"],"names":["hasDraftAndPublish","uid","model","strapi","getModel","contentTypes","encodeKey","obj","status","keys","Object","sort","map","key","join","createIdMap","loadedIds","Map","toLoadIds","add","keyFields","locale","has","set","load","loadIdValues","Array","from","values","idsByUidAndLocale","reduce","acc","documentId","rest","ids","documentIds","push","async","findParams","select","where","$in","publishedAt","$ne","result","db","query","findMany","forEach","id","clear","get"],"mappings":"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"}
1
+ {"version":3,"file":"id-map.mjs","sources":["../../../../src/services/document-service/transform/id-map.ts"],"sourcesContent":["import type { Core, Data, UID } from '@strapi/types';\nimport { async, contentTypes } from '@strapi/utils';\n\nconst hasDraftAndPublish = (uid: UID.CollectionType) => {\n const model = strapi.getModel(uid);\n return contentTypes.hasDraftAndPublish(model);\n};\n\n/**\n * TODO: Find a better way to encode keys than this\n * This converts an object into a string by joining its keys and values,\n * so it can be used as a key in a Map.\n *\n * @example\n * const obj = { a: 1, b: 2 };\n * const key = encodeKey(obj);\n * ^ \"a:::1&&b:::2\"\n */\nconst encodeKey = (obj: any) => {\n // Ignore status field for models without draft and publish\n if (!hasDraftAndPublish(obj.uid)) {\n delete obj.status;\n }\n\n // Sort keys to always keep the same order when encoding\n const keys = Object.keys(obj).sort();\n return keys.map((key) => `${key}:::${obj[key]}`).join('&&');\n};\n\ninterface KeyFields {\n uid: string;\n documentId: Data.ID;\n locale?: string | null;\n status?: 'draft' | 'published';\n}\n\nexport interface IdMap {\n loadedIds: Map<string, string>;\n toLoadIds: Map<string, KeyFields>;\n // Make the Keys type to be the params of add\n add(keys: KeyFields): void;\n load(): Promise<void>;\n get(keys: KeyFields): string | undefined;\n clear(): void;\n}\n\n/**\n * Holds a registry of document ids and their corresponding entity ids.\n */\nconst createIdMap = ({ strapi }: { strapi: Core.Strapi }): IdMap => {\n const loadedIds = new Map();\n const toLoadIds = new Map();\n\n return {\n loadedIds,\n toLoadIds,\n /**\n * Register a new document id and its corresponding entity id.\n */\n add(keyFields: KeyFields) {\n const key = encodeKey({ status: 'published', locale: null, ...keyFields });\n\n // If the id is already loaded, do nothing\n if (loadedIds.has(key)) return;\n // If the id is already in the toLoadIds, do nothing\n if (toLoadIds.has(key)) return;\n\n // Add the id to the toLoadIds\n toLoadIds.set(key, keyFields);\n },\n\n /**\n * Load all ids from the registry.\n */\n async load() {\n // Document Id to Entry Id queries are batched by its uid and locale\n // TODO: Add publication state too\n const loadIdValues = Array.from(toLoadIds.values());\n\n // 1. Group ids to query together\n const idsByUidAndLocale = loadIdValues.reduce((acc, { documentId, ...rest }) => {\n const key = encodeKey(rest);\n const ids = acc[key] || { ...rest, documentIds: [] };\n ids.documentIds.push(documentId);\n return { ...acc, [key]: ids };\n }, {});\n\n // 2. Query ids\n await async.map(\n Object.values(idsByUidAndLocale),\n async ({ uid, locale, documentIds, status }: any) => {\n const findParams = {\n select: ['id', 'documentId', 'locale', 'publishedAt'],\n where: {\n documentId: { $in: documentIds },\n locale: locale || null,\n },\n } as any;\n\n if (hasDraftAndPublish(uid)) {\n findParams.where.publishedAt = status === 'draft' ? null : { $ne: null };\n }\n\n const result = await strapi?.db?.query(uid).findMany(findParams);\n\n // 3. Store result in loadedIds\n result?.forEach(({ documentId, id, locale, publishedAt }: any) => {\n const key = encodeKey({\n documentId,\n uid,\n locale,\n status: publishedAt ? 'published' : 'draft',\n });\n loadedIds.set(key, id);\n });\n }\n );\n\n // 4. Clear toLoadIds\n toLoadIds.clear();\n },\n\n /**\n * Get the entity id for a given document id.\n */\n get(keys: KeyFields) {\n const key = encodeKey({ status: 'published', locale: null, ...keys });\n return loadedIds.get(key);\n },\n\n /**\n * Clear the registry.\n */\n clear() {\n loadedIds.clear();\n toLoadIds.clear();\n },\n };\n};\n\nexport { createIdMap };\n"],"names":["hasDraftAndPublish","uid","model","strapi","getModel","contentTypes","encodeKey","obj","status","keys","Object","sort","map","key","join","createIdMap","loadedIds","Map","toLoadIds","add","keyFields","locale","has","set","load","loadIdValues","Array","from","values","idsByUidAndLocale","reduce","acc","documentId","rest","ids","documentIds","push","async","findParams","select","where","$in","publishedAt","$ne","result","db","query","findMany","forEach","id","clear","get"],"mappings":";;AAGA,MAAMA,qBAAqB,CAACC,GAAAA,GAAAA;IAC1B,MAAMC,KAAAA,GAAQC,MAAOC,CAAAA,QAAQ,CAACH,GAAAA,CAAAA;IAC9B,OAAOI,YAAAA,CAAaL,kBAAkB,CAACE,KAAAA,CAAAA;AACzC,CAAA;AAEA;;;;;;;;;IAUA,MAAMI,YAAY,CAACC,GAAAA,GAAAA;;AAEjB,IAAA,IAAI,CAACP,kBAAAA,CAAmBO,GAAIN,CAAAA,GAAG,CAAG,EAAA;AAChC,QAAA,OAAOM,IAAIC,MAAM;AACnB;;AAGA,IAAA,MAAMC,IAAOC,GAAAA,MAAAA,CAAOD,IAAI,CAACF,KAAKI,IAAI,EAAA;AAClC,IAAA,OAAOF,IAAKG,CAAAA,GAAG,CAAC,CAACC,MAAQ,CAAGA,EAAAA,GAAAA,CAAI,GAAG,EAAEN,GAAG,CAACM,GAAAA,CAAI,CAAE,CAAA,CAAA,CAAEC,IAAI,CAAC,IAAA,CAAA;AACxD,CAAA;AAmBA;;AAEC,UACKC,WAAc,GAAA,CAAC,EAAEZ,MAAAA,EAAAA,OAAM,EAA2B,GAAA;AACtD,IAAA,MAAMa,YAAY,IAAIC,GAAAA,EAAAA;AACtB,IAAA,MAAMC,YAAY,IAAID,GAAAA,EAAAA;IAEtB,OAAO;AACLD,QAAAA,SAAAA;AACAE,QAAAA,SAAAA;AACA;;AAEC,QACDC,KAAIC,SAAoB,EAAA;AACtB,YAAA,MAAMP,MAAMP,SAAU,CAAA;gBAAEE,MAAQ,EAAA,WAAA;gBAAaa,MAAQ,EAAA,IAAA;AAAM,gBAAA,GAAGD;AAAU,aAAA,CAAA;;YAGxE,IAAIJ,SAAAA,CAAUM,GAAG,CAACT,GAAM,CAAA,EAAA;;YAExB,IAAIK,SAAAA,CAAUI,GAAG,CAACT,GAAM,CAAA,EAAA;;YAGxBK,SAAUK,CAAAA,GAAG,CAACV,GAAKO,EAAAA,SAAAA,CAAAA;AACrB,SAAA;AAEA;;AAEC,QACD,MAAMI,IAAAA,CAAAA,GAAAA;;;AAGJ,YAAA,MAAMC,YAAeC,GAAAA,KAAAA,CAAMC,IAAI,CAACT,UAAUU,MAAM,EAAA,CAAA;;YAGhD,MAAMC,iBAAAA,GAAoBJ,YAAaK,CAAAA,MAAM,CAAC,CAACC,KAAK,EAAEC,UAAU,EAAE,GAAGC,IAAM,EAAA,GAAA;AACzE,gBAAA,MAAMpB,MAAMP,SAAU2B,CAAAA,IAAAA,CAAAA;AACtB,gBAAA,MAAMC,GAAMH,GAAAA,GAAG,CAAClB,GAAAA,CAAI,IAAI;AAAE,oBAAA,GAAGoB,IAAI;AAAEE,oBAAAA,WAAAA,EAAa;AAAG,iBAAA;gBACnDD,GAAIC,CAAAA,WAAW,CAACC,IAAI,CAACJ,UAAAA,CAAAA;gBACrB,OAAO;AAAE,oBAAA,GAAGD,GAAG;AAAE,oBAAA,CAAClB,MAAMqB;AAAI,iBAAA;AAC9B,aAAA,EAAG,EAAC,CAAA;;AAGJ,YAAA,MAAMG,MAAMzB,GAAG,CACbF,MAAOkB,CAAAA,MAAM,CAACC,iBACd,CAAA,EAAA,OAAO,EAAE5B,GAAG,EAAEoB,MAAM,EAAEc,WAAW,EAAE3B,MAAM,EAAO,GAAA;AAC9C,gBAAA,MAAM8B,UAAa,GAAA;oBACjBC,MAAQ,EAAA;AAAC,wBAAA,IAAA;AAAM,wBAAA,YAAA;AAAc,wBAAA,QAAA;AAAU,wBAAA;AAAc,qBAAA;oBACrDC,KAAO,EAAA;wBACLR,UAAY,EAAA;4BAAES,GAAKN,EAAAA;AAAY,yBAAA;AAC/Bd,wBAAAA,MAAAA,EAAQA,MAAU,IAAA;AACpB;AACF,iBAAA;AAEA,gBAAA,IAAIrB,mBAAmBC,GAAM,CAAA,EAAA;AAC3BqC,oBAAAA,UAAAA,CAAWE,KAAK,CAACE,WAAW,GAAGlC,MAAAA,KAAW,UAAU,IAAO,GAAA;wBAAEmC,GAAK,EAAA;AAAK,qBAAA;AACzE;AAEA,gBAAA,MAAMC,SAAS,MAAMzC,OAAAA,EAAQ0C,EAAIC,EAAAA,KAAAA,CAAM7C,KAAK8C,QAAST,CAAAA,UAAAA,CAAAA;;gBAGrDM,MAAQI,EAAAA,OAAAA,CAAQ,CAAC,EAAEhB,UAAU,EAAEiB,EAAE,EAAE5B,MAAM,EAAEqB,WAAW,EAAO,GAAA;AAC3D,oBAAA,MAAM7B,MAAMP,SAAU,CAAA;AACpB0B,wBAAAA,UAAAA;AACA/B,wBAAAA,GAAAA;AACAoB,wBAAAA,MAAAA;AACAb,wBAAAA,MAAAA,EAAQkC,cAAc,WAAc,GAAA;AACtC,qBAAA,CAAA;oBACA1B,SAAUO,CAAAA,GAAG,CAACV,GAAKoC,EAAAA,EAAAA,CAAAA;AACrB,iBAAA,CAAA;AACF,aAAA,CAAA;;AAIF/B,YAAAA,SAAAA,CAAUgC,KAAK,EAAA;AACjB,SAAA;AAEA;;AAEC,QACDC,KAAI1C,IAAe,EAAA;AACjB,YAAA,MAAMI,MAAMP,SAAU,CAAA;gBAAEE,MAAQ,EAAA,WAAA;gBAAaa,MAAQ,EAAA,IAAA;AAAM,gBAAA,GAAGZ;AAAK,aAAA,CAAA;YACnE,OAAOO,SAAAA,CAAUmC,GAAG,CAACtC,GAAAA,CAAAA;AACvB,SAAA;AAEA;;QAGAqC,KAAAA,CAAAA,GAAAA;AACElC,YAAAA,SAAAA,CAAUkC,KAAK,EAAA;AACfhC,YAAAA,SAAAA,CAAUgC,KAAK,EAAA;AACjB;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,7 @@
1
+ import type { Database } from '@strapi/database';
2
+ /**
3
+ * Cleans ghost relations with publication state mismatches from a join table
4
+ * Uses schema-based draft/publish checking like prevention fix
5
+ */
6
+ export declare const cleanComponentJoinTable: (db: Database, joinTableName: string, relation: any, sourceModel: any) => Promise<number>;
7
+ //# sourceMappingURL=clean-component-join-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean-component-join-table.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/utils/clean-component-join-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,OAC9B,QAAQ,iBACG,MAAM,YACX,GAAG,eACA,GAAG,KACf,QAAQ,MAAM,CAoDhB,CAAC"}
@@ -0,0 +1,145 @@
1
+ 'use strict';
2
+
3
+ var components = require('../components.js');
4
+
5
+ /**
6
+ * Cleans ghost relations with publication state mismatches from a join table
7
+ * Uses schema-based draft/publish checking like prevention fix
8
+ */ const cleanComponentJoinTable = async (db, joinTableName, relation, sourceModel)=>{
9
+ try {
10
+ // Get the target model metadata
11
+ const targetModel = db.metadata.get(relation.target);
12
+ if (!targetModel) {
13
+ db.logger.debug(`Target model ${relation.target} not found, skipping ${joinTableName}`);
14
+ return 0;
15
+ }
16
+ // Check if source supports draft/publish, if it doesnt it should contain duplicate states
17
+ const sourceContentType = strapi.contentTypes[sourceModel.uid];
18
+ // It could be a model, which does not have the draftAndPublish option
19
+ const sourceSupportsDraftPublish = sourceContentType?.options?.draftAndPublish;
20
+ if (sourceContentType && !sourceSupportsDraftPublish) {
21
+ return 0;
22
+ }
23
+ // Check if target supports draft/publish using schema-based approach (like prevention fix)
24
+ const targetContentType = strapi.contentTypes[relation.target];
25
+ const targetSupportsDraftPublish = targetContentType?.options?.draftAndPublish || false;
26
+ if (!targetSupportsDraftPublish) {
27
+ return 0;
28
+ }
29
+ // Find entries with publication state mismatches
30
+ const ghostEntries = await findPublicationStateMismatches(db, joinTableName, relation, targetModel, sourceModel);
31
+ if (ghostEntries.length === 0) {
32
+ return 0;
33
+ }
34
+ // Remove ghost entries
35
+ await db.connection(joinTableName).whereIn('id', ghostEntries).del();
36
+ db.logger.debug(`Removed ${ghostEntries.length} ghost relations with publication state mismatches from ${joinTableName}`);
37
+ return ghostEntries.length;
38
+ } catch (error) {
39
+ const errorMessage = error instanceof Error ? error.message : String(error);
40
+ db.logger.error(`Failed to clean join table "${joinTableName}": ${errorMessage}`);
41
+ return 0;
42
+ }
43
+ };
44
+ const findContentTypeParentForComponentInstance = async (componentSchema, componentId)=>{
45
+ // Get the parent schemas that could contain this component
46
+ const parentSchemas = components.getParentSchemasForComponent(componentSchema);
47
+ if (parentSchemas.length === 0) {
48
+ // No potential parents
49
+ return null;
50
+ }
51
+ // Find the actual parent for THIS specific component instance
52
+ const parent = await components.findComponentParent(componentSchema, componentId, parentSchemas);
53
+ if (!parent) {
54
+ // No parent found for this component instance
55
+ return null;
56
+ }
57
+ if (strapi.components[parent.uid]) {
58
+ // If the parent is a component, we need to check its parents recursively
59
+ const parentComponentSchema = strapi.components[parent.uid];
60
+ return findContentTypeParentForComponentInstance(parentComponentSchema, parent.parentId);
61
+ }
62
+ if (strapi.contentTypes[parent.uid]) {
63
+ // Found a content type parent
64
+ return parent;
65
+ }
66
+ return null;
67
+ };
68
+ /**
69
+ * Finds join table entries with publication state mismatches
70
+ * Uses existing component parent detection from document service
71
+ */ const findPublicationStateMismatches = async (db, joinTableName, relation, targetModel, sourceModel)=>{
72
+ try {
73
+ // Get join column names using proper functions (addressing PR feedback)
74
+ const sourceColumn = relation.joinTable.joinColumn.name;
75
+ const targetColumn = relation.joinTable.inverseJoinColumn.name;
76
+ // Get all join entries with their target entities
77
+ const query = db.connection(joinTableName).select(`${joinTableName}.id as join_id`, `${joinTableName}.${sourceColumn} as source_id`, `${joinTableName}.${targetColumn} as target_id`, `${targetModel.tableName}.published_at as target_published_at`).leftJoin(targetModel.tableName, `${joinTableName}.${targetColumn}`, `${targetModel.tableName}.id`);
78
+ const joinEntries = await query;
79
+ // Group by source_id to find duplicates pointing to draft/published versions of same entity
80
+ const entriesBySource = {};
81
+ for (const entry of joinEntries){
82
+ const sourceId = entry.source_id;
83
+ if (!entriesBySource[sourceId]) {
84
+ entriesBySource[sourceId] = [];
85
+ }
86
+ entriesBySource[sourceId].push(entry);
87
+ }
88
+ const ghostEntries = [];
89
+ // Check if this is a join table (ends with _lnk)
90
+ const isRelationJoinTable = joinTableName.endsWith('_lnk');
91
+ const isComponentModel = !sourceModel.uid?.startsWith('api::') && !sourceModel.uid?.startsWith('plugin::') && sourceModel.uid?.includes('.');
92
+ // Check for draft/publish inconsistencies
93
+ for (const [sourceId, entries] of Object.entries(entriesBySource)){
94
+ // Skip entries with single relations
95
+ if (entries.length <= 1) {
96
+ continue;
97
+ }
98
+ // For component join tables, check if THIS specific component instance's parent supports D&P
99
+ if (isRelationJoinTable && isComponentModel) {
100
+ try {
101
+ const componentSchema = strapi.components[sourceModel.uid];
102
+ if (!componentSchema) {
103
+ continue;
104
+ }
105
+ const parent = await findContentTypeParentForComponentInstance(componentSchema, sourceId);
106
+ if (!parent) {
107
+ continue;
108
+ }
109
+ // Check if THIS component instance's parent supports draft/publish
110
+ const parentContentType = strapi.contentTypes[parent.uid];
111
+ if (!parentContentType?.options?.draftAndPublish) {
112
+ continue;
113
+ }
114
+ // If we reach here, this component instance's parent DOES support D&P
115
+ // Continue to process this component instance for ghost relations
116
+ } catch (error) {
117
+ continue;
118
+ }
119
+ }
120
+ // Find ghost relations (same logic as original but with improved parent checking)
121
+ for (const entry of entries){
122
+ if (entry.target_published_at === null) {
123
+ // This is a draft target - find its published version
124
+ const draftTarget = await db.connection(targetModel.tableName).select('document_id').where('id', entry.target_id).first();
125
+ if (draftTarget) {
126
+ const publishedVersion = await db.connection(targetModel.tableName).select('id', 'document_id').where('document_id', draftTarget.document_id).whereNotNull('published_at').first();
127
+ if (publishedVersion) {
128
+ // Check if we also have a relation to the published version
129
+ const publishedRelation = entries.find((e)=>e.target_id === publishedVersion.id);
130
+ if (publishedRelation) {
131
+ ghostEntries.push(publishedRelation.join_id);
132
+ }
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }
138
+ return ghostEntries;
139
+ } catch (error) {
140
+ return [];
141
+ }
142
+ };
143
+
144
+ exports.cleanComponentJoinTable = cleanComponentJoinTable;
145
+ //# sourceMappingURL=clean-component-join-table.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,143 @@
1
+ import { getParentSchemasForComponent, findComponentParent } from '../components.mjs';
2
+
3
+ /**
4
+ * Cleans ghost relations with publication state mismatches from a join table
5
+ * Uses schema-based draft/publish checking like prevention fix
6
+ */ const cleanComponentJoinTable = async (db, joinTableName, relation, sourceModel)=>{
7
+ try {
8
+ // Get the target model metadata
9
+ const targetModel = db.metadata.get(relation.target);
10
+ if (!targetModel) {
11
+ db.logger.debug(`Target model ${relation.target} not found, skipping ${joinTableName}`);
12
+ return 0;
13
+ }
14
+ // Check if source supports draft/publish, if it doesnt it should contain duplicate states
15
+ const sourceContentType = strapi.contentTypes[sourceModel.uid];
16
+ // It could be a model, which does not have the draftAndPublish option
17
+ const sourceSupportsDraftPublish = sourceContentType?.options?.draftAndPublish;
18
+ if (sourceContentType && !sourceSupportsDraftPublish) {
19
+ return 0;
20
+ }
21
+ // Check if target supports draft/publish using schema-based approach (like prevention fix)
22
+ const targetContentType = strapi.contentTypes[relation.target];
23
+ const targetSupportsDraftPublish = targetContentType?.options?.draftAndPublish || false;
24
+ if (!targetSupportsDraftPublish) {
25
+ return 0;
26
+ }
27
+ // Find entries with publication state mismatches
28
+ const ghostEntries = await findPublicationStateMismatches(db, joinTableName, relation, targetModel, sourceModel);
29
+ if (ghostEntries.length === 0) {
30
+ return 0;
31
+ }
32
+ // Remove ghost entries
33
+ await db.connection(joinTableName).whereIn('id', ghostEntries).del();
34
+ db.logger.debug(`Removed ${ghostEntries.length} ghost relations with publication state mismatches from ${joinTableName}`);
35
+ return ghostEntries.length;
36
+ } catch (error) {
37
+ const errorMessage = error instanceof Error ? error.message : String(error);
38
+ db.logger.error(`Failed to clean join table "${joinTableName}": ${errorMessage}`);
39
+ return 0;
40
+ }
41
+ };
42
+ const findContentTypeParentForComponentInstance = async (componentSchema, componentId)=>{
43
+ // Get the parent schemas that could contain this component
44
+ const parentSchemas = getParentSchemasForComponent(componentSchema);
45
+ if (parentSchemas.length === 0) {
46
+ // No potential parents
47
+ return null;
48
+ }
49
+ // Find the actual parent for THIS specific component instance
50
+ const parent = await findComponentParent(componentSchema, componentId, parentSchemas);
51
+ if (!parent) {
52
+ // No parent found for this component instance
53
+ return null;
54
+ }
55
+ if (strapi.components[parent.uid]) {
56
+ // If the parent is a component, we need to check its parents recursively
57
+ const parentComponentSchema = strapi.components[parent.uid];
58
+ return findContentTypeParentForComponentInstance(parentComponentSchema, parent.parentId);
59
+ }
60
+ if (strapi.contentTypes[parent.uid]) {
61
+ // Found a content type parent
62
+ return parent;
63
+ }
64
+ return null;
65
+ };
66
+ /**
67
+ * Finds join table entries with publication state mismatches
68
+ * Uses existing component parent detection from document service
69
+ */ const findPublicationStateMismatches = async (db, joinTableName, relation, targetModel, sourceModel)=>{
70
+ try {
71
+ // Get join column names using proper functions (addressing PR feedback)
72
+ const sourceColumn = relation.joinTable.joinColumn.name;
73
+ const targetColumn = relation.joinTable.inverseJoinColumn.name;
74
+ // Get all join entries with their target entities
75
+ const query = db.connection(joinTableName).select(`${joinTableName}.id as join_id`, `${joinTableName}.${sourceColumn} as source_id`, `${joinTableName}.${targetColumn} as target_id`, `${targetModel.tableName}.published_at as target_published_at`).leftJoin(targetModel.tableName, `${joinTableName}.${targetColumn}`, `${targetModel.tableName}.id`);
76
+ const joinEntries = await query;
77
+ // Group by source_id to find duplicates pointing to draft/published versions of same entity
78
+ const entriesBySource = {};
79
+ for (const entry of joinEntries){
80
+ const sourceId = entry.source_id;
81
+ if (!entriesBySource[sourceId]) {
82
+ entriesBySource[sourceId] = [];
83
+ }
84
+ entriesBySource[sourceId].push(entry);
85
+ }
86
+ const ghostEntries = [];
87
+ // Check if this is a join table (ends with _lnk)
88
+ const isRelationJoinTable = joinTableName.endsWith('_lnk');
89
+ const isComponentModel = !sourceModel.uid?.startsWith('api::') && !sourceModel.uid?.startsWith('plugin::') && sourceModel.uid?.includes('.');
90
+ // Check for draft/publish inconsistencies
91
+ for (const [sourceId, entries] of Object.entries(entriesBySource)){
92
+ // Skip entries with single relations
93
+ if (entries.length <= 1) {
94
+ continue;
95
+ }
96
+ // For component join tables, check if THIS specific component instance's parent supports D&P
97
+ if (isRelationJoinTable && isComponentModel) {
98
+ try {
99
+ const componentSchema = strapi.components[sourceModel.uid];
100
+ if (!componentSchema) {
101
+ continue;
102
+ }
103
+ const parent = await findContentTypeParentForComponentInstance(componentSchema, sourceId);
104
+ if (!parent) {
105
+ continue;
106
+ }
107
+ // Check if THIS component instance's parent supports draft/publish
108
+ const parentContentType = strapi.contentTypes[parent.uid];
109
+ if (!parentContentType?.options?.draftAndPublish) {
110
+ continue;
111
+ }
112
+ // If we reach here, this component instance's parent DOES support D&P
113
+ // Continue to process this component instance for ghost relations
114
+ } catch (error) {
115
+ continue;
116
+ }
117
+ }
118
+ // Find ghost relations (same logic as original but with improved parent checking)
119
+ for (const entry of entries){
120
+ if (entry.target_published_at === null) {
121
+ // This is a draft target - find its published version
122
+ const draftTarget = await db.connection(targetModel.tableName).select('document_id').where('id', entry.target_id).first();
123
+ if (draftTarget) {
124
+ const publishedVersion = await db.connection(targetModel.tableName).select('id', 'document_id').where('document_id', draftTarget.document_id).whereNotNull('published_at').first();
125
+ if (publishedVersion) {
126
+ // Check if we also have a relation to the published version
127
+ const publishedRelation = entries.find((e)=>e.target_id === publishedVersion.id);
128
+ if (publishedRelation) {
129
+ ghostEntries.push(publishedRelation.join_id);
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ }
136
+ return ghostEntries;
137
+ } catch (error) {
138
+ return [];
139
+ }
140
+ };
141
+
142
+ export { cleanComponentJoinTable };
143
+ //# sourceMappingURL=clean-component-join-table.mjs.map
@@ -0,0 +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 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n errors,\n relations as relationUtils,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type { Core, Modules, Utils } from '@strapi/types';\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: Modules.EntityService.EntityService) => Modules.EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = strapi\n .get('query-params')\n .transform(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n}: {\n strapi: Core.Strapi;\n db: Database;\n}): Modules.EntityService.EntityService => ({\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n if (kind === 'singleType') {\n const entity = strapi.documents!(uid).findFirst(wrappedParams);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await strapi.documents!(uid).findMany(wrappedParams);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const res = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!res) {\n return this.wrapResult(null, { uid, action: 'findOne' });\n }\n\n const entity = await strapi.documents!(uid).findOne({\n ...wrappedParams,\n documentId: res.documentId,\n });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n return strapi.documents!(uid).count(wrappedParams);\n },\n\n async create(uid, params) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data' | 'fields' | 'populate'>\n >(params, { uid, action: 'create' });\n const { data } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(data, strapi.getModel(uid));\n\n const entity = await strapi.documents!(uid).create({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n });\n\n return this.wrapResult(entity, { uid, action: 'create' });\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data:partial' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return this.wrapResult(null, { uid, action: 'update' });\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(entityToUpdate, strapi.getModel(uid));\n\n const entity = strapi.documents!(uid).update({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n documentId: entityToUpdate.documentId,\n });\n\n return this.wrapResult(entity, { uid, action: 'update' });\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n const entityToDelete = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToDelete) {\n return this.wrapResult(null, { uid, action: 'delete' });\n }\n\n await strapi.documents!(uid).delete({\n ...wrappedParams,\n documentId: entityToDelete.documentId,\n });\n\n return this.wrapResult(entityToDelete, { uid, action: 'delete' });\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Core.Strapi;\n db: Database;\n}): Decoratable<Modules.EntityService.EntityService> => {\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: Modules.EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof Modules.EntityService.EntityService) =>\n async function (this: Modules.EntityService.EntityService, ...args: []) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<Modules.EntityService.EntityService>;\n};\n"],"names":["transformLoadParamsToQuery","uid","field","params","pagination","query","strapi","get","transform","populate","res","databaseErrorsToTransform","databaseErrors","InvalidTimeError","InvalidDateTimeError","InvalidDateError","InvalidRelationError","createDefaultImplementation","db","wrapParams","options","wrapResult","result","findMany","opts","kind","getModel","wrappedParams","action","entity","documents","findFirst","entities","findPage","findOne","entityId","where","id","documentId","count","create","data","Error","shouldPublish","contentTypesUtils","isDraft","status","update","entityToUpdate","delete","entityToDelete","load","_","isString","loadedEntity","loadPages","attributes","attribute","relationUtils","isAnyToMany","loadedPage","results","ctx","implementation","service","decorate","decorator","delegator","delegate","Object","keys","forEach","key","method","oldService","newService","mapValues","methodName","args","call","error","some","errorToTransform","errors","ValidationError","message"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n errors,\n relations as relationUtils,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type { Core, Modules, Utils } from '@strapi/types';\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: Modules.EntityService.EntityService) => Modules.EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = strapi\n .get('query-params')\n .transform(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n}: {\n strapi: Core.Strapi;\n db: Database;\n}): Modules.EntityService.EntityService => ({\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n if (kind === 'singleType') {\n const entity = strapi.documents!(uid).findFirst(wrappedParams);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await strapi.documents!(uid).findMany(wrappedParams);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const res = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!res) {\n return this.wrapResult(null, { uid, action: 'findOne' });\n }\n\n const entity = await strapi.documents!(uid).findOne({\n ...wrappedParams,\n documentId: res.documentId,\n });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n return strapi.documents!(uid).count(wrappedParams);\n },\n\n async create(uid, params) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data' | 'fields' | 'populate'>\n >(params, { uid, action: 'create' });\n const { data } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(data, strapi.getModel(uid));\n\n const entity = await strapi.documents!(uid).create({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n });\n\n return this.wrapResult(entity, { uid, action: 'create' });\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data:partial' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return this.wrapResult(null, { uid, action: 'update' });\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(entityToUpdate, strapi.getModel(uid));\n\n const entity = strapi.documents!(uid).update({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n documentId: entityToUpdate.documentId,\n });\n\n return this.wrapResult(entity, { uid, action: 'update' });\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n const entityToDelete = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToDelete) {\n return this.wrapResult(null, { uid, action: 'delete' });\n }\n\n await strapi.documents!(uid).delete({\n ...wrappedParams,\n documentId: entityToDelete.documentId,\n });\n\n return this.wrapResult(entityToDelete, { uid, action: 'delete' });\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Core.Strapi;\n db: Database;\n}): Decoratable<Modules.EntityService.EntityService> => {\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: Modules.EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof Modules.EntityService.EntityService) =>\n async function (this: Modules.EntityService.EntityService, ...args: []) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<Modules.EntityService.EntityService>;\n};\n"],"names":["transformLoadParamsToQuery","uid","field","params","pagination","query","strapi","get","transform","populate","res","databaseErrorsToTransform","databaseErrors","InvalidTimeError","InvalidDateTimeError","InvalidDateError","InvalidRelationError","createDefaultImplementation","db","wrapParams","options","wrapResult","result","findMany","opts","kind","getModel","wrappedParams","action","entity","documents","findFirst","entities","findPage","findOne","entityId","where","id","documentId","count","create","data","Error","shouldPublish","contentTypesUtils","isDraft","status","update","entityToUpdate","delete","entityToDelete","load","_","isString","loadedEntity","loadPages","attributes","attribute","relationUtils","isAnyToMany","loadedPage","results","ctx","implementation","service","decorate","decorator","delegator","delegate","Object","keys","forEach","key","method","oldService","newService","mapValues","methodName","args","call","error","some","errorToTransform","errors","ValidationError","message"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n errors,\n relations as relationUtils,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type { Core, Modules, Utils } from '@strapi/types';\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: Modules.EntityService.EntityService) => Modules.EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = strapi\n .get('query-params')\n .transform(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n}: {\n strapi: Core.Strapi;\n db: Database;\n}): Modules.EntityService.EntityService => ({\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n if (kind === 'singleType') {\n const entity = strapi.documents!(uid).findFirst(wrappedParams);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await strapi.documents!(uid).findMany(wrappedParams);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const res = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!res) {\n return this.wrapResult(null, { uid, action: 'findOne' });\n }\n\n const entity = await strapi.documents!(uid).findOne({\n ...wrappedParams,\n documentId: res.documentId,\n });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n return strapi.documents!(uid).count(wrappedParams);\n },\n\n async create(uid, params) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data' | 'fields' | 'populate'>\n >(params, { uid, action: 'create' });\n const { data } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(data, strapi.getModel(uid));\n\n const entity = await strapi.documents!(uid).create({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n });\n\n return this.wrapResult(entity, { uid, action: 'create' });\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data:partial' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return this.wrapResult(null, { uid, action: 'update' });\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(entityToUpdate, strapi.getModel(uid));\n\n const entity = strapi.documents!(uid).update({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n documentId: entityToUpdate.documentId,\n });\n\n return this.wrapResult(entity, { uid, action: 'update' });\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n const entityToDelete = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToDelete) {\n return this.wrapResult(null, { uid, action: 'delete' });\n }\n\n await strapi.documents!(uid).delete({\n ...wrappedParams,\n documentId: entityToDelete.documentId,\n });\n\n return this.wrapResult(entityToDelete, { uid, action: 'delete' });\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Core.Strapi;\n db: Database;\n}): Decoratable<Modules.EntityService.EntityService> => {\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: Modules.EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof Modules.EntityService.EntityService) =>\n async function (this: Modules.EntityService.EntityService, ...args: []) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<Modules.EntityService.EntityService>;\n};\n"],"names":["transformLoadParamsToQuery","uid","field","params","pagination","query","strapi","get","transform","populate","res","databaseErrorsToTransform","databaseErrors","InvalidTimeError","InvalidDateTimeError","InvalidDateError","InvalidRelationError","createDefaultImplementation","db","wrapParams","options","wrapResult","result","findMany","opts","kind","getModel","wrappedParams","action","entity","documents","findFirst","entities","findPage","findOne","entityId","where","id","documentId","count","create","data","Error","shouldPublish","contentTypesUtils","isDraft","status","update","entityToUpdate","delete","entityToDelete","load","_","isString","loadedEntity","loadPages","attributes","attribute","relationUtils","isAnyToMany","loadedPage","results","ctx","implementation","service","decorate","decorator","delegator","delegate","Object","keys","forEach","key","method","oldService","newService","mapValues","methodName","args","call","error","some","errorToTransform","errors","ValidationError","message"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n errors,\n relations as relationUtils,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type { Core, Modules, Utils } from '@strapi/types';\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: Modules.EntityService.EntityService) => Modules.EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = strapi\n .get('query-params')\n .transform(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n}: {\n strapi: Core.Strapi;\n db: Database;\n}): Modules.EntityService.EntityService => ({\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n if (kind === 'singleType') {\n const entity = strapi.documents!(uid).findFirst(wrappedParams);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await strapi.documents!(uid).findMany(wrappedParams);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const res = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!res) {\n return this.wrapResult(null, { uid, action: 'findOne' });\n }\n\n const entity = await strapi.documents!(uid).findOne({\n ...wrappedParams,\n documentId: res.documentId,\n });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n return strapi.documents!(uid).count(wrappedParams);\n },\n\n async create(uid, params) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data' | 'fields' | 'populate'>\n >(params, { uid, action: 'create' });\n const { data } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(data, strapi.getModel(uid));\n\n const entity = await strapi.documents!(uid).create({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n });\n\n return this.wrapResult(entity, { uid, action: 'create' });\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data:partial' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return this.wrapResult(null, { uid, action: 'update' });\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(entityToUpdate, strapi.getModel(uid));\n\n const entity = strapi.documents!(uid).update({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n documentId: entityToUpdate.documentId,\n });\n\n return this.wrapResult(entity, { uid, action: 'update' });\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n const entityToDelete = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToDelete) {\n return this.wrapResult(null, { uid, action: 'delete' });\n }\n\n await strapi.documents!(uid).delete({\n ...wrappedParams,\n documentId: entityToDelete.documentId,\n });\n\n return this.wrapResult(entityToDelete, { uid, action: 'delete' });\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Core.Strapi;\n db: Database;\n}): Decoratable<Modules.EntityService.EntityService> => {\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: Modules.EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof Modules.EntityService.EntityService) =>\n async function (this: Modules.EntityService.EntityService, ...args: []) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<Modules.EntityService.EntityService>;\n};\n"],"names":["transformLoadParamsToQuery","uid","field","params","pagination","query","strapi","get","transform","populate","res","databaseErrorsToTransform","databaseErrors","InvalidTimeError","InvalidDateTimeError","InvalidDateError","InvalidRelationError","createDefaultImplementation","db","wrapParams","options","wrapResult","result","findMany","opts","kind","getModel","wrappedParams","action","entity","documents","findFirst","entities","findPage","findOne","entityId","where","id","documentId","count","create","data","Error","shouldPublish","contentTypesUtils","isDraft","status","update","entityToUpdate","delete","entityToDelete","load","_","isString","loadedEntity","loadPages","attributes","attribute","relationUtils","isAnyToMany","loadedPage","results","ctx","implementation","service","decorate","decorator","delegator","delegate","Object","keys","forEach","key","method","oldService","newService","mapValues","methodName","args","call","error","some","errorToTransform","errors","ValidationError","message"],"mappings":"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"}