@strapi/core 0.0.0-experimental.3f7b2587c5e3d548262671895cf11d8bf8c9166e → 0.0.0-experimental.90ca9123352ed07e0a9cedaf4bcad1475e74137f

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 (262) hide show
  1. package/dist/Strapi.d.ts.map +1 -1
  2. package/dist/Strapi.js +7 -3
  3. package/dist/Strapi.js.map +1 -1
  4. package/dist/Strapi.mjs +6 -2
  5. package/dist/Strapi.mjs.map +1 -1
  6. package/dist/core-api/controller/collection-type.d.ts +1 -1
  7. package/dist/core-api/controller/collection-type.d.ts.map +1 -1
  8. package/dist/core-api/controller/collection-type.js +9 -20
  9. package/dist/core-api/controller/collection-type.js.map +1 -1
  10. package/dist/core-api/controller/collection-type.mjs +8 -20
  11. package/dist/core-api/controller/collection-type.mjs.map +1 -1
  12. package/dist/core-api/controller/index.d.ts.map +1 -1
  13. package/dist/core-api/controller/index.js +2 -2
  14. package/dist/core-api/controller/index.js.map +1 -1
  15. package/dist/core-api/controller/index.mjs +2 -2
  16. package/dist/core-api/controller/index.mjs.map +1 -1
  17. package/dist/core-api/controller/single-type.d.ts +1 -1
  18. package/dist/core-api/controller/single-type.d.ts.map +1 -1
  19. package/dist/core-api/controller/single-type.js +6 -11
  20. package/dist/core-api/controller/single-type.js.map +1 -1
  21. package/dist/core-api/controller/single-type.mjs +5 -11
  22. package/dist/core-api/controller/single-type.mjs.map +1 -1
  23. package/dist/core-api/controller/transform.d.ts +2 -11
  24. package/dist/core-api/controller/transform.d.ts.map +1 -1
  25. package/dist/core-api/controller/transform.js +2 -16
  26. package/dist/core-api/controller/transform.js.map +1 -1
  27. package/dist/core-api/controller/transform.mjs +2 -16
  28. package/dist/core-api/controller/transform.mjs.map +1 -1
  29. package/dist/core-api/service/collection-type.d.ts +28 -5
  30. package/dist/core-api/service/collection-type.d.ts.map +1 -1
  31. package/dist/core-api/service/collection-type.js +47 -49
  32. package/dist/core-api/service/collection-type.js.map +1 -1
  33. package/dist/core-api/service/collection-type.mjs +47 -50
  34. package/dist/core-api/service/collection-type.mjs.map +1 -1
  35. package/dist/core-api/service/core-service.d.ts +4 -0
  36. package/dist/core-api/service/core-service.d.ts.map +1 -0
  37. package/dist/core-api/service/core-service.js +12 -0
  38. package/dist/core-api/service/core-service.js.map +1 -0
  39. package/dist/core-api/service/core-service.mjs +12 -0
  40. package/dist/core-api/service/core-service.mjs.map +1 -0
  41. package/dist/core-api/service/index.js +2 -2
  42. package/dist/core-api/service/index.js.map +1 -1
  43. package/dist/core-api/service/index.mjs +4 -4
  44. package/dist/core-api/service/index.mjs.map +1 -1
  45. package/dist/core-api/service/pagination.d.ts +1 -5
  46. package/dist/core-api/service/pagination.d.ts.map +1 -1
  47. package/dist/core-api/service/pagination.js +0 -11
  48. package/dist/core-api/service/pagination.js.map +1 -1
  49. package/dist/core-api/service/pagination.mjs +0 -11
  50. package/dist/core-api/service/pagination.mjs.map +1 -1
  51. package/dist/core-api/service/single-type.d.ts +13 -8
  52. package/dist/core-api/service/single-type.d.ts.map +1 -1
  53. package/dist/core-api/service/single-type.js +25 -51
  54. package/dist/core-api/service/single-type.js.map +1 -1
  55. package/dist/core-api/service/single-type.mjs +24 -51
  56. package/dist/core-api/service/single-type.mjs.map +1 -1
  57. package/dist/factories.d.ts.map +1 -1
  58. package/dist/factories.js +2 -12
  59. package/dist/factories.js.map +1 -1
  60. package/dist/factories.mjs +2 -12
  61. package/dist/factories.mjs.map +1 -1
  62. package/dist/registries/content-types.d.ts.map +1 -1
  63. package/dist/registries/content-types.js +1 -2
  64. package/dist/registries/content-types.js.map +1 -1
  65. package/dist/registries/content-types.mjs +1 -2
  66. package/dist/registries/content-types.mjs.map +1 -1
  67. package/dist/services/document-service/collection-type.d.ts +4 -0
  68. package/dist/services/document-service/collection-type.d.ts.map +1 -0
  69. package/dist/services/document-service/collection-type.js +145 -0
  70. package/dist/services/document-service/collection-type.js.map +1 -0
  71. package/dist/services/document-service/collection-type.mjs +145 -0
  72. package/dist/services/document-service/collection-type.mjs.map +1 -0
  73. package/dist/services/document-service/common.d.ts +4 -0
  74. package/dist/services/document-service/common.d.ts.map +1 -0
  75. package/dist/services/document-service/common.js +7 -0
  76. package/dist/services/document-service/common.js.map +1 -0
  77. package/dist/services/document-service/common.mjs +7 -0
  78. package/dist/services/document-service/common.mjs.map +1 -0
  79. package/dist/services/document-service/document-engine.d.ts.map +1 -1
  80. package/dist/services/document-service/document-engine.js +130 -81
  81. package/dist/services/document-service/document-engine.js.map +1 -1
  82. package/dist/services/document-service/document-engine.mjs +125 -76
  83. package/dist/services/document-service/document-engine.mjs.map +1 -1
  84. package/dist/services/document-service/draft-and-publish.d.ts +24 -0
  85. package/dist/services/document-service/draft-and-publish.d.ts.map +1 -0
  86. package/dist/services/document-service/draft-and-publish.js +41 -0
  87. package/dist/services/document-service/draft-and-publish.js.map +1 -0
  88. package/dist/services/document-service/draft-and-publish.mjs +41 -0
  89. package/dist/services/document-service/draft-and-publish.mjs.map +1 -0
  90. package/dist/services/document-service/{document-service.d.ts → index.d.ts} +2 -4
  91. package/dist/services/document-service/index.d.ts.map +1 -0
  92. package/dist/services/document-service/index.js +22 -0
  93. package/dist/services/document-service/index.js.map +1 -0
  94. package/dist/services/document-service/index.mjs +22 -0
  95. package/dist/services/document-service/index.mjs.map +1 -0
  96. package/dist/services/document-service/internationalization.d.ts +7 -0
  97. package/dist/services/document-service/internationalization.d.ts.map +1 -0
  98. package/dist/services/document-service/internationalization.js +40 -0
  99. package/dist/services/document-service/internationalization.js.map +1 -0
  100. package/dist/services/document-service/internationalization.mjs +40 -0
  101. package/dist/services/document-service/internationalization.mjs.map +1 -0
  102. package/dist/services/document-service/middlewares.d.ts +8 -0
  103. package/dist/services/document-service/middlewares.d.ts.map +1 -0
  104. package/dist/services/document-service/middlewares.js +46 -0
  105. package/dist/services/document-service/middlewares.js.map +1 -0
  106. package/dist/services/document-service/middlewares.mjs +46 -0
  107. package/dist/services/document-service/middlewares.mjs.map +1 -0
  108. package/dist/services/document-service/repository-factory.d.ts +3 -0
  109. package/dist/services/document-service/repository-factory.d.ts.map +1 -0
  110. package/dist/services/document-service/repository-factory.js +12 -0
  111. package/dist/services/document-service/repository-factory.js.map +1 -0
  112. package/dist/services/document-service/repository-factory.mjs +12 -0
  113. package/dist/services/document-service/repository-factory.mjs.map +1 -0
  114. package/dist/services/document-service/single-type.d.ts +4 -0
  115. package/dist/services/document-service/single-type.d.ts.map +1 -0
  116. package/dist/services/document-service/single-type.js +92 -0
  117. package/dist/services/document-service/single-type.js.map +1 -0
  118. package/dist/services/document-service/single-type.mjs +92 -0
  119. package/dist/services/document-service/single-type.mjs.map +1 -0
  120. package/dist/services/document-service/transform/data.d.ts +5 -0
  121. package/dist/services/document-service/transform/data.d.ts.map +1 -0
  122. package/dist/services/document-service/transform/data.js +13 -0
  123. package/dist/services/document-service/transform/data.js.map +1 -0
  124. package/dist/services/document-service/transform/data.mjs +13 -0
  125. package/dist/services/document-service/transform/data.mjs.map +1 -0
  126. package/dist/services/document-service/transform/fields.d.ts +5 -0
  127. package/dist/services/document-service/transform/fields.d.ts.map +1 -0
  128. package/dist/services/document-service/transform/fields.js +23 -0
  129. package/dist/services/document-service/transform/fields.js.map +1 -0
  130. package/dist/services/document-service/transform/fields.mjs +23 -0
  131. package/dist/services/document-service/transform/fields.mjs.map +1 -0
  132. package/dist/services/document-service/transform/filters.d.ts +3 -0
  133. package/dist/services/document-service/transform/filters.d.ts.map +1 -0
  134. package/dist/services/document-service/transform/filters.js +49 -0
  135. package/dist/services/document-service/transform/filters.js.map +1 -0
  136. package/dist/services/document-service/transform/filters.mjs +49 -0
  137. package/dist/services/document-service/transform/filters.mjs.map +1 -0
  138. package/dist/services/document-service/transform/id-map.d.ts +23 -0
  139. package/dist/services/document-service/transform/id-map.d.ts.map +1 -0
  140. package/dist/services/document-service/transform/id-map.js +72 -0
  141. package/dist/services/document-service/transform/id-map.js.map +1 -0
  142. package/dist/services/document-service/transform/id-map.mjs +72 -0
  143. package/dist/services/document-service/transform/id-map.mjs.map +1 -0
  144. package/dist/services/document-service/transform/id-transform.d.ts +26 -0
  145. package/dist/services/document-service/transform/id-transform.d.ts.map +1 -0
  146. package/dist/services/document-service/transform/id-transform.js +57 -0
  147. package/dist/services/document-service/transform/id-transform.js.map +1 -0
  148. package/dist/services/document-service/transform/id-transform.mjs +57 -0
  149. package/dist/services/document-service/transform/id-transform.mjs.map +1 -0
  150. package/dist/services/document-service/transform/populate.d.ts +3 -0
  151. package/dist/services/document-service/transform/populate.d.ts.map +1 -0
  152. package/dist/services/document-service/transform/populate.js +31 -0
  153. package/dist/services/document-service/transform/populate.js.map +1 -0
  154. package/dist/services/document-service/transform/populate.mjs +31 -0
  155. package/dist/services/document-service/transform/populate.mjs.map +1 -0
  156. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts +13 -0
  157. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts.map +1 -0
  158. package/dist/services/document-service/transform/relations/extract/data-ids.js +76 -0
  159. package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -0
  160. package/dist/services/document-service/transform/relations/extract/data-ids.mjs +76 -0
  161. package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -0
  162. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts +10 -0
  163. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts.map +1 -0
  164. package/dist/services/document-service/transform/relations/transform/data-ids.js +115 -0
  165. package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -0
  166. package/dist/services/document-service/transform/relations/transform/data-ids.mjs +115 -0
  167. package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -0
  168. package/dist/services/document-service/transform/relations/transform/output-ids.d.ts +4 -0
  169. package/dist/services/document-service/transform/relations/transform/output-ids.d.ts.map +1 -0
  170. package/dist/services/document-service/transform/relations/transform/output-ids.js +26 -0
  171. package/dist/services/document-service/transform/relations/transform/output-ids.js.map +1 -0
  172. package/dist/services/document-service/transform/relations/transform/output-ids.mjs +26 -0
  173. package/dist/services/document-service/transform/relations/transform/output-ids.mjs.map +1 -0
  174. package/dist/services/document-service/transform/relations/utils/data.d.ts +6 -0
  175. package/dist/services/document-service/transform/relations/utils/data.d.ts.map +1 -0
  176. package/dist/services/document-service/transform/relations/utils/data.js +12 -0
  177. package/dist/services/document-service/transform/relations/utils/data.js.map +1 -0
  178. package/dist/services/document-service/transform/relations/utils/data.mjs +12 -0
  179. package/dist/services/document-service/transform/relations/utils/data.mjs.map +1 -0
  180. package/dist/services/document-service/transform/relations/utils/i18n.d.ts +10 -0
  181. package/dist/services/document-service/transform/relations/utils/i18n.d.ts.map +1 -0
  182. package/dist/services/document-service/transform/relations/utils/i18n.js +31 -0
  183. package/dist/services/document-service/transform/relations/utils/i18n.js.map +1 -0
  184. package/dist/services/document-service/transform/relations/utils/i18n.mjs +31 -0
  185. package/dist/services/document-service/transform/relations/utils/i18n.mjs.map +1 -0
  186. package/dist/services/document-service/transform/relations/utils/types.d.ts +8 -0
  187. package/dist/services/document-service/transform/relations/utils/types.d.ts.map +1 -0
  188. package/dist/services/document-service/transform/sort.d.ts +5 -0
  189. package/dist/services/document-service/transform/sort.d.ts.map +1 -0
  190. package/dist/services/document-service/transform/sort.js +44 -0
  191. package/dist/services/document-service/transform/sort.js.map +1 -0
  192. package/dist/services/document-service/transform/sort.mjs +44 -0
  193. package/dist/services/document-service/transform/sort.mjs.map +1 -0
  194. package/dist/services/document-service/transform/types.d.ts +13 -0
  195. package/dist/services/document-service/transform/types.d.ts.map +1 -0
  196. package/dist/services/document-service/transform/utils.d.ts +9 -0
  197. package/dist/services/document-service/transform/utils.d.ts.map +1 -0
  198. package/dist/services/document-service/transform/utils.js +23 -0
  199. package/dist/services/document-service/transform/utils.js.map +1 -0
  200. package/dist/services/document-service/transform/utils.mjs +23 -0
  201. package/dist/services/document-service/transform/utils.mjs.map +1 -0
  202. package/dist/services/document-service/utils/populate.d.ts +3 -0
  203. package/dist/services/document-service/utils/populate.d.ts.map +1 -0
  204. package/dist/services/document-service/utils/populate.js +41 -0
  205. package/dist/services/document-service/utils/populate.js.map +1 -0
  206. package/dist/services/document-service/utils/populate.mjs +41 -0
  207. package/dist/services/document-service/utils/populate.mjs.map +1 -0
  208. package/dist/services/entity-validator/blocks-validator.d.ts.map +1 -1
  209. package/dist/services/entity-validator/blocks-validator.js +22 -2
  210. package/dist/services/entity-validator/blocks-validator.js.map +1 -1
  211. package/dist/services/entity-validator/blocks-validator.mjs +22 -2
  212. package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
  213. package/dist/services/entity-validator/validators.d.ts.map +1 -1
  214. package/dist/services/entity-validator/validators.js +7 -8
  215. package/dist/services/entity-validator/validators.js.map +1 -1
  216. package/dist/services/entity-validator/validators.mjs +7 -8
  217. package/dist/services/entity-validator/validators.mjs.map +1 -1
  218. package/dist/services/server/compose-endpoint.d.ts.map +1 -1
  219. package/dist/services/server/compose-endpoint.js +3 -0
  220. package/dist/services/server/compose-endpoint.js.map +1 -1
  221. package/dist/services/server/compose-endpoint.mjs +3 -0
  222. package/dist/services/server/compose-endpoint.mjs.map +1 -1
  223. package/dist/services/webhook-store.js +2 -2
  224. package/dist/services/webhook-store.js.map +1 -1
  225. package/dist/services/webhook-store.mjs +2 -2
  226. package/dist/services/webhook-store.mjs.map +1 -1
  227. package/package.json +14 -14
  228. package/dist/core-api/service/get-fetch-params.d.ts +0 -7
  229. package/dist/core-api/service/get-fetch-params.d.ts.map +0 -1
  230. package/dist/core-api/service/get-fetch-params.js +0 -14
  231. package/dist/core-api/service/get-fetch-params.js.map +0 -1
  232. package/dist/core-api/service/get-fetch-params.mjs +0 -14
  233. package/dist/core-api/service/get-fetch-params.mjs.map +0 -1
  234. package/dist/services/document-service/document-service.d.ts.map +0 -1
  235. package/dist/services/document-service/document-service.js +0 -132
  236. package/dist/services/document-service/document-service.js.map +0 -1
  237. package/dist/services/document-service/document-service.mjs +0 -132
  238. package/dist/services/document-service/document-service.mjs.map +0 -1
  239. package/dist/services/document-service/middlewares/defaults/draft-and-publish.d.ts +0 -26
  240. package/dist/services/document-service/middlewares/defaults/draft-and-publish.d.ts.map +0 -1
  241. package/dist/services/document-service/middlewares/defaults/draft-and-publish.js +0 -58
  242. package/dist/services/document-service/middlewares/defaults/draft-and-publish.js.map +0 -1
  243. package/dist/services/document-service/middlewares/defaults/draft-and-publish.mjs +0 -58
  244. package/dist/services/document-service/middlewares/defaults/draft-and-publish.mjs.map +0 -1
  245. package/dist/services/document-service/middlewares/defaults/index.d.ts +0 -3
  246. package/dist/services/document-service/middlewares/defaults/index.d.ts.map +0 -1
  247. package/dist/services/document-service/middlewares/defaults/index.js +0 -82
  248. package/dist/services/document-service/middlewares/defaults/index.js.map +0 -1
  249. package/dist/services/document-service/middlewares/defaults/index.mjs +0 -82
  250. package/dist/services/document-service/middlewares/defaults/index.mjs.map +0 -1
  251. package/dist/services/document-service/middlewares/defaults/locales.d.ts +0 -18
  252. package/dist/services/document-service/middlewares/defaults/locales.d.ts.map +0 -1
  253. package/dist/services/document-service/middlewares/defaults/locales.js +0 -50
  254. package/dist/services/document-service/middlewares/defaults/locales.js.map +0 -1
  255. package/dist/services/document-service/middlewares/defaults/locales.mjs +0 -50
  256. package/dist/services/document-service/middlewares/defaults/locales.mjs.map +0 -1
  257. package/dist/services/document-service/middlewares/index.d.ts +0 -11
  258. package/dist/services/document-service/middlewares/index.d.ts.map +0 -1
  259. package/dist/services/document-service/middlewares/index.js +0 -59
  260. package/dist/services/document-service/middlewares/index.js.map +0 -1
  261. package/dist/services/document-service/middlewares/index.mjs +0 -59
  262. package/dist/services/document-service/middlewares/index.mjs.map +0 -1
