@strapi/core 0.0.0-next.ce5699024a72ea224891438d5bbe39f904ec6774 → 0.0.0-next.d23f1485e5669cca1cee1bf5f8168b6b8109b78f

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 (268) 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 -1
  4. package/dist/Strapi.js.map +1 -1
  5. package/dist/Strapi.mjs +20 -1
  6. package/dist/Strapi.mjs.map +1 -1
  7. package/dist/configuration/index.d.ts +1 -0
  8. package/dist/configuration/index.d.ts.map +1 -1
  9. package/dist/configuration/index.js +1 -0
  10. package/dist/configuration/index.js.map +1 -1
  11. package/dist/configuration/index.mjs +1 -0
  12. package/dist/configuration/index.mjs.map +1 -1
  13. package/dist/configuration/urls.d.ts.map +1 -1
  14. package/dist/configuration/urls.js +13 -4
  15. package/dist/configuration/urls.js.map +1 -1
  16. package/dist/configuration/urls.mjs +13 -4
  17. package/dist/configuration/urls.mjs.map +1 -1
  18. package/dist/constants.d.ts +3 -0
  19. package/dist/constants.d.ts.map +1 -0
  20. package/dist/constants.js +6 -0
  21. package/dist/constants.js.map +1 -0
  22. package/dist/constants.mjs +4 -0
  23. package/dist/constants.mjs.map +1 -0
  24. package/dist/core-api/controller/index.d.ts.map +1 -1
  25. package/dist/core-api/controller/index.js +2 -1
  26. package/dist/core-api/controller/index.js.map +1 -1
  27. package/dist/core-api/controller/index.mjs +2 -1
  28. package/dist/core-api/controller/index.mjs.map +1 -1
  29. package/dist/core-api/controller/transform.d.ts +3 -2
  30. package/dist/core-api/controller/transform.d.ts.map +1 -1
  31. package/dist/core-api/controller/transform.js +13 -3
  32. package/dist/core-api/controller/transform.js.map +1 -1
  33. package/dist/core-api/controller/transform.mjs +13 -3
  34. package/dist/core-api/controller/transform.mjs.map +1 -1
  35. package/dist/core-api/routes/index.d.ts +4 -22
  36. package/dist/core-api/routes/index.d.ts.map +1 -1
  37. package/dist/core-api/routes/index.js +150 -8
  38. package/dist/core-api/routes/index.js.map +1 -1
  39. package/dist/core-api/routes/index.mjs +131 -8
  40. package/dist/core-api/routes/index.mjs.map +1 -1
  41. package/dist/core-api/routes/validation/attributes.d.ts +244 -0
  42. package/dist/core-api/routes/validation/attributes.d.ts.map +1 -0
  43. package/dist/core-api/routes/validation/attributes.js +560 -0
  44. package/dist/core-api/routes/validation/attributes.js.map +1 -0
  45. package/dist/core-api/routes/validation/attributes.mjs +521 -0
  46. package/dist/core-api/routes/validation/attributes.mjs.map +1 -0
  47. package/dist/core-api/routes/validation/common.d.ts +105 -0
  48. package/dist/core-api/routes/validation/common.d.ts.map +1 -0
  49. package/dist/core-api/routes/validation/common.js +116 -0
  50. package/dist/core-api/routes/validation/common.js.map +1 -0
  51. package/dist/core-api/routes/validation/common.mjs +95 -0
  52. package/dist/core-api/routes/validation/common.mjs.map +1 -0
  53. package/dist/core-api/routes/validation/component.d.ts +34 -0
  54. package/dist/core-api/routes/validation/component.d.ts.map +1 -0
  55. package/dist/core-api/routes/validation/component.js +45 -0
  56. package/dist/core-api/routes/validation/component.js.map +1 -0
  57. package/dist/core-api/routes/validation/component.mjs +43 -0
  58. package/dist/core-api/routes/validation/component.mjs.map +1 -0
  59. package/dist/core-api/routes/validation/constants.d.ts +8 -0
  60. package/dist/core-api/routes/validation/constants.d.ts.map +1 -0
  61. package/dist/core-api/routes/validation/constants.js +18 -0
  62. package/dist/core-api/routes/validation/constants.js.map +1 -0
  63. package/dist/core-api/routes/validation/constants.mjs +16 -0
  64. package/dist/core-api/routes/validation/constants.mjs.map +1 -0
  65. package/dist/core-api/routes/validation/content-type.d.ts +128 -0
  66. package/dist/core-api/routes/validation/content-type.d.ts.map +1 -0
  67. package/dist/core-api/routes/validation/content-type.js +201 -0
  68. package/dist/core-api/routes/validation/content-type.js.map +1 -0
  69. package/dist/core-api/routes/validation/content-type.mjs +180 -0
  70. package/dist/core-api/routes/validation/content-type.mjs.map +1 -0
  71. package/dist/core-api/routes/validation/index.d.ts +5 -0
  72. package/dist/core-api/routes/validation/index.d.ts.map +1 -0
  73. package/dist/core-api/routes/validation/mappers.d.ts +105 -0
  74. package/dist/core-api/routes/validation/mappers.d.ts.map +1 -0
  75. package/dist/core-api/routes/validation/mappers.js +273 -0
  76. package/dist/core-api/routes/validation/mappers.js.map +1 -0
  77. package/dist/core-api/routes/validation/mappers.mjs +249 -0
  78. package/dist/core-api/routes/validation/mappers.mjs.map +1 -0
  79. package/dist/core-api/routes/validation/utils.d.ts +47 -0
  80. package/dist/core-api/routes/validation/utils.d.ts.map +1 -0
  81. package/dist/core-api/routes/validation/utils.js +128 -0
  82. package/dist/core-api/routes/validation/utils.js.map +1 -0
  83. package/dist/core-api/routes/validation/utils.mjs +106 -0
  84. package/dist/core-api/routes/validation/utils.mjs.map +1 -0
  85. package/dist/domain/content-type/index.d.ts.map +1 -1
  86. package/dist/domain/content-type/index.js +17 -1
  87. package/dist/domain/content-type/index.js.map +1 -1
  88. package/dist/domain/content-type/index.mjs +17 -1
  89. package/dist/domain/content-type/index.mjs.map +1 -1
  90. package/dist/domain/module/index.d.ts.map +1 -1
  91. package/dist/domain/module/index.js +3 -0
  92. package/dist/domain/module/index.js.map +1 -1
  93. package/dist/domain/module/index.mjs +3 -0
  94. package/dist/domain/module/index.mjs.map +1 -1
  95. package/dist/ee/index.d.ts +6 -0
  96. package/dist/ee/index.d.ts.map +1 -1
  97. package/dist/ee/index.js +29 -3
  98. package/dist/ee/index.js.map +1 -1
  99. package/dist/ee/index.mjs +30 -4
  100. package/dist/ee/index.mjs.map +1 -1
  101. package/dist/ee/license.d.ts +3 -1
  102. package/dist/ee/license.d.ts.map +1 -1
  103. package/dist/ee/license.js +8 -2
  104. package/dist/ee/license.js.map +1 -1
  105. package/dist/ee/license.mjs +9 -4
  106. package/dist/ee/license.mjs.map +1 -1
  107. package/dist/factories.d.ts +3 -1
  108. package/dist/factories.d.ts.map +1 -1
  109. package/dist/factories.js +10 -2
  110. package/dist/factories.js.map +1 -1
  111. package/dist/factories.mjs +10 -3
  112. package/dist/factories.mjs.map +1 -1
  113. package/dist/index.js +1 -1
  114. package/dist/index.mjs +1 -1
  115. package/dist/loaders/plugins/index.js +1 -1
  116. package/dist/loaders/plugins/index.js.map +1 -1
  117. package/dist/loaders/plugins/index.mjs +1 -1
  118. package/dist/loaders/plugins/index.mjs.map +1 -1
  119. package/dist/middlewares/cors.d.ts +9 -1
  120. package/dist/middlewares/cors.d.ts.map +1 -1
  121. package/dist/middlewares/cors.js +39 -17
  122. package/dist/middlewares/cors.js.map +1 -1
  123. package/dist/middlewares/cors.mjs +39 -18
  124. package/dist/middlewares/cors.mjs.map +1 -1
  125. package/dist/migrations/first-published-at.d.ts +4 -0
  126. package/dist/migrations/first-published-at.d.ts.map +1 -0
  127. package/dist/migrations/first-published-at.js +51 -0
  128. package/dist/migrations/first-published-at.js.map +1 -0
  129. package/dist/migrations/first-published-at.mjs +49 -0
  130. package/dist/migrations/first-published-at.mjs.map +1 -0
  131. package/dist/migrations/index.d.ts.map +1 -1
  132. package/dist/migrations/index.js +5 -0
  133. package/dist/migrations/index.js.map +1 -1
  134. package/dist/migrations/index.mjs +5 -0
  135. package/dist/migrations/index.mjs.map +1 -1
  136. package/dist/package.json.js +19 -14
  137. package/dist/package.json.js.map +1 -1
  138. package/dist/package.json.mjs +19 -14
  139. package/dist/package.json.mjs.map +1 -1
  140. package/dist/providers/index.d.ts.map +1 -1
  141. package/dist/providers/index.js +2 -0
  142. package/dist/providers/index.js.map +1 -1
  143. package/dist/providers/index.mjs +2 -0
  144. package/dist/providers/index.mjs.map +1 -1
  145. package/dist/providers/sessionManager.d.ts +3 -0
  146. package/dist/providers/sessionManager.d.ts.map +1 -0
  147. package/dist/providers/sessionManager.js +21 -0
  148. package/dist/providers/sessionManager.js.map +1 -0
  149. package/dist/providers/sessionManager.mjs +19 -0
  150. package/dist/providers/sessionManager.mjs.map +1 -0
  151. package/dist/services/content-api/index.d.ts +1 -1
  152. package/dist/services/content-api/index.d.ts.map +1 -1
  153. package/dist/services/content-api/index.js +1 -1
  154. package/dist/services/content-api/index.js.map +1 -1
  155. package/dist/services/content-api/index.mjs +2 -2
  156. package/dist/services/content-api/index.mjs.map +1 -1
  157. package/dist/services/content-source-maps.d.ts +13 -0
  158. package/dist/services/content-source-maps.d.ts.map +1 -0
  159. package/dist/services/content-source-maps.js +108 -0
  160. package/dist/services/content-source-maps.js.map +1 -0
  161. package/dist/services/content-source-maps.mjs +106 -0
  162. package/dist/services/content-source-maps.mjs.map +1 -0
  163. package/dist/services/core-store.d.ts +2 -2
  164. package/dist/services/core-store.d.ts.map +1 -1
  165. package/dist/services/core-store.js.map +1 -1
  166. package/dist/services/core-store.mjs.map +1 -1
  167. package/dist/services/document-service/components.d.ts +31 -1
  168. package/dist/services/document-service/components.d.ts.map +1 -1
  169. package/dist/services/document-service/components.js +109 -0
  170. package/dist/services/document-service/components.js.map +1 -1
  171. package/dist/services/document-service/components.mjs +107 -1
  172. package/dist/services/document-service/components.mjs.map +1 -1
  173. package/dist/services/document-service/entries.d.ts.map +1 -1
  174. package/dist/services/document-service/entries.js +42 -0
  175. package/dist/services/document-service/entries.js.map +1 -1
  176. package/dist/services/document-service/entries.mjs +43 -1
  177. package/dist/services/document-service/entries.mjs.map +1 -1
  178. package/dist/services/document-service/first-published-at.d.ts +7 -0
  179. package/dist/services/document-service/first-published-at.d.ts.map +1 -0
  180. package/dist/services/document-service/first-published-at.js +31 -0
  181. package/dist/services/document-service/first-published-at.js.map +1 -0
  182. package/dist/services/document-service/first-published-at.mjs +28 -0
  183. package/dist/services/document-service/first-published-at.mjs.map +1 -0
  184. package/dist/services/document-service/internationalization.d.ts +6 -1
  185. package/dist/services/document-service/internationalization.d.ts.map +1 -1
  186. package/dist/services/document-service/internationalization.js +32 -0
  187. package/dist/services/document-service/internationalization.js.map +1 -1
  188. package/dist/services/document-service/internationalization.mjs +32 -1
  189. package/dist/services/document-service/internationalization.mjs.map +1 -1
  190. package/dist/services/document-service/repository.d.ts.map +1 -1
  191. package/dist/services/document-service/repository.js +16 -8
  192. package/dist/services/document-service/repository.js.map +1 -1
  193. package/dist/services/document-service/repository.mjs +18 -10
  194. package/dist/services/document-service/repository.mjs.map +1 -1
  195. package/dist/services/document-service/utils/clean-component-join-table.d.ts +7 -0
  196. package/dist/services/document-service/utils/clean-component-join-table.d.ts.map +1 -0
  197. package/dist/services/document-service/utils/clean-component-join-table.js +138 -0
  198. package/dist/services/document-service/utils/clean-component-join-table.js.map +1 -0
  199. package/dist/services/document-service/utils/clean-component-join-table.mjs +136 -0
  200. package/dist/services/document-service/utils/clean-component-join-table.mjs.map +1 -0
  201. package/dist/services/document-service/utils/unidirectional-relations.d.ts +19 -2
  202. package/dist/services/document-service/utils/unidirectional-relations.d.ts.map +1 -1
  203. package/dist/services/document-service/utils/unidirectional-relations.js +21 -6
  204. package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
  205. package/dist/services/document-service/utils/unidirectional-relations.mjs +21 -6
  206. package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
  207. package/dist/services/entity-validator/index.d.ts.map +1 -1
  208. package/dist/services/entity-validator/index.js +9 -0
  209. package/dist/services/entity-validator/index.js.map +1 -1
  210. package/dist/services/entity-validator/index.mjs +9 -0
  211. package/dist/services/entity-validator/index.mjs.map +1 -1
  212. package/dist/services/entity-validator/validators.d.ts +1 -0
  213. package/dist/services/entity-validator/validators.d.ts.map +1 -1
  214. package/dist/services/entity-validator/validators.js +3 -0
  215. package/dist/services/entity-validator/validators.js.map +1 -1
  216. package/dist/services/entity-validator/validators.mjs +3 -0
  217. package/dist/services/entity-validator/validators.mjs.map +1 -1
  218. package/dist/services/metrics/admin-user-hash.d.ts.map +1 -1
  219. package/dist/services/metrics/admin-user-hash.js.map +1 -1
  220. package/dist/services/metrics/admin-user-hash.mjs.map +1 -1
  221. package/dist/services/metrics/index.d.ts +1 -1
  222. package/dist/services/metrics/index.d.ts.map +1 -1
  223. package/dist/services/metrics/index.js +11 -9
  224. package/dist/services/metrics/index.js.map +1 -1
  225. package/dist/services/metrics/index.mjs +11 -9
  226. package/dist/services/metrics/index.mjs.map +1 -1
  227. package/dist/services/metrics/middleware.d.ts +2 -1
  228. package/dist/services/metrics/middleware.d.ts.map +1 -1
  229. package/dist/services/metrics/middleware.js +2 -2
  230. package/dist/services/metrics/middleware.js.map +1 -1
  231. package/dist/services/metrics/middleware.mjs +2 -2
  232. package/dist/services/metrics/middleware.mjs.map +1 -1
  233. package/dist/services/metrics/sender.d.ts.map +1 -1
  234. package/dist/services/metrics/sender.js +5 -5
  235. package/dist/services/metrics/sender.js.map +1 -1
  236. package/dist/services/metrics/sender.mjs +6 -6
  237. package/dist/services/metrics/sender.mjs.map +1 -1
  238. package/dist/services/server/register-routes.js +22 -2
  239. package/dist/services/server/register-routes.js.map +1 -1
  240. package/dist/services/server/register-routes.mjs +22 -2
  241. package/dist/services/server/register-routes.mjs.map +1 -1
  242. package/dist/services/server/routing.d.ts +10 -0
  243. package/dist/services/server/routing.d.ts.map +1 -1
  244. package/dist/services/server/routing.js +7 -1
  245. package/dist/services/server/routing.js.map +1 -1
  246. package/dist/services/server/routing.mjs +7 -1
  247. package/dist/services/server/routing.mjs.map +1 -1
  248. package/dist/services/session-manager.d.ts +160 -0
  249. package/dist/services/session-manager.d.ts.map +1 -0
  250. package/dist/services/session-manager.js +476 -0
  251. package/dist/services/session-manager.js.map +1 -0
  252. package/dist/services/session-manager.mjs +473 -0
  253. package/dist/services/session-manager.mjs.map +1 -0
  254. package/dist/services/utils/conditional-fields.d.ts +3 -0
  255. package/dist/services/utils/conditional-fields.d.ts.map +1 -0
  256. package/dist/services/utils/conditional-fields.js +22 -0
  257. package/dist/services/utils/conditional-fields.js.map +1 -0
  258. package/dist/services/utils/conditional-fields.mjs +20 -0
  259. package/dist/services/utils/conditional-fields.mjs.map +1 -0
  260. package/dist/utils/fetch.d.ts +5 -1
  261. package/dist/utils/fetch.d.ts.map +1 -1
  262. package/dist/utils/fetch.js +8 -4
  263. package/dist/utils/fetch.js.map +1 -1
  264. package/dist/utils/fetch.mjs +8 -4
  265. package/dist/utils/fetch.mjs.map +1 -1
  266. package/dist/utils/transform-content-types-to-models.d.ts +197 -0
  267. package/dist/utils/transform-content-types-to-models.d.ts.map +1 -1
  268. package/package.json +19 -14
@@ -2,8 +2,8 @@ import { curry, assoc, omit, merge } from 'lodash/fp';
2
2
  import { contentTypes, async, errors, validate } from '@strapi/utils';
3
3
  import { wrapInTransaction } from './common.mjs';
4
4
  import { defaultToDraft as defaultToDraftCurry, statusToLookup as statusToLookupCurry, filterDataPublishedAt as filterDataPublishedAtCurry, setStatusToDraft as setStatusToDraftCurry, statusToData as statusToDataCurry, defaultStatus as defaultStatusCurry } from './draft-and-publish.mjs';
5
- import { defaultLocale as defaultLocaleCurry, multiLocaleToLookup as multiLocaleToLookupCurry, localeToLookup as localeToLookupCurry, localeToData as localeToDataCurry } from './internationalization.mjs';
6
- import { updateComponents, omitComponentData } from './components.mjs';
5
+ import { defaultLocale as defaultLocaleCurry, multiLocaleToLookup as multiLocaleToLookupCurry, localeToLookup as localeToLookupCurry, localeToData as localeToDataCurry, copyNonLocalizedFields } from './internationalization.mjs';
6
+ import { updateComponents, omitComponentData, createComponentRelationFilter } from './components.mjs';
7
7
  import { createEntriesService } from './entries.mjs';