@@ -1,104 +1,106 @@
1
1
  "use strict";
2
2
  const strapiUtils = require("@strapi/utils");
3
3
  const _ = require("lodash/fp");
4
- const uploadFiles = require("../utils/upload-files.js");
5
4
  const components = require("../entity-service/components.js");
6
5
  const transformContentTypesToModels = require("../../utils/transform-content-types-to-models.js");
7
6
  const index$1 = require("../entity-service/attributes/index.js");
8
7
  const index = require("../entity-validator/index.js");
9
8
  const params = require("../entity-service/params.js");
9
+ const idTransform = require("./transform/id-transform.js");
10
+ const populate = require("./utils/populate.js");
11
+ const outputIds = require("./transform/relations/transform/output-ids.js");
12
+ const data = require("./transform/data.js");
10
13
  const { transformParamsToQuery } = strapiUtils.convertQueryParams;
11
- const createPipeline = (data, context) => {
12
- return index$1.applyTransforms(data, context);
14
+ const createPipeline = (data2, context) => {
15
+ return index$1.applyTransforms(data2, context);
13
16
  };
14
- const updatePipeline = (data, context) => {
15
- return index$1.applyTransforms(data, context);
17
+ const updatePipeline = (data2, context) => {
18
+ return index$1.applyTransforms(data2, context);
16
19
  };
17
20
  const createDocumentEngine = ({
18
21
  strapi,
19
22
  db
20
23
  }) => ({
21
- uploadFiles,
22
24
  async findMany(uid, params2) {
23
- const { kind } = strapi.getModel(uid);
24
- const query = transformParamsToQuery(uid, params2 || {});
25
- query.where = { ...params2?.lookup, ...query.where };
26
- if (kind === "singleType") {
27
- return db.query(uid).findOne(query);
28
- }
29
- return db.query(uid).findMany(query);
25
+ const query = await strapiUtils.pipeAsync(
26
+ (params22) => idTransform.transformParamsDocumentId(uid, params22, { isDraft: true, locale: params22.locale }),
27
+ (params22) => transformParamsToQuery(uid, params22),
28
+ (query2) => _.set("where", { ...params2?.lookup, ...query2.where }, query2)
29
+ )(params2 || {});
30
+ return db.query(uid).findMany(query).then((doc) => idTransform.transformOutputDocumentId(uid, doc));
30
31
  },
31
32
  async findFirst(uid, params2) {
32
- const query = transformParamsToQuery(uid, params2 || {});
33
- return db.query(uid).findOne({ ...query, where: { ...params2?.lookup, ...query.where } });
33
+ const query = await strapiUtils.pipeAsync(
34
+ (params22) => idTransform.transformParamsDocumentId(uid, params22, { isDraft: true, locale: params22.locale }),
35
+ (params22) => transformParamsToQuery(uid, params22)
36
+ )(params2 || {});
37
+ return db.query(uid).findOne({ ...query, where: { ...params2?.lookup, ...query.where } }).then((doc) => idTransform.transformOutputDocumentId(uid, doc));
34
38
  },
35
39
  async findOne(uid, documentId, params2) {
36
- const query = transformParamsToQuery(uid, params2 || {});
37
- return db.query(uid).findOne({ ...query, where: { ...params2?.lookup, ...query.where, documentId } });
40
+ const query = await strapiUtils.pipeAsync(
41
+ (params22) => idTransform.transformParamsDocumentId(uid, params22, { isDraft: true, locale: params22.locale }),
42
+ (params22) => transformParamsToQuery(uid, params22)
43
+ )(params2 || {});
44
+ return db.query(uid).findOne({ ...query, where: { ...params2?.lookup, ...query.where, documentId } }).then((doc) => idTransform.transformOutputDocumentId(uid, doc));
38
45
  },
39
46
  async delete(uid, documentId, params2 = {}) {
40
- const query = transformParamsToQuery(uid, params2);
47
+ const query = await strapiUtils.pipeAsync(
48
+ // TODO: What if we are deleting more than one locale / publication state?
49
+ (params22) => idTransform.transformParamsDocumentId(uid, params22, { isDraft: true, locale: params22.locale }),
50
+ (params22) => transformParamsToQuery(uid, params22),
51
+ (query2) => _.set("where", { ...params2?.lookup, ...query2.where, documentId }, query2)
52
+ )(params2);
41
53
  if (params2.status === "draft") {
42
54
  throw new Error("Cannot delete a draft document");
43
55
  }
44
- const entriesToDelete = await db.query(uid).findMany({
45
- ...query,
46
- where: {
47
- ...params2.lookup,
48
- ...query?.where,
49
- documentId
50
- }
51
- });
56
+ const entriesToDelete = await db.query(uid).findMany(query);
52
57
  await strapiUtils.mapAsync(entriesToDelete, async (entryToDelete) => {
53
- const componentsToDelete = await components.getComponents(uid, entryToDelete);
54
- await db.query(uid).delete({ where: { id: entryToDelete.id } });
55
- await components.deleteComponents(uid, componentsToDelete, { loadComponents: false });
58
+ await this.deleteEntry(uid, entryToDelete.id);
56
59
  });
57
- return { versions: entriesToDelete };
60
+ return { deletedEntries: entriesToDelete.length };
58
61
  },
59
- // TODO: should we provide two separate methods?
60
- async deleteMany(uid, paramsOrIds) {
61
- let queryParams;
62
- if (_.isArray(paramsOrIds)) {
63
- queryParams = { filter: { documentID: { $in: paramsOrIds } } };
64
- } else {
65
- queryParams = paramsOrIds;
66
- }
67
- const query = transformParamsToQuery(uid, queryParams || {});
68
- return db.query(uid).deleteMany(query);
62
+ async deleteEntry(uid, entryId) {
63
+ const componentsToDelete = await components.getComponents(uid, { id: entryId });
64
+ await db.query(uid).delete({ where: { id: entryId } });
65
+ await components.deleteComponents(uid, componentsToDelete, { loadComponents: false });
69
66
  },
70
67
  async create(uid, params$1) {
71
- const { data } = params$1;
72
- if (!data) {
68
+ const { data: data2, ...restParams } = await idTransform.transformParamsDocumentId(uid, params$1, {
69
+ locale: params$1.locale,
70
+ // @ts-expect-error - published at is not always present
71
+ // User can not set publishedAt on create, but other methods in the engine can (publish)
72
+ isDraft: !params$1.data?.publishedAt
73
+ });
74
+ const query = transformParamsToQuery(uid, params.pickSelectionParams(restParams));
75
+ if (!params$1.data) {
73
76
  throw new Error("Create requires data attribute");
74
77
  }
75
- const model = strapi.getModel(uid);
76
- const validData = await index.validateEntityCreation(model, data, {
77
- isDraft: true,
78
+ const contentType = strapi.contentType(uid);
79
+ const validData = await index.validateEntityCreation(contentType, data2, {
80
+ isDraft: !data2.publishedAt,
78
81
  locale: params$1?.locale
79
82
  });
80
83
  const componentData = await components.createComponents(uid, validData);
81
84
  const entryData = createPipeline(
82
- Object.assign(components.omitComponentData(model, validData), componentData),
83
- {
84
- contentType: model
85
- }
85
+ Object.assign(components.omitComponentData(contentType, validData), componentData),
86
+ { contentType }
86
87
  );
87
- const query = transformParamsToQuery(uid, params.pickSelectionParams(params$1));
88
- return db.query(uid).create({ ...query, data: entryData });
88
+ return db.query(uid).create({ ...query, data: entryData }).then((doc) => idTransform.transformOutputDocumentId(uid, doc));
89
89
  },
90
90
  // NOTE: What happens if user doesn't provide specific publications state and locale to update?
91
91
  async update(uid, documentId, params$1) {
92
- const { data } = params$1 || {};
93
- const model = strapi.getModel(uid);
94
- const query = transformParamsToQuery(uid, params.pickSelectionParams(params$1 || {}));
92
+ const { data: data2, ...restParams } = await idTransform.transformParamsDocumentId(uid, params$1 || {}, {
93
+ isDraft: true,
94
+ locale: params$1?.locale
95
+ });
96
+ const query = transformParamsToQuery(uid, params.pickSelectionParams(restParams || {}));
97
+ const model = strapi.contentType(uid);
95
98
  const entryToUpdate = await db.query(uid).findOne({ ...query, where: { ...params$1?.lookup, ...query?.where, documentId } });
96
- if (!entryToUpdate) {
99
+ if (!entryToUpdate)
97
100
  return null;
98
- }
99
101
  const validData = await index.validateEntityUpdate(
100
102
  model,
101
- data,
103
+ data2,
102
104
  {
103
105
  isDraft: true,
104
106
  // Always update the draft version
@@ -111,17 +113,23 @@ const createDocumentEngine = ({
111
113
  Object.assign(components.omitComponentData(model, validData), componentData),
112
114
  { contentType: model }
113
115
  );
114
- return db.query(uid).update({ ...query, where: { id: entryToUpdate.id }, data: entryData });
116
+ return db.query(uid).update({ ...query, where: { id: entryToUpdate.id }, data: entryData }).then((doc) => idTransform.transformOutputDocumentId(uid, doc));
115
117
  },
116
118
  async count(uid, params2 = void 0) {
117
- const query = transformParamsToQuery(uid, params2 || {});
118
- query.where = { ...params2?.lookup, ...query.where };
119
+ const query = await strapiUtils.pipeAsync(
120
+ (params22) => idTransform.transformParamsDocumentId(uid, params22, { isDraft: true, locale: params22.locale }),
121
+ (params22) => transformParamsToQuery(uid, params22),
122
+ (query2) => _.set("where", { ...params2?.lookup, ...query2.where }, query2)
123
+ )(params2 || {});
119
124
  return db.query(uid).count(query);
120
125
  },
121
126
  async clone(uid, documentId, params$1) {
122
- const { data = {} } = params$1;
123
- const model = strapi.getModel(uid);
124
- const query = transformParamsToQuery(uid, params.pickSelectionParams(params$1));
127
+ const { data: data2, ...restParams } = await idTransform.transformParamsDocumentId(uid, params$1 || {}, {
128
+ isDraft: true,
129
+ locale: params$1?.locale
130
+ });
131
+ const query = transformParamsToQuery(uid, params.pickSelectionParams(restParams));
132
+ const model = strapi.contentType(uid);
125
133
  const entries = await db.query(uid).findMany({
126
134
  ...query,
127
135
  where: { ...params$1?.lookup, ...query.where, documentId }
@@ -131,11 +139,11 @@ const createDocumentEngine = ({
131
139
  }
132
140
  const newDocumentId = transformContentTypesToModels.createDocumentId();
133
141
  const versions = await strapiUtils.mapAsync(entries, async (entryToClone) => {
134
- const isDraft = strapiUtils.contentTypes.isDraft(data);
142
+ const isDraft = strapiUtils.contentTypes.isDraft(data2);
135
143
  const validData = await index.validateEntityUpdate(
136
144
  model,
137
145
  // Omit id fields, the cloned entity id will be generated by the database
138
- _.omit(["id"], data),
146
+ _.omit(["id"], data2),
139
147
  { isDraft, ...params$1?.lookup },
140
148
  entryToClone
141
149
  );
@@ -148,7 +156,7 @@ const createDocumentEngine = ({
148
156
  ...query,
149
157
  // Allows entityData to override the documentId (e.g. when publishing)
150
158
  data: { documentId: newDocumentId, ...entityData, locale: entryToClone.locale }
151
- });
159
+ }).then((doc) => idTransform.transformOutputDocumentId(uid, doc));
152
160
  });
153
161
  return { id: newDocumentId, versions };
154
162
  },
@@ -158,23 +166,46 @@ const createDocumentEngine = ({
158
166
  ...params2,
159
167
  lookup: { ...params2?.lookup, publishedAt: { $ne: null } }
160
168
  });
161
- const clonedDocuments = await this.clone(uid, documentId, {
162
- ...params2 || {},
163
- // @ts-expect-error - Generic type does not have publishedAt attribute by default
164
- data: { documentId, publishedAt: /* @__PURE__ */ new Date() }
169
+ const entriesToPublish = await strapi.db?.query(uid).findMany({
170
+ where: {
171
+ ...params2?.lookup,
172
+ documentId,
173
+ publishedAt: null
174
+ },
175
+ populate: populate.getDeepPopulate(uid)
165
176
  });
166
- return { versions: clonedDocuments?.versions || [] };
177
+ const publishedEntries = await strapiUtils.mapAsync(
178
+ entriesToPublish,
179
+ strapiUtils.pipeAsync(
180
+ _.set("publishedAt", /* @__PURE__ */ new Date()),
181
+ _.set("documentId", documentId),
182
+ _.omit("id"),
183
+ // draft entryId -> documentId
184
+ (entry) => outputIds.transformOutputIds(uid, entry),
185
+ // documentId -> published entryId
186
+ (entry) => {
187
+ const opts = { uid, locale: entry.locale, isDraft: false, allowMissingId: true };
188
+ return data.transformData(entry, opts);
189
+ },
190
+ // Create the published entry
191
+ (data2) => this.create(uid, { ...params2, data: data2, locale: data2.locale })
192
+ )
193
+ );
194
+ return { versions: publishedEntries };
167
195
  },
168
196
  async unpublish(uid, documentId, params2) {
169
197
  return this.delete(uid, documentId, {
170
198
  ...params2,
171
199
  lookup: { ...params2?.lookup, publishedAt: { $ne: null } }
172
- });
200
+ }).then(({ deletedEntries }) => ({ versions: deletedEntries }));
173
201
  },
174
202
  /**
175
203
  * Steps:
176
204
  * - Delete the matching draft versions (publishedAt = null)
177
205
  * - Clone the matching published versions into draft versions
206
+ *
207
+ * If the document has a published version, the draft version will be created from the published version.
208
+ * If the document has no published version, the version will be removed.
178
209
  */
179
210
  async discardDraft(uid, documentId, params2) {
180
211
  await this.delete(uid, documentId, {
@@ -182,19 +213,37 @@ const createDocumentEngine = ({
182
213
  // Delete all drafts that match query
183
214
  lookup: { ...params2?.lookup, publishedAt: null }
184
215
  });
185
- const clonedDocuments = await this.clone(uid, documentId, {
186
- ...params2 || {},
187
- // Clone only published versions
188
- lookup: { ...params2?.lookup, publishedAt: { $ne: null } },
189
- // @ts-expect-error - Generic type does not have publishedAt attribute by default
190
- data: { documentId, publishedAt: null }
216
+ const entriesToDraft = await strapi.db?.query(uid).findMany({
217
+ where: {
218
+ ...params2?.lookup,
219
+ documentId,
220
+ publishedAt: { $ne: null }
221
+ },
222
+ populate: populate.getDeepPopulate(uid)
191
223
  });
192
- return { versions: clonedDocuments?.versions || [] };
224
+ const draftEntries = await strapiUtils.mapAsync(
225
+ entriesToDraft,
226
+ strapiUtils.pipeAsync(
227
+ _.set("publishedAt", null),
228
+ _.set("documentId", documentId),
229
+ _.omit("id"),
230
+ // published entryId -> document
231
+ (entry) => outputIds.transformOutputIds(uid, entry),
232
+ // documentId -> draft entryId
233
+ (entry) => {
234
+ const opts = { uid, locale: entry.locale, isDraft: true, allowMissingId: true };
235
+ return data.transformData(entry, opts);
236
+ },
237
+ // Create the draft entry
238
+ (data2) => this.create(uid, { ...params2, locale: data2.locale, data: data2 })
239
+ )
240
+ );
241
+ return { versions: draftEntries };
193
242
  }
194
243
  });
195
- const createDocumentRepository = (ctx) => {
244
+ const createDocumentEngine$1 = (ctx) => {
196
245
  const implementation = createDocumentEngine(ctx);
197
246
  return implementation;
198
247
  };
199
- module.exports = createDocumentRepository;
248
+ module.exports = createDocumentEngine$1;
200
249
  //# sourceMappingURL=document-engine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"document-engine.js","sources":["../../../src/services/document-service/document-engine.ts"],"sourcesContent":["import type { Database } from '@strapi/database';\nimport type { Common, Documents, Schema, Shared, Strapi } from '@strapi/types';\nimport { contentTypes as contentTypesUtils, convertQueryParams, mapAsync } from '@strapi/utils';\n\nimport { isArray, omit } from 'lodash/fp';\nimport uploadFiles from '../utils/upload-files';\n\nimport {\n cloneComponents,\n createComponents,\n deleteComponents,\n getComponents,\n omitComponentData,\n updateComponents,\n} from '../entity-service/components';\n\nimport { createDocumentId } from '../../utils/transform-content-types-to-models';\nimport { applyTransforms } from '../entity-service/attributes';\nimport entityValidator from '../entity-validator';\nimport { pickSelectionParams } from './params';\n\nconst { transformParamsToQuery } = convertQueryParams;\n\n/**\n * TODO: Sanitization / validation built-in\n * TODO: i18n - Move logic to i18n package\n * TODO: Webhooks\n * TODO: Audit logs\n * TODO: Entity Validation - Uniqueness across same locale and publication status\n * TODO: File upload\n * TODO: replace 'any'\n * TODO: availableLocales\n *\n */\ntype Context = {\n contentType: Schema.ContentType;\n};\n\nconst createPipeline = (data: Record<string, unknown>, context: Context) => {\n return applyTransforms(data, context);\n};\n\nconst updatePipeline = (data: Record<string, unknown>, context: Context) => {\n return applyTransforms(data, context);\n};\n\nconst createDocumentEngine = ({\n strapi,\n db,\n}: {\n strapi: Strapi;\n db: Database;\n}): Documents.Engine => ({\n uploadFiles,\n\n async findMany(uid, params) {\n const { kind } = strapi.getModel(uid);\n\n const query = transformParamsToQuery(uid, params || ({} as any));\n query.where = { ...params?.lookup, ...query.where };\n\n if (kind === 'singleType') {\n return db.query(uid).findOne(query);\n }\n\n return db.query(uid).findMany(query);\n },\n\n async findFirst(uid, params) {\n const query = transformParamsToQuery(uid, params || ({} as any));\n\n return db.query(uid).findOne({ ...query, where: { ...params?.lookup, ...query.where } });\n },\n\n async findOne(uid, documentId, params) {\n const query = transformParamsToQuery(uid, params || ({} as any));\n return db\n .query(uid)\n .findOne({ ...query, where: { ...params?.lookup, ...query.where, documentId } });\n },\n\n async delete(uid, documentId, params = {} as any) {\n const query = transformParamsToQuery(uid, params as any);\n\n if (params.status === 'draft') {\n throw new Error('Cannot delete a draft document');\n }\n\n const entriesToDelete = await db.query(uid).findMany({\n ...query,\n where: {\n ...params.lookup,\n ...query?.where,\n documentId,\n },\n });\n\n // Delete all matched entries and its components\n await mapAsync(entriesToDelete, async (entryToDelete: any) => {\n const componentsToDelete = await getComponents(uid, entryToDelete);\n await db.query(uid).delete({ where: { id: entryToDelete.id } });\n await deleteComponents(uid, componentsToDelete as any, { loadComponents: false });\n });\n\n // TODO: Change return value to actual count\n return { versions: entriesToDelete };\n },\n\n // TODO: should we provide two separate methods?\n async deleteMany(uid, paramsOrIds) {\n let queryParams;\n if (isArray(paramsOrIds)) {\n queryParams = { filter: { documentID: { $in: paramsOrIds } } };\n } else {\n queryParams = paramsOrIds;\n }\n\n const query = transformParamsToQuery(uid, queryParams || ({} as any));\n\n return db.query(uid).deleteMany(query);\n },\n\n async create(uid, params) {\n // TODO: Entity validator.\n // TODO: File upload - Probably in the lifecycles?\n const { data } = params;\n\n if (!data) {\n throw new Error('Create requires data attribute');\n }\n\n const model = strapi.getModel(uid) as Shared.ContentTypes[Common.UID.ContentType];\n\n const validData = await entityValidator.validateEntityCreation(model, data, {\n isDraft: true,\n locale: params?.locale,\n });\n\n const componentData = await createComponents(uid, validData);\n const entryData = createPipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n {\n contentType: model,\n }\n );\n\n // select / populate\n const query = transformParamsToQuery(uid, pickSelectionParams(params) as any);\n\n return db.query(uid).create({ ...query, data: entryData });\n },\n\n // NOTE: What happens if user doesn't provide specific publications state and locale to update?\n async update(uid, documentId, params) {\n // TODO: Prevent updating a published document\n // TODO: Entity validator.\n // TODO: File upload\n const { data } = params || {};\n const model = strapi.getModel(uid) as Shared.ContentTypes[Common.UID.ContentType];\n\n const query = transformParamsToQuery(uid, pickSelectionParams(params || {}) as any);\n\n // Find all locales of the document\n const entryToUpdate = await db\n .query(uid)\n .findOne({ ...query, where: { ...params?.lookup, ...query?.where, documentId } });\n\n // Document does not exist\n if (!entryToUpdate) {\n return null;\n }\n\n const validData = await entityValidator.validateEntityUpdate(\n model,\n data,\n {\n isDraft: true, // Always update the draft version\n locale: params?.locale,\n },\n entryToUpdate\n );\n\n const componentData = await updateComponents(uid, entryToUpdate, validData);\n const entryData = updatePipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n { contentType: model }\n );\n\n return db.query(uid).update({ ...query, where: { id: entryToUpdate.id }, data: entryData });\n },\n\n async count(uid, params = undefined) {\n const query = transformParamsToQuery(uid, params || ({} as any));\n query.where = { ...params?.lookup, ...query.where };\n\n return db.query(uid).count(query);\n },\n\n async clone(uid, documentId, params) {\n // TODO: File upload\n // TODO: Entity validator.\n const { data = {} as any } = params!;\n\n const model = strapi.getModel(uid);\n const query = transformParamsToQuery(uid, pickSelectionParams(params) as any);\n\n // Find all locales of the document\n const entries = await db.query(uid).findMany({\n ...query,\n where: { ...params?.lookup, ...query.where, documentId },\n });\n\n // Document does not exist\n if (!entries.length) {\n return null;\n }\n\n const newDocumentId = createDocumentId();\n\n const versions = await mapAsync(entries, async (entryToClone: any) => {\n const isDraft = contentTypesUtils.isDraft(data);\n // Todo: Merge data with entry to clone\n const validData = await entityValidator.validateEntityUpdate(\n model,\n // Omit id fields, the cloned entity id will be generated by the database\n omit(['id'], data),\n { isDraft, ...params?.lookup },\n entryToClone\n );\n\n const componentData = await cloneComponents(uid, entryToClone, validData);\n const entityData = createPipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n { contentType: model }\n );\n\n // TODO: Transform params to query\n return db.query(uid).clone(entryToClone.id, {\n ...query,\n // Allows entityData to override the documentId (e.g. when publishing)\n data: { documentId: newDocumentId, ...entityData, locale: entryToClone.locale },\n });\n });\n\n return { id: newDocumentId, versions };\n },\n\n // TODO: Handle relations so they target the published version\n async publish(uid, documentId, params) {\n // Delete already published versions that match the locales to be published\n await this.delete(uid, documentId, {\n ...params,\n lookup: { ...params?.lookup, publishedAt: { $ne: null } },\n });\n\n // Clone every draft version to be published\n const clonedDocuments = (await this.clone(uid, documentId, {\n ...(params || {}),\n // @ts-expect-error - Generic type does not have publishedAt attribute by default\n data: { documentId, publishedAt: new Date() },\n })) as any;\n\n // TODO: Return actual count\n return { versions: clonedDocuments?.versions || [] };\n },\n\n async unpublish(uid, documentId, params) {\n // Delete all published versions\n return this.delete(uid, documentId, {\n ...params,\n lookup: { ...params?.lookup, publishedAt: { $ne: null } },\n }) as any;\n },\n\n /**\n * Steps:\n * - Delete the matching draft versions (publishedAt = null)\n * - Clone the matching published versions into draft versions\n */\n async discardDraft(uid, documentId, params) {\n // Delete draft versions, clone published versions into draft versions\n await this.delete(uid, documentId, {\n ...params,\n // Delete all drafts that match query\n lookup: { ...params?.lookup, publishedAt: null },\n });\n\n // Clone published versions into draft versions\n const clonedDocuments = (await this.clone(uid, documentId, {\n ...(params || {}),\n // Clone only published versions\n lookup: { ...params?.lookup, publishedAt: { $ne: null } },\n // @ts-expect-error - Generic type does not have publishedAt attribute by default\n data: { documentId, publishedAt: null },\n })) as any;\n\n return { versions: clonedDocuments?.versions || [] };\n },\n});\n\nexport default (ctx: { strapi: Strapi; db: Database }): Documents.Engine => {\n const implementation = createDocumentEngine(ctx);\n\n // TODO: Wrap with database error handling\n return implementation;\n};\n"],"names":["convertQueryParams","applyTransforms","params","mapAsync","getComponents","deleteComponents","isArray","entityValidator","createComponents","omitComponentData","pickSelectionParams","updateComponents","createDocumentId","contentTypesUtils","omit","cloneComponents"],"mappings":"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"}
1
+ {"version":3,"file":"document-engine.js","sources":["../../../src/services/document-service/document-engine.ts"],"sourcesContent":["import type { Database } from '@strapi/database';\nimport type { Documents, Schema, Strapi } from '@strapi/types';\nimport {\n contentTypes as contentTypesUtils,\n convertQueryParams,\n mapAsync,\n pipeAsync,\n} from '@strapi/utils';\n\nimport { omit, set } from 'lodash/fp';\n\nimport {\n cloneComponents,\n createComponents,\n deleteComponents,\n getComponents,\n omitComponentData,\n updateComponents,\n} from '../entity-service/components';\n\nimport { createDocumentId } from '../../utils/transform-content-types-to-models';\nimport { applyTransforms } from '../entity-service/attributes';\nimport entityValidator from '../entity-validator';\nimport { pickSelectionParams } from './params';\nimport { transformParamsDocumentId, transformOutputDocumentId } from './transform/id-transform';\nimport { getDeepPopulate } from './utils/populate';\nimport { transformOutputIds } from './transform/relations/transform/output-ids';\nimport { transformData } from './transform/data';\n\nconst { transformParamsToQuery } = convertQueryParams;\n\n/**\n * TODO: Sanitization / validation built-in\n * TODO: i18n - Move logic to i18n package\n * TODO: Webhooks\n * TODO: Audit logs\n * TODO: replace 'any'\n * TODO: availableLocales\n *\n */\ntype Context = {\n contentType: Schema.ContentType;\n};\n\nconst createPipeline = (data: Record<string, unknown>, context: Context) => {\n return applyTransforms(data, context);\n};\n\nconst updatePipeline = (data: Record<string, unknown>, context: Context) => {\n return applyTransforms(data, context);\n};\n\nconst createDocumentEngine = ({\n strapi,\n db,\n}: {\n strapi: Strapi;\n db: Database;\n}): Documents.Engine => ({\n async findMany(uid, params) {\n const query = await pipeAsync(\n (params) => transformParamsDocumentId(uid, params, { isDraft: true, locale: params.locale }),\n (params) => transformParamsToQuery(uid, params),\n (query) => set('where', { ...params?.lookup, ...query.where }, query)\n )(params || {});\n\n return db\n .query(uid)\n .findMany(query)\n .then((doc) => transformOutputDocumentId(uid, doc));\n },\n\n async findFirst(uid, params) {\n const query = await pipeAsync(\n (params) => transformParamsDocumentId(uid, params, { isDraft: true, locale: params.locale }),\n (params) => transformParamsToQuery(uid, params)\n )(params || {});\n\n return db\n .query(uid)\n .findOne({ ...query, where: { ...params?.lookup, ...query.where } })\n .then((doc) => transformOutputDocumentId(uid, doc));\n },\n\n async findOne(uid, documentId, params) {\n const query = await pipeAsync(\n (params) => transformParamsDocumentId(uid, params, { isDraft: true, locale: params.locale }),\n (params) => transformParamsToQuery(uid, params)\n )(params || {});\n\n return db\n .query(uid)\n .findOne({ ...query, where: { ...params?.lookup, ...query.where, documentId } })\n .then((doc) => transformOutputDocumentId(uid, doc));\n },\n\n async delete(uid, documentId, params = {} as any) {\n const query = await pipeAsync(\n // TODO: What if we are deleting more than one locale / publication state?\n (params) => transformParamsDocumentId(uid, params, { isDraft: true, locale: params.locale }),\n (params) => transformParamsToQuery(uid, params),\n (query) => set('where', { ...params?.lookup, ...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 db.query(uid).findMany(query);\n\n // Delete all matched entries and its components\n await mapAsync(entriesToDelete, async (entryToDelete: any) => {\n await this.deleteEntry(uid, entryToDelete.id);\n });\n\n return { deletedEntries: entriesToDelete.length };\n },\n\n async deleteEntry(uid, entryId) {\n const componentsToDelete = await getComponents(uid, { id: entryId });\n\n await db.query(uid).delete({ where: { id: entryId } });\n\n await deleteComponents(uid, componentsToDelete as any, { loadComponents: false });\n },\n\n async create(uid, params) {\n // Param parsing\n const { data, ...restParams } = await transformParamsDocumentId(uid, params, {\n locale: params.locale,\n // @ts-expect-error - published at is not always present\n // User can not set publishedAt on create, but other methods in the engine can (publish)\n isDraft: !params.data?.publishedAt,\n });\n\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams) as any); // select / populate\n\n // Validation\n if (!params.data) {\n throw new Error('Create requires data attribute');\n }\n\n const contentType = strapi.contentType(uid);\n\n const validData = await entityValidator.validateEntityCreation(contentType, data, {\n isDraft: !data.publishedAt,\n locale: params?.locale,\n });\n\n // Component handling\n const componentData = await createComponents(uid, validData as any);\n const entryData = createPipeline(\n Object.assign(omitComponentData(contentType, validData), componentData),\n { contentType }\n );\n\n return db\n .query(uid)\n .create({ ...query, data: entryData })\n .then((doc) => transformOutputDocumentId(uid, doc));\n },\n\n // NOTE: What happens if user doesn't provide specific publications state and locale to update?\n async update(uid, documentId, params) {\n // TODO: Prevent updating a published document\n // TODO: File upload\n\n // Param parsing\n const { data, ...restParams } = await transformParamsDocumentId(uid, params || {}, {\n isDraft: true,\n locale: params?.locale,\n });\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams || {}) as any);\n\n // Validation\n const model = strapi.contentType(uid);\n // Find if document exists\n const entryToUpdate = await db\n .query(uid)\n .findOne({ ...query, where: { ...params?.lookup, ...query?.where, documentId } });\n if (!entryToUpdate) return null;\n\n const validData = await entityValidator.validateEntityUpdate(\n model,\n data,\n {\n isDraft: true, // Always update the draft version\n locale: params?.locale,\n },\n entryToUpdate\n );\n\n // Component handling\n const componentData = await updateComponents(uid, entryToUpdate, validData as any);\n const entryData = updatePipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n { contentType: model }\n );\n\n return db\n .query(uid)\n .update({ ...query, where: { id: entryToUpdate.id }, data: entryData })\n .then((doc) => transformOutputDocumentId(uid, doc));\n },\n\n async count(uid, params = undefined) {\n const query = await pipeAsync(\n (params) => transformParamsDocumentId(uid, params, { isDraft: true, locale: params.locale }),\n (params) => transformParamsToQuery(uid, params),\n (query) => set('where', { ...params?.lookup, ...query.where }, query)\n )(params || {});\n\n return db.query(uid).count(query);\n },\n\n async clone(uid, documentId, params) {\n // TODO: File upload\n // Param parsing\n const { data, ...restParams } = await transformParamsDocumentId(uid, params || {}, {\n isDraft: true,\n locale: params?.locale,\n });\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams) as any);\n\n // Validation\n const model = strapi.contentType(uid);\n // Find all locales of the document\n const entries = await db.query(uid).findMany({\n ...query,\n where: { ...params?.lookup, ...query.where, documentId },\n });\n\n // Document does not exist\n if (!entries.length) {\n return null;\n }\n\n const newDocumentId = createDocumentId();\n\n const versions = await mapAsync(entries, async (entryToClone: any) => {\n const isDraft = contentTypesUtils.isDraft(data);\n // Todo: Merge data with entry to clone\n const validData = await entityValidator.validateEntityUpdate(\n model,\n // Omit id fields, the cloned entity id will be generated by the database\n omit(['id'], data),\n { isDraft, ...params?.lookup },\n entryToClone\n );\n\n const componentData = await cloneComponents(uid, entryToClone, validData);\n const entityData = createPipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n { contentType: model }\n );\n\n // TODO: Transform params to query\n return db\n .query(uid)\n .clone(entryToClone.id, {\n ...query,\n // Allows entityData to override the documentId (e.g. when publishing)\n data: { documentId: newDocumentId, ...entityData, locale: entryToClone.locale },\n })\n .then((doc) => transformOutputDocumentId(uid, doc));\n });\n\n return { id: newDocumentId, versions };\n },\n\n // TODO: Handle relations so they target the published version\n async publish(uid, documentId, params) {\n // Delete already published versions that match the locales to be published\n await this.delete(uid, documentId, {\n ...params,\n lookup: { ...params?.lookup, publishedAt: { $ne: null } },\n });\n\n // Get deep populate\n const entriesToPublish = await strapi.db?.query(uid).findMany({\n where: {\n ...params?.lookup,\n documentId,\n publishedAt: null,\n },\n populate: getDeepPopulate(uid),\n });\n\n // Transform draft entry data and create published versions\n const publishedEntries = await mapAsync(\n entriesToPublish,\n pipeAsync(\n set('publishedAt', new Date()),\n set('documentId', documentId),\n omit('id'),\n // draft entryId -> documentId\n (entry) => transformOutputIds(uid, entry),\n // documentId -> published entryId\n (entry) => {\n const opts = { uid, locale: entry.locale, isDraft: false, allowMissingId: true };\n return transformData(entry, opts);\n },\n // Create the published entry\n (data) => this.create(uid, { ...params, data, locale: data.locale })\n )\n );\n\n return { versions: publishedEntries };\n },\n\n async unpublish(uid, documentId, params) {\n // Delete all published versions\n return this.delete(uid, documentId, {\n ...params,\n lookup: { ...params?.lookup, publishedAt: { $ne: null } },\n }).then(({ deletedEntries }) => ({ versions: deletedEntries })) as any;\n },\n\n /**\n * Steps:\n * - Delete the matching draft versions (publishedAt = null)\n * - Clone the matching published versions into draft versions\n *\n * If the document has a published version, the draft version will be created from the published version.\n * If the document has no published version, the version will be removed.\n */\n async discardDraft(uid, documentId, params) {\n // Delete draft versions, clone published versions into draft versions\n await this.delete(uid, documentId, {\n ...params,\n // Delete all drafts that match query\n lookup: { ...params?.lookup, publishedAt: null },\n });\n\n // Get deep populate of published versions\n const entriesToDraft = await strapi.db?.query(uid).findMany({\n where: {\n ...params?.lookup,\n documentId,\n publishedAt: { $ne: null },\n },\n populate: getDeepPopulate(uid),\n });\n\n // Transform published entry data and create draft versions\n const draftEntries = await mapAsync(\n entriesToDraft,\n pipeAsync(\n set('publishedAt', null),\n set('documentId', documentId),\n omit('id'),\n // published entryId -> document\n (entry) => transformOutputIds(uid, entry),\n // documentId -> draft entryId\n (entry) => {\n const opts = { uid, locale: entry.locale, isDraft: true, allowMissingId: true };\n return transformData(entry, opts);\n },\n // Create the draft entry\n (data) => this.create(uid, { ...params, locale: data.locale, data })\n )\n );\n\n return { versions: draftEntries };\n },\n});\n\nexport default (ctx: { strapi: Strapi; db: Database }): Documents.Engine => {\n const implementation = createDocumentEngine(ctx);\n\n // TODO: Wrap with database error handling\n return implementation;\n};\n"],"names":["convertQueryParams","data","applyTransforms","params","pipeAsync","transformParamsDocumentId","query","set","transformOutputDocumentId","mapAsync","getComponents","deleteComponents","pickSelectionParams","entityValidator","createComponents","omitComponentData","updateComponents","createDocumentId","contentTypesUtils","omit","cloneComponents","getDeepPopulate","transformOutputIds","transformData"],"mappings":"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"}