8
8
  import { pickSelectionParams } from './params.mjs';
9
9
  import { createDocumentId } from '../../utils/transform-content-types-to-models.mjs';
@@ -14,6 +14,7 @@ import { createEventManager } from './events.mjs';
14
14
  import { load, sync } from './utils/unidirectional-relations.mjs';
15
15
  import { load as load$1, sync as sync$1 } from './utils/bidirectional-relations.mjs';
16
16
  import entityValidator from '../entity-validator/index.mjs';
17
+ import { filterDataFirstPublishedAt, addFirstPublishedAtToDraft } from './first-published-at.mjs';
17
18
 
18
19
  const { validators } = validate;
19
20
  // we have to typecast to reconcile the differences between validator and database getModel
@@ -149,7 +150,7 @@ const createContentTypeRepository = (uid, validator = entityValidator)=>{
149
150
  }
150
151
  async function update(opts = {}) {
151
152
  const { documentId, ...params } = opts;
152
- const queryParams = await async.pipe(validateParams, filterDataPublishedAtCurry, setStatusToDraftCurry(contentType), statusToLookupCurry(contentType), statusToDataCurry(contentType), // Default locale will be set if not provided
153
+ const queryParams = await async.pipe(validateParams, filterDataPublishedAtCurry, filterDataFirstPublishedAt, setStatusToDraftCurry(contentType), statusToLookupCurry(contentType), statusToDataCurry(contentType), // Default locale will be set if not provided
153
154
  defaultLocaleCurry(contentType), localeToLookupCurry(contentType), localeToDataCurry(contentType))(params);
154
155
  const { data, ...restParams } = await curriedTransformParamsDocumentId(uid, queryParams || {});
155
156
  const query = transformParamsToQuery(uid, pickSelectionParams(restParams || {}));
@@ -175,12 +176,13 @@ const createContentTypeRepository = (uid, validator = entityValidator)=>{
175
176
  }
176
177
  });
177
178
  if (documentExists) {
179
+ const mergedData = await copyNonLocalizedFields(contentType, documentId, {
180
+ ...queryParams.data,
181
+ documentId
182
+ });
178
183
  updatedDraft = await entries.create({
179
184
  ...queryParams,
180
- data: {
181
- ...queryParams.data,
182
- documentId
183
- }
185
+ data: mergedData
184
186
  });
185
187
  emitEvent('entry.create', updatedDraft);
186
188
  }
@@ -233,6 +235,8 @@ const createContentTypeRepository = (uid, validator = entityValidator)=>{
233
235
  const relationsToSync = await load(uid, {
234
236
  newVersions: draftsToPublish,
235
237
  oldVersions: oldPublishedVersions
238
+ }, {
239
+ shouldPropagateRelation: createComponentRelationFilter()
236
240
  });
237
241
  const bidirectionalRelationsToSync = await load$1(uid, {
238
242
  newVersions: draftsToPublish,
@@ -240,16 +244,18 @@ const createContentTypeRepository = (uid, validator = entityValidator)=>{
240
244
  });
241
245
  // Delete old published versions
242
246
  await async.map(oldPublishedVersions, (entry)=>entries.delete(entry.id));
247
+ // Add firstPublishedAt to draft if it doesn't exist
248
+ const updatedDraft = await async.map(draftsToPublish, (draft)=>addFirstPublishedAtToDraft(draft, entries.update, contentType));
243
249
  // Transform draft entry data and create published versions
244
- const publishedEntries = await async.map(draftsToPublish, (draft)=>entries.publish(draft, queryParams));
250
+ const publishedEntries = await async.map(updatedDraft, (draft)=>entries.publish(draft, queryParams));
245
251
  // Sync unidirectional relations with the new published entries
246
252
  await sync([
247
253
  ...oldPublishedVersions,
248
- ...draftsToPublish
254
+ ...updatedDraft
249
255
  ], publishedEntries, relationsToSync);
250
256
  await sync$1([
251
257
  ...oldPublishedVersions,
252
- ...draftsToPublish
258
+ ...updatedDraft
253
259
  ], publishedEntries, bidirectionalRelationsToSync);
254
260
  publishedEntries.forEach(emitEvent('entry.publish'));
255
261
  return {
@@ -311,6 +317,8 @@ const createContentTypeRepository = (uid, validator = entityValidator)=>{
311
317
  const relationsToSync = await load(uid, {
312
318
  newVersions: versionsToDraft,
313
319
  oldVersions: oldDrafts
320
+ }, {
321
+ shouldPropagateRelation: createComponentRelationFilter()
314
322
  });
315
323
  const bidirectionalRelationsToSync = await load$1(uid, {
316
324
  newVersions: versionsToDraft,
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","sources":["../../../src/services/document-service/repository.ts"],"sourcesContent":["import { omit, assoc, merge, curry } from 'lodash/fp';\n\nimport { async, contentTypes as contentTypesUtils, validate, errors } from '@strapi/utils';\n\nimport type { UID } from '@strapi/types';\nimport { wrapInTransaction, type RepositoryFactoryMethod } from './common';\nimport * as DP from './draft-and-publish';\nimport * as i18n from './internationalization';\nimport * as components from './components';\n\nimport { createEntriesService } from './entries';\nimport { 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 entityValidator from '../entity-validator';\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\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 const validateParams = async (params: any) => {\n const ctx = { schema: contentType, getModel };\n await validators.validateFilters(ctx, params.filters, filtersValidations);\n await validators.validateSort(ctx, params.sort, sortValidations);\n await validators.validateFields(ctx, params.fields, fieldValidations);\n await validators.validatePopulate(ctx, params.populate, populateValidations);\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 // TODO: add validate status, locale, pagination\n\n return params;\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 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 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 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 query = 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 if (params.status === 'draft') {\n throw new Error('Cannot delete a draft document');\n }\n\n const entriesToDelete = await strapi.db.query(uid).findMany(query);\n\n // Delete all matched entries and its components\n const deletedEntries = await async.map(entriesToDelete, (entryToDelete: any) =>\n entries.delete(entryToDelete.id)\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 clonedEntries = await async.map(\n entriesToClone,\n async.pipe(\n validateParams,\n omit(['id', 'createdAt', 'updatedAt']),\n // assign new documentId\n assoc('documentId', createDocumentId()),\n // Merge new data into it\n (data) => merge(data, queryParams.data),\n (data) => entries.create({ ...queryParams, data, status: 'draft' })\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 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 updatedDraft = await entries.create({\n ...queryParams,\n data: { ...queryParams.data, documentId },\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 i18n.defaultLocale(contentType),\n i18n.localeToLookup(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(uid, {\n newVersions: draftsToPublish,\n oldVersions: oldPublishedVersions,\n });\n\n const bidirectionalRelationsToSync = await bidirectionalRelations.load(uid, {\n newVersions: draftsToPublish,\n oldVersions: oldPublishedVersions,\n });\n\n // Delete old published versions\n await async.map(oldPublishedVersions, (entry: any) => entries.delete(entry.id));\n\n // Transform draft entry data and create published versions\n const publishedEntries = await async.map(draftsToPublish, (draft: any) =>\n entries.publish(draft, queryParams)\n );\n\n // Sync unidirectional relations with the new published entries\n await unidirectionalRelations.sync(\n [...oldPublishedVersions, ...draftsToPublish],\n publishedEntries,\n relationsToSync\n );\n\n await bidirectionalRelations.sync(\n [...oldPublishedVersions, ...draftsToPublish],\n publishedEntries,\n bidirectionalRelationsToSync\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(uid, {\n newVersions: versionsToDraft,\n oldVersions: oldDrafts,\n });\n\n const bidirectionalRelationsToSync = await bidirectionalRelations.load(uid, {\n newVersions: versionsToDraft,\n oldVersions: oldDrafts,\n });\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 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","createContentTypeRepository","uid","validator","entityValidator","contentType","hasDraftAndPublish","contentTypesUtils","sortValidations","fieldValidations","filtersValidations","populateValidations","sort","field","filters","populate","validateParams","params","ctx","validateFilters","validateSort","validateFields","fields","validatePopulate","lookup","errors","ValidationError","entries","createEntriesService","eventManager","createEventManager","emitEvent","curry","findMany","query","async","pipe","DP","i18n","transformParamsDocumentId","transformParamsToQuery","db","findFirst","findOne","opts","documentId","assoc","where","deleteDocument","omit","status","Error","entriesToDelete","deletedEntries","map","entryToDelete","delete","id","forEach","create","queryParams","doc","publish","then","clone","entriesToClone","publishedAt","$null","getDeepPopulate","relationalFields","clonedEntries","createDocumentId","data","merge","at","update","restParams","pickSelectionParams","entryToUpdate","updatedDraft","documentExists","count","draftsToPublish","oldPublishedVersions","Promise","all","$ne","select","relationsToSync","unidirectionalRelations","newVersions","oldVersions","bidirectionalRelationsToSync","bidirectionalRelations","entry","publishedEntries","draft","unpublish","versionsToDelete","discardDraft","versionsToDraft","oldDrafts","draftEntries","updateComponents","components","omitComponentData","wrapInTransaction","undefined"],"mappings":"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"}
1
+ {"version":3,"file":"repository.mjs","sources":["../../../src/services/document-service/repository.ts"],"sourcesContent":["import { omit, assoc, merge, curry } from 'lodash/fp';\n\nimport { async, contentTypes as contentTypesUtils, validate, errors } from '@strapi/utils';\n\nimport type { UID } 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 { 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 entityValidator from '../entity-validator';\nimport { addFirstPublishedAtToDraft, filterDataFirstPublishedAt } from './first-published-at';\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\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 const validateParams = async (params: any) => {\n const ctx = { schema: contentType, getModel };\n await validators.validateFilters(ctx, params.filters, filtersValidations);\n await validators.validateSort(ctx, params.sort, sortValidations);\n await validators.validateFields(ctx, params.fields, fieldValidations);\n await validators.validatePopulate(ctx, params.populate, populateValidations);\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 // TODO: add validate status, locale, pagination\n\n return params;\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 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 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 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 query = 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 if (params.status === 'draft') {\n throw new Error('Cannot delete a draft document');\n }\n\n const entriesToDelete = await strapi.db.query(uid).findMany(query);\n\n // Delete all matched entries and its components\n const deletedEntries = await async.map(entriesToDelete, (entryToDelete: any) =>\n entries.delete(entryToDelete.id)\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 clonedEntries = await async.map(\n entriesToClone,\n async.pipe(\n validateParams,\n omit(['id', 'createdAt', 'updatedAt']),\n // assign new documentId\n assoc('documentId', createDocumentId()),\n // Merge new data into it\n (data) => merge(data, queryParams.data),\n (data) => entries.create({ ...queryParams, data, status: 'draft' })\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 i18n.defaultLocale(contentType),\n i18n.localeToLookup(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 // 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 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 // 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 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","createContentTypeRepository","uid","validator","entityValidator","contentType","hasDraftAndPublish","contentTypesUtils","sortValidations","fieldValidations","filtersValidations","populateValidations","sort","field","filters","populate","validateParams","params","ctx","validateFilters","validateSort","validateFields","fields","validatePopulate","lookup","errors","ValidationError","entries","createEntriesService","eventManager","createEventManager","emitEvent","curry","findMany","query","async","pipe","DP","i18n","transformParamsDocumentId","transformParamsToQuery","db","findFirst","findOne","opts","documentId","assoc","where","deleteDocument","omit","status","Error","entriesToDelete","deletedEntries","map","entryToDelete","delete","id","forEach","create","queryParams","doc","publish","then","clone","entriesToClone","publishedAt","$null","getDeepPopulate","relationalFields","clonedEntries","createDocumentId","data","merge","at","update","filterDataFirstPublishedAt","restParams","pickSelectionParams","entryToUpdate","updatedDraft","documentExists","mergedData","copyNonLocalizedFields","count","draftsToPublish","oldPublishedVersions","Promise","all","$ne","select","relationsToSync","unidirectionalRelations","newVersions","oldVersions","shouldPropagateRelation","components","bidirectionalRelationsToSync","bidirectionalRelations","entry","draft","addFirstPublishedAtToDraft","publishedEntries","unpublish","versionsToDelete","discardDraft","versionsToDraft","oldDrafts","draftEntries","updateComponents","omitComponentData","wrapInTransaction","undefined"],"mappings":"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"}
@@ -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,CA2ChB,CAAC"}
@@ -0,0 +1,138 @@
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 target supports draft/publish using schema-based approach (like prevention fix)
17
+ const targetContentType = strapi.contentTypes[relation.target];
18
+ const targetSupportsDraftPublish = targetContentType?.options?.draftAndPublish || false;
19
+ if (!targetSupportsDraftPublish) {
20
+ return 0;
21
+ }
22
+ // Find entries with publication state mismatches
23
+ const ghostEntries = await findPublicationStateMismatches(db, joinTableName, relation, targetModel, sourceModel);
24
+ if (ghostEntries.length === 0) {
25
+ return 0;
26
+ }
27
+ // Remove ghost entries
28
+ await db.connection(joinTableName).whereIn('id', ghostEntries).del();
29
+ db.logger.debug(`Removed ${ghostEntries.length} ghost relations with publication state mismatches from ${joinTableName}`);
30
+ return ghostEntries.length;
31
+ } catch (error) {
32
+ const errorMessage = error instanceof Error ? error.message : String(error);
33
+ db.logger.error(`Failed to clean join table "${joinTableName}": ${errorMessage}`);
34
+ return 0;
35
+ }
36
+ };
37
+ const findContentTypeParentForComponentInstance = async (componentSchema, componentId)=>{
38
+ // Get the parent schemas that could contain this component
39
+ const parentSchemas = components.getParentSchemasForComponent(componentSchema);
40
+ if (parentSchemas.length === 0) {
41
+ // No potential parents
42
+ return null;
43
+ }
44
+ // Find the actual parent for THIS specific component instance
45
+ const parent = await components.findComponentParent(componentSchema, componentId, parentSchemas);
46
+ if (!parent) {
47
+ // No parent found for this component instance
48
+ return null;
49
+ }
50
+ if (strapi.components[parent.uid]) {
51
+ // If the parent is a component, we need to check its parents recursively
52
+ const parentComponentSchema = strapi.components[parent.uid];
53
+ return findContentTypeParentForComponentInstance(parentComponentSchema, parent.parentId);
54
+ }
55
+ if (strapi.contentTypes[parent.uid]) {
56
+ // Found a content type parent
57
+ return parent;
58
+ }
59
+ return null;
60
+ };
61
+ /**
62
+ * Finds join table entries with publication state mismatches
63
+ * Uses existing component parent detection from document service
64
+ */ const findPublicationStateMismatches = async (db, joinTableName, relation, targetModel, sourceModel)=>{
65
+ try {
66
+ // Get join column names using proper functions (addressing PR feedback)
67
+ const sourceColumn = relation.joinTable.joinColumn.name;
68
+ const targetColumn = relation.joinTable.inverseJoinColumn.name;
69
+ // Get all join entries with their target entities
70
+ 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`);
71
+ const joinEntries = await query;
72
+ // Group by source_id to find duplicates pointing to draft/published versions of same entity
73
+ const entriesBySource = {};
74
+ for (const entry of joinEntries){
75
+ const sourceId = entry.source_id;
76
+ if (!entriesBySource[sourceId]) {
77
+ entriesBySource[sourceId] = [];
78
+ }
79
+ entriesBySource[sourceId].push(entry);
80
+ }
81
+ const ghostEntries = [];
82
+ // Check if this is a join table (ends with _lnk)
83
+ const isRelationJoinTable = joinTableName.endsWith('_lnk');
84
+ const isComponentModel = !sourceModel.uid?.startsWith('api::') && !sourceModel.uid?.startsWith('plugin::') && sourceModel.uid?.includes('.');
85
+ // Check for draft/publish inconsistencies
86
+ for (const [sourceId, entries] of Object.entries(entriesBySource)){
87
+ // Skip entries with single relations
88
+ if (entries.length <= 1) {
89
+ continue;
90
+ }
91
+ // For component join tables, check if THIS specific component instance's parent supports D&P
92
+ if (isRelationJoinTable && isComponentModel) {
93
+ try {
94
+ const componentSchema = strapi.components[sourceModel.uid];
95
+ if (!componentSchema) {
96
+ continue;
97
+ }
98
+ const parent = await findContentTypeParentForComponentInstance(componentSchema, sourceId);
99
+ if (!parent) {
100
+ continue;
101
+ }
102
+ // Check if THIS component instance's parent supports draft/publish
103
+ const parentContentType = strapi.contentTypes[parent.uid];
104
+ if (!parentContentType?.options?.draftAndPublish) {
105
+ continue;
106
+ }
107
+ // If we reach here, this component instance's parent DOES support D&P
108
+ // Continue to process this component instance for ghost relations
109
+ } catch (error) {
110
+ continue;
111
+ }
112
+ }
113
+ // Find ghost relations (same logic as original but with improved parent checking)
114
+ for (const entry of entries){
115
+ if (entry.target_published_at === null) {
116
+ // This is a draft target - find its published version
117
+ const draftTarget = await db.connection(targetModel.tableName).select('document_id').where('id', entry.target_id).first();
118
+ if (draftTarget) {
119
+ const publishedVersion = await db.connection(targetModel.tableName).select('id', 'document_id').where('document_id', draftTarget.document_id).whereNotNull('published_at').first();
120
+ if (publishedVersion) {
121
+ // Check if we also have a relation to the published version
122
+ const publishedRelation = entries.find((e)=>e.target_id === publishedVersion.id);
123
+ if (publishedRelation) {
124
+ ghostEntries.push(publishedRelation.join_id);
125
+ }
126
+ }
127
+ }
128
+ }
129
+ }
130
+ }
131
+ return ghostEntries;
132
+ } catch (error) {
133
+ return [];
134
+ }
135
+ };
136
+
137
+ exports.cleanComponentJoinTable = cleanComponentJoinTable;
138
+ //# 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 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","targetContentType","strapi","contentTypes","targetSupportsDraftPublish","options","draftAndPublish","ghostEntries","findPublicationStateMismatches","length","connection","whereIn","del","error","errorMessage","Error","message","String","findContentTypeParentForComponentInstance","componentSchema","componentId","parentSchemas","getParentSchemasForComponent","parent","findComponentParent","components","uid","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,136 @@
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 target supports draft/publish using schema-based approach (like prevention fix)
15
+ const targetContentType = strapi.contentTypes[relation.target];
16
+ const targetSupportsDraftPublish = targetContentType?.options?.draftAndPublish || false;
17
+ if (!targetSupportsDraftPublish) {
18
+ return 0;
19
+ }
20
+ // Find entries with publication state mismatches
21
+ const ghostEntries = await findPublicationStateMismatches(db, joinTableName, relation, targetModel, sourceModel);
22
+ if (ghostEntries.length === 0) {
23
+ return 0;
24
+ }
25
+ // Remove ghost entries
26
+ await db.connection(joinTableName).whereIn('id', ghostEntries).del();
27
+ db.logger.debug(`Removed ${ghostEntries.length} ghost relations with publication state mismatches from ${joinTableName}`);
28
+ return ghostEntries.length;
29
+ } catch (error) {
30
+ const errorMessage = error instanceof Error ? error.message : String(error);
31
+ db.logger.error(`Failed to clean join table "${joinTableName}": ${errorMessage}`);
32
+ return 0;
33
+ }
34
+ };
35
+ const findContentTypeParentForComponentInstance = async (componentSchema, componentId)=>{
36
+ // Get the parent schemas that could contain this component
37
+ const parentSchemas = getParentSchemasForComponent(componentSchema);
38
+ if (parentSchemas.length === 0) {
39
+ // No potential parents
40
+ return null;
41
+ }
42
+ // Find the actual parent for THIS specific component instance
43
+ const parent = await findComponentParent(componentSchema, componentId, parentSchemas);
44
+ if (!parent) {
45
+ // No parent found for this component instance
46
+ return null;
47
+ }
48
+ if (strapi.components[parent.uid]) {
49
+ // If the parent is a component, we need to check its parents recursively
50
+ const parentComponentSchema = strapi.components[parent.uid];
51
+ return findContentTypeParentForComponentInstance(parentComponentSchema, parent.parentId);
52
+ }
53
+ if (strapi.contentTypes[parent.uid]) {
54
+ // Found a content type parent
55
+ return parent;
56
+ }
57
+ return null;
58
+ };
59
+ /**
60
+ * Finds join table entries with publication state mismatches
61
+ * Uses existing component parent detection from document service
62
+ */ const findPublicationStateMismatches = async (db, joinTableName, relation, targetModel, sourceModel)=>{
63
+ try {
64
+ // Get join column names using proper functions (addressing PR feedback)
65
+ const sourceColumn = relation.joinTable.joinColumn.name;
66
+ const targetColumn = relation.joinTable.inverseJoinColumn.name;
67
+ // Get all join entries with their target entities
68
+ 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`);
69
+ const joinEntries = await query;
70
+ // Group by source_id to find duplicates pointing to draft/published versions of same entity
71
+ const entriesBySource = {};
72
+ for (const entry of joinEntries){
73
+ const sourceId = entry.source_id;
74
+ if (!entriesBySource[sourceId]) {
75
+ entriesBySource[sourceId] = [];
76
+ }
77
+ entriesBySource[sourceId].push(entry);
78
+ }
79
+ const ghostEntries = [];
80
+ // Check if this is a join table (ends with _lnk)
81
+ const isRelationJoinTable = joinTableName.endsWith('_lnk');
82
+ const isComponentModel = !sourceModel.uid?.startsWith('api::') && !sourceModel.uid?.startsWith('plugin::') && sourceModel.uid?.includes('.');
83
+ // Check for draft/publish inconsistencies
84
+ for (const [sourceId, entries] of Object.entries(entriesBySource)){
85
+ // Skip entries with single relations
86
+ if (entries.length <= 1) {
87
+ continue;
88
+ }
89
+ // For component join tables, check if THIS specific component instance's parent supports D&P
90
+ if (isRelationJoinTable && isComponentModel) {
91
+ try {
92
+ const componentSchema = strapi.components[sourceModel.uid];
93
+ if (!componentSchema) {
94
+ continue;
95
+ }
96
+ const parent = await findContentTypeParentForComponentInstance(componentSchema, sourceId);
97
+ if (!parent) {
98
+ continue;
99
+ }
100
+ // Check if THIS component instance's parent supports draft/publish
101
+ const parentContentType = strapi.contentTypes[parent.uid];
102
+ if (!parentContentType?.options?.draftAndPublish) {
103
+ continue;
104
+ }
105
+ // If we reach here, this component instance's parent DOES support D&P
106
+ // Continue to process this component instance for ghost relations
107
+ } catch (error) {
108
+ continue;
109
+ }
110
+ }
111
+ // Find ghost relations (same logic as original but with improved parent checking)
112
+ for (const entry of entries){
113
+ if (entry.target_published_at === null) {
114
+ // This is a draft target - find its published version
115
+ const draftTarget = await db.connection(targetModel.tableName).select('document_id').where('id', entry.target_id).first();
116
+ if (draftTarget) {
117
+ const publishedVersion = await db.connection(targetModel.tableName).select('id', 'document_id').where('document_id', draftTarget.document_id).whereNotNull('published_at').first();
118
+ if (publishedVersion) {
119
+ // Check if we also have a relation to the published version
120
+ const publishedRelation = entries.find((e)=>e.target_id === publishedVersion.id);
121
+ if (publishedRelation) {
122
+ ghostEntries.push(publishedRelation.join_id);
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+ return ghostEntries;
130
+ } catch (error) {
131
+ return [];
132
+ }
133
+ };
134
+
135
+ export { cleanComponentJoinTable };
136
+ //# 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 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","targetContentType","strapi","contentTypes","targetSupportsDraftPublish","options","draftAndPublish","ghostEntries","findPublicationStateMismatches","length","connection","whereIn","del","error","errorMessage","Error","message","String","findContentTypeParentForComponentInstance","componentSchema","componentId","parentSchemas","getParentSchemasForComponent","parent","findComponentParent","components","uid","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":";;AAIA;;;AAGC,IACYA,MAAAA,uBAAAA,GAA0B,OACrCC,EAAAA,EACAC,eACAC,QACAC,EAAAA,WAAAA,GAAAA;IAEA,IAAI;;AAEF,QAAA,MAAMC,cAAcJ,EAAGK,CAAAA,QAAQ,CAACC,GAAG,CAACJ,SAASK,MAAM,CAAA;AACnD,QAAA,IAAI,CAACH,WAAa,EAAA;AAChBJ,YAAAA,EAAAA,CAAGQ,MAAM,CAACC,KAAK,CAAC,CAAC,aAAa,EAAEP,QAAAA,CAASK,MAAM,CAAC,qBAAqB,EAAEN,cAAc,CAAC,CAAA;YACtF,OAAO,CAAA;AACT;;AAGA,QAAA,MAAMS,oBACJC,MAAOC,CAAAA,YAAY,CAACV,QAAAA,CAASK,MAAM,CAAqC;QAC1E,MAAMM,0BAAAA,GAA6BH,iBAAmBI,EAAAA,OAAAA,EAASC,eAAmB,IAAA,KAAA;AAElF,QAAA,IAAI,CAACF,0BAA4B,EAAA;YAC/B,OAAO,CAAA;AACT;;AAGA,QAAA,MAAMG,eAAe,MAAMC,8BAAAA,CACzBjB,EACAC,EAAAA,aAAAA,EACAC,UACAE,WACAD,EAAAA,WAAAA,CAAAA;QAGF,IAAIa,YAAAA,CAAaE,MAAM,KAAK,CAAG,EAAA;YAC7B,OAAO,CAAA;AACT;;QAGA,MAAMlB,EAAAA,CAAGmB,UAAU,CAAClB,aAAAA,CAAAA,CAAemB,OAAO,CAAC,IAAA,EAAMJ,cAAcK,GAAG,EAAA;AAClErB,QAAAA,EAAAA,CAAGQ,MAAM,CAACC,KAAK,CACb,CAAC,QAAQ,EAAEO,YAAAA,CAAaE,MAAM,CAAC,wDAAwD,EAAEjB,cAAc,CAAC,CAAA;AAG1G,QAAA,OAAOe,aAAaE,MAAM;AAC5B,KAAA,CAAE,OAAOI,KAAO,EAAA;AACd,QAAA,MAAMC,eAAeD,KAAiBE,YAAAA,KAAAA,GAAQF,KAAMG,CAAAA,OAAO,GAAGC,MAAOJ,CAAAA,KAAAA,CAAAA;QACrEtB,EAAGQ,CAAAA,MAAM,CAACc,KAAK,CAAC,CAAC,4BAA4B,EAAErB,aAAc,CAAA,GAAG,EAAEsB,YAAAA,CAAa,CAAC,CAAA;QAChF,OAAO,CAAA;AACT;AACF;AAEA,MAAMI,yCAAAA,GAA4C,OAChDC,eACAC,EAAAA,WAAAA,GAAAA;;AAGA,IAAA,MAAMC,gBAAgBC,4BAA6BH,CAAAA,eAAAA,CAAAA;IACnD,IAAIE,aAAAA,CAAcZ,MAAM,KAAK,CAAG,EAAA;;QAE9B,OAAO,IAAA;AACT;;AAGA,IAAA,MAAMc,MAAS,GAAA,MAAMC,mBAAoBL,CAAAA,eAAAA,EAAiBC,WAAaC,EAAAA,aAAAA,CAAAA;AACvE,IAAA,IAAI,CAACE,MAAQ,EAAA;;QAEX,OAAO,IAAA;AACT;AAEA,IAAA,IAAIrB,OAAOuB,UAAU,CAACF,MAAOG,CAAAA,GAAG,CAAmC,EAAE;;AAEnE,QAAA,MAAMC,wBAAwBzB,MAAOuB,CAAAA,UAAU,CAACF,MAAAA,CAAOG,GAAG,CAAmC;QAC7F,OAAOR,yCAAAA,CAA0CS,qBAAuBJ,EAAAA,MAAAA,CAAOK,QAAQ,CAAA;AACzF;AAEA,IAAA,IAAI1B,OAAOC,YAAY,CAACoB,MAAOG,CAAAA,GAAG,CAAqC,EAAE;;QAEvE,OAAOH,MAAAA;AACT;IAEA,OAAO,IAAA;AACT,CAAA;AAEA;;;AAGC,IACD,MAAMf,8BAAiC,GAAA,OACrCjB,EACAC,EAAAA,aAAAA,EACAC,UACAE,WACAD,EAAAA,WAAAA,GAAAA;IAEA,IAAI;;AAEF,QAAA,MAAMmC,eAAepC,QAASqC,CAAAA,SAAS,CAACC,UAAU,CAACC,IAAI;AACvD,QAAA,MAAMC,eAAexC,QAASqC,CAAAA,SAAS,CAACI,iBAAiB,CAACF,IAAI;;QAG9D,MAAMG,KAAAA,GAAQ5C,EACXmB,CAAAA,UAAU,CAAClB,aAAAA,CAAAA,CACX4C,MAAM,CACL,CAAC,EAAE5C,aAAc,CAAA,cAAc,CAAC,EAChC,CAAC,EAAEA,aAAc,CAAA,CAAC,EAAEqC,YAAAA,CAAa,aAAa,CAAC,EAC/C,CAAC,EAAErC,aAAAA,CAAc,CAAC,EAAEyC,YAAa,CAAA,aAAa,CAAC,EAC/C,CAAC,EAAEtC,WAAAA,CAAY0C,SAAS,CAAC,oCAAoC,CAAC,CAE/DC,CAAAA,QAAQ,CACP3C,WAAAA,CAAY0C,SAAS,EACrB,CAAC,EAAE7C,aAAc,CAAA,CAAC,EAAEyC,YAAAA,CAAa,CAAC,EAClC,CAAC,EAAEtC,WAAY0C,CAAAA,SAAS,CAAC,GAAG,CAAC,CAAA;AAGjC,QAAA,MAAME,cAAc,MAAMJ,KAAAA;;AAG1B,QAAA,MAAMK,kBAA4C,EAAC;QACnD,KAAK,MAAMC,SAASF,WAAa,CAAA;YAC/B,MAAMG,QAAAA,GAAWD,MAAME,SAAS;AAChC,YAAA,IAAI,CAACH,eAAe,CAACE,QAAAA,CAAS,EAAE;gBAC9BF,eAAe,CAACE,QAAS,CAAA,GAAG,EAAE;AAChC;AACAF,YAAAA,eAAe,CAACE,QAAAA,CAAS,CAACE,IAAI,CAACH,KAAAA,CAAAA;AACjC;AAEA,QAAA,MAAMlC,eAAyB,EAAE;;QAGjC,MAAMsC,mBAAAA,GAAsBrD,aAAcsD,CAAAA,QAAQ,CAAC,MAAA,CAAA;AACnD,QAAA,MAAMC,mBACJ,CAACrD,WAAAA,CAAYgC,GAAG,EAAEsB,WAAW,OAC7B,CAAA,IAAA,CAACtD,WAAYgC,CAAAA,GAAG,EAAEsB,UAAW,CAAA,UAAA,CAAA,IAC7BtD,WAAYgC,CAAAA,GAAG,EAAEuB,QAAS,CAAA,GAAA,CAAA;;QAG5B,KAAK,MAAM,CAACP,QAAUQ,EAAAA,OAAAA,CAAQ,IAAIC,MAAOD,CAAAA,OAAO,CAACV,eAAkB,CAAA,CAAA;;YAEjE,IAAIU,OAAAA,CAAQzC,MAAM,IAAI,CAAG,EAAA;AAEvB,gBAAA;AACF;;AAGA,YAAA,IAAIoC,uBAAuBE,gBAAkB,EAAA;gBAC3C,IAAI;AACF,oBAAA,MAAM5B,kBAAkBjB,MAAOuB,CAAAA,UAAU,CAAC/B,WAAAA,CAAYgC,GAAG,CAAC;AAC1D,oBAAA,IAAI,CAACP,eAAiB,EAAA;AAEpB,wBAAA;AACF;oBAEA,MAAMI,MAAAA,GAAS,MAAML,yCAAAA,CAA0CC,eAAiBuB,EAAAA,QAAAA,CAAAA;AAChF,oBAAA,IAAI,CAACnB,MAAQ,EAAA;AACX,wBAAA;AACF;;AAGA,oBAAA,MAAM6B,oBACJlD,MAAOC,CAAAA,YAAY,CAACoB,MAAAA,CAAOG,GAAG,CAAqC;oBACrE,IAAI,CAAC0B,iBAAmB/C,EAAAA,OAAAA,EAASC,eAAiB,EAAA;AAGhD,wBAAA;AACF;;;AAIF,iBAAA,CAAE,OAAOO,KAAO,EAAA;AAGd,oBAAA;AACF;AACF;;YAGA,KAAK,MAAM4B,SAASS,OAAS,CAAA;gBAC3B,IAAIT,KAAAA,CAAMY,mBAAmB,KAAK,IAAM,EAAA;;AAEtC,oBAAA,MAAMC,cAAc,MAAM/D,EAAAA,CACvBmB,UAAU,CAACf,YAAY0C,SAAS,CAAA,CAChCD,MAAM,CAAC,eACPmB,KAAK,CAAC,MAAMd,KAAMe,CAAAA,SAAS,EAC3BC,KAAK,EAAA;AAER,oBAAA,IAAIH,WAAa,EAAA;wBACf,MAAMI,gBAAAA,GAAmB,MAAMnE,EAC5BmB,CAAAA,UAAU,CAACf,WAAY0C,CAAAA,SAAS,EAChCD,MAAM,CAAC,MAAM,aACbmB,CAAAA,CAAAA,KAAK,CAAC,aAAeD,EAAAA,WAAAA,CAAYK,WAAW,CAC5CC,CAAAA,YAAY,CAAC,cAAA,CAAA,CACbH,KAAK,EAAA;AAER,wBAAA,IAAIC,gBAAkB,EAAA;;4BAEpB,MAAMG,iBAAAA,GAAoBX,OAAQY,CAAAA,IAAI,CAAC,CAACC,IAAMA,CAAEP,CAAAA,SAAS,KAAKE,gBAAAA,CAAiBM,EAAE,CAAA;AACjF,4BAAA,IAAIH,iBAAmB,EAAA;gCACrBtD,YAAaqC,CAAAA,IAAI,CAACiB,iBAAAA,CAAkBI,OAAO,CAAA;AAC7C;AACF;AACF;AACF;AACF;AACF;QAEA,OAAO1D,YAAAA;AACT,KAAA,CAAE,OAAOM,KAAO,EAAA;AACd,QAAA,OAAO,EAAE;AACX;AACF,CAAA;;;;"}