@strapi/content-manager 5.12.5 → 5.13.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/admin/hooks/useDocumentActions.js +5 -1
  2. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  3. package/dist/admin/hooks/useDocumentActions.mjs +5 -1
  4. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  5. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  6. package/dist/admin/hooks/useDocumentContext.mjs.map +1 -1
  7. package/dist/admin/pages/EditView/components/DocumentActions.js +206 -21
  8. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  9. package/dist/admin/pages/EditView/components/DocumentActions.mjs +208 -23
  10. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  11. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +7 -12
  12. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  13. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +8 -13
  14. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  15. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +46 -95
  16. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  17. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +48 -78
  18. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +2 -0
  20. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  21. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +2 -0
  22. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +199 -137
  24. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  25. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +199 -137
  26. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  27. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +89 -50
  28. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  29. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +91 -52
  30. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  31. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +50 -97
  32. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +51 -79
  34. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
  35. package/dist/admin/preview/components/PreviewHeader.js +1 -1
  36. package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
  37. package/dist/admin/preview/components/PreviewHeader.mjs +1 -1
  38. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
  39. package/dist/admin/services/homepage.js +9 -5
  40. package/dist/admin/services/homepage.js.map +1 -1
  41. package/dist/admin/services/homepage.mjs +9 -5
  42. package/dist/admin/services/homepage.mjs.map +1 -1
  43. package/dist/admin/src/hooks/useDocumentContext.d.ts +1 -1
  44. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +2 -2
  45. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +26 -5
  46. package/dist/admin/translations/en.json.js +2 -1
  47. package/dist/admin/translations/en.json.js.map +1 -1
  48. package/dist/admin/translations/en.json.mjs +2 -1
  49. package/dist/admin/translations/en.json.mjs.map +1 -1
  50. package/dist/server/controllers/index.js +3 -1
  51. package/dist/server/controllers/index.js.map +1 -1
  52. package/dist/server/controllers/index.mjs +3 -1
  53. package/dist/server/controllers/index.mjs.map +1 -1
  54. package/dist/server/homepage/controllers/homepage.js +57 -0
  55. package/dist/server/homepage/controllers/homepage.js.map +1 -0
  56. package/dist/server/homepage/controllers/homepage.mjs +36 -0
  57. package/dist/server/homepage/controllers/homepage.mjs.map +1 -0
  58. package/dist/server/homepage/controllers/index.js +10 -0
  59. package/dist/server/homepage/controllers/index.js.map +1 -0
  60. package/dist/server/homepage/controllers/index.mjs +8 -0
  61. package/dist/server/homepage/controllers/index.mjs.map +1 -0
  62. package/dist/server/homepage/index.js +14 -0
  63. package/dist/server/homepage/index.js.map +1 -0
  64. package/dist/server/homepage/index.mjs +12 -0
  65. package/dist/server/homepage/index.mjs.map +1 -0
  66. package/dist/server/homepage/routes/homepage.js +25 -0
  67. package/dist/server/homepage/routes/homepage.js.map +1 -0
  68. package/dist/server/homepage/routes/homepage.mjs +23 -0
  69. package/dist/server/homepage/routes/homepage.mjs.map +1 -0
  70. package/dist/server/homepage/routes/index.js +13 -0
  71. package/dist/server/homepage/routes/index.js.map +1 -0
  72. package/dist/server/homepage/routes/index.mjs +11 -0
  73. package/dist/server/homepage/routes/index.mjs.map +1 -0
  74. package/dist/server/homepage/services/homepage.js +157 -0
  75. package/dist/server/homepage/services/homepage.js.map +1 -0
  76. package/dist/server/homepage/services/homepage.mjs +155 -0
  77. package/dist/server/homepage/services/homepage.mjs.map +1 -0
  78. package/dist/server/homepage/services/index.js +10 -0
  79. package/dist/server/homepage/services/index.js.map +1 -0
  80. package/dist/server/homepage/services/index.mjs +8 -0
  81. package/dist/server/homepage/services/index.mjs.map +1 -0
  82. package/dist/server/preview/services/preview.js +0 -1
  83. package/dist/server/preview/services/preview.js.map +1 -1
  84. package/dist/server/preview/services/preview.mjs +0 -1
  85. package/dist/server/preview/services/preview.mjs.map +1 -1
  86. package/dist/server/routes/index.js +3 -1
  87. package/dist/server/routes/index.js.map +1 -1
  88. package/dist/server/routes/index.mjs +3 -1
  89. package/dist/server/routes/index.mjs.map +1 -1
  90. package/dist/server/services/index.js +3 -1
  91. package/dist/server/services/index.js.map +1 -1
  92. package/dist/server/services/index.mjs +3 -1
  93. package/dist/server/services/index.mjs.map +1 -1
  94. package/dist/server/src/controllers/index.d.ts.map +1 -1
  95. package/dist/server/src/homepage/controllers/homepage.d.ts +7 -0
  96. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -0
  97. package/dist/server/src/homepage/controllers/index.d.ts +2 -0
  98. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -0
  99. package/dist/server/src/homepage/index.d.ts +16 -0
  100. package/dist/server/src/homepage/index.d.ts.map +1 -0
  101. package/dist/server/src/homepage/routes/homepage.d.ts +4 -0
  102. package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -0
  103. package/dist/server/src/homepage/routes/index.d.ts +8 -0
  104. package/dist/server/src/homepage/routes/index.d.ts.map +1 -0
  105. package/dist/server/src/{services → homepage/services}/homepage.d.ts +1 -1
  106. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -0
  107. package/dist/server/src/homepage/services/index.d.ts +9 -0
  108. package/dist/server/src/homepage/services/index.d.ts.map +1 -0
  109. package/dist/server/src/index.d.ts +7 -0
  110. package/dist/server/src/index.d.ts.map +1 -1
  111. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  112. package/dist/server/src/routes/index.d.ts +1 -0
  113. package/dist/server/src/routes/index.d.ts.map +1 -1
  114. package/dist/server/src/services/index.d.ts +6 -0
  115. package/dist/server/src/services/index.d.ts.map +1 -1
  116. package/package.json +7 -7
  117. package/dist/server/src/services/homepage.d.ts.map +0 -1
@@ -252,7 +252,8 @@ var en = {
252
252
  "preview.tabs.label": "Preview status",
253
253
  "preview.content.close-editor": "Close editor",
254
254
  "preview.content.open-editor": "Open editor",
255
- "relation.add": "Add relation",
255
+ "relation.create": "Create a relation",
256
+ "relation.add": "Add or create a relation",
256
257
  "relation.disconnect": "Remove",
257
258
  "relation.error-adding-relation": "An error occurred while trying to add the relation.",
258
259
  "relation.isLoading": "Relations are loading",
@@ -1 +1 @@
1
- {"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -9,6 +9,7 @@ var singleTypes = require('./single-types.js');
9
9
  var uid = require('./uid.js');
10
10
  var index = require('../history/index.js');
11
11
  var index$1 = require('../preview/index.js');
12
+ var index$2 = require('../homepage/index.js');
12
13
 
13
14
  var controllers = {
14
15
  'collection-types': collectionTypes,
@@ -19,7 +20,8 @@ var controllers = {
19
20
  'single-types': singleTypes,
20
21
  uid,
21
22
  ...index.controllers ? index.controllers : {},
22
- ...index$1.controllers ? index$1.controllers : {}
23
+ ...index$1.controllers ? index$1.controllers : {},
24
+ ...index$2.controllers
23
25
  };
24
26
 
25
27
  module.exports = controllers;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../server/src/controllers/index.ts"],"sourcesContent":["import collectionTypes from './collection-types';\nimport components from './components';\nimport contentTypes from './content-types';\nimport init from './init';\nimport relations from './relations';\nimport singleTypes from './single-types';\nimport uid from './uid';\nimport history from '../history';\nimport preview from '../preview';\n\nexport default {\n 'collection-types': collectionTypes,\n components,\n 'content-types': contentTypes,\n init,\n relations,\n 'single-types': singleTypes,\n uid,\n ...(history.controllers ? history.controllers : {}),\n ...(preview.controllers ? preview.controllers : {}),\n};\n"],"names":["collectionTypes","components","contentTypes","init","relations","singleTypes","uid","history","controllers","preview"],"mappings":";;;;;;;;;;;;AAUA,kBAAe;IACb,kBAAoBA,EAAAA,eAAAA;AACpBC,IAAAA,UAAAA;IACA,eAAiBC,EAAAA,YAAAA;AACjBC,IAAAA,IAAAA;AACAC,IAAAA,SAAAA;IACA,cAAgBC,EAAAA,WAAAA;AAChBC,IAAAA,GAAAA;AACA,IAAA,GAAIC,MAAQC,WAAW,GAAGD,MAAQC,WAAW,GAAG,EAAE;AAClD,IAAA,GAAIC,QAAQD,WAAW,GAAGC,QAAQD,WAAW,GAAG;AAClD,CAAE;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../server/src/controllers/index.ts"],"sourcesContent":["import collectionTypes from './collection-types';\nimport components from './components';\nimport contentTypes from './content-types';\nimport init from './init';\nimport relations from './relations';\nimport singleTypes from './single-types';\nimport uid from './uid';\nimport history from '../history';\nimport preview from '../preview';\nimport homepage from '../homepage';\n\nexport default {\n 'collection-types': collectionTypes,\n components,\n 'content-types': contentTypes,\n init,\n relations,\n 'single-types': singleTypes,\n uid,\n ...(history.controllers ? history.controllers : {}),\n ...(preview.controllers ? preview.controllers : {}),\n ...homepage.controllers,\n};\n"],"names":["collectionTypes","components","contentTypes","init","relations","singleTypes","uid","history","controllers","preview","homepage"],"mappings":";;;;;;;;;;;;;AAWA,kBAAe;IACb,kBAAoBA,EAAAA,eAAAA;AACpBC,IAAAA,UAAAA;IACA,eAAiBC,EAAAA,YAAAA;AACjBC,IAAAA,IAAAA;AACAC,IAAAA,SAAAA;IACA,cAAgBC,EAAAA,WAAAA;AAChBC,IAAAA,GAAAA;AACA,IAAA,GAAIC,MAAQC,WAAW,GAAGD,MAAQC,WAAW,GAAG,EAAE;AAClD,IAAA,GAAIC,QAAQD,WAAW,GAAGC,QAAQD,WAAW,GAAG,EAAE;AAClD,IAAA,GAAGE,QAASF;AACd,CAAE;;;;"}
@@ -7,6 +7,7 @@ import singleTypes from './single-types.mjs';
7
7
  import uid from './uid.mjs';
8
8
  import history from '../history/index.mjs';
9
9
  import preview from '../preview/index.mjs';
10
+ import homepage from '../homepage/index.mjs';
10
11
 
11
12
  var controllers = {
12
13
  'collection-types': collectionTypes,
@@ -17,7 +18,8 @@ var controllers = {
17
18
  'single-types': singleTypes,
18
19
  uid,
19
20
  ...history.controllers ? history.controllers : {},
20
- ...preview.controllers ? preview.controllers : {}
21
+ ...preview.controllers ? preview.controllers : {},
22
+ ...homepage.controllers
21
23
  };
22
24
 
23
25
  export { controllers as default };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../server/src/controllers/index.ts"],"sourcesContent":["import collectionTypes from './collection-types';\nimport components from './components';\nimport contentTypes from './content-types';\nimport init from './init';\nimport relations from './relations';\nimport singleTypes from './single-types';\nimport uid from './uid';\nimport history from '../history';\nimport preview from '../preview';\n\nexport default {\n 'collection-types': collectionTypes,\n components,\n 'content-types': contentTypes,\n init,\n relations,\n 'single-types': singleTypes,\n uid,\n ...(history.controllers ? history.controllers : {}),\n ...(preview.controllers ? preview.controllers : {}),\n};\n"],"names":["collectionTypes","components","contentTypes","init","relations","singleTypes","uid","history","controllers","preview"],"mappings":";;;;;;;;;;AAUA,kBAAe;IACb,kBAAoBA,EAAAA,eAAAA;AACpBC,IAAAA,UAAAA;IACA,eAAiBC,EAAAA,YAAAA;AACjBC,IAAAA,IAAAA;AACAC,IAAAA,SAAAA;IACA,cAAgBC,EAAAA,WAAAA;AAChBC,IAAAA,GAAAA;AACA,IAAA,GAAIC,QAAQC,WAAW,GAAGD,QAAQC,WAAW,GAAG,EAAE;AAClD,IAAA,GAAIC,QAAQD,WAAW,GAAGC,QAAQD,WAAW,GAAG;AAClD,CAAE;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../server/src/controllers/index.ts"],"sourcesContent":["import collectionTypes from './collection-types';\nimport components from './components';\nimport contentTypes from './content-types';\nimport init from './init';\nimport relations from './relations';\nimport singleTypes from './single-types';\nimport uid from './uid';\nimport history from '../history';\nimport preview from '../preview';\nimport homepage from '../homepage';\n\nexport default {\n 'collection-types': collectionTypes,\n components,\n 'content-types': contentTypes,\n init,\n relations,\n 'single-types': singleTypes,\n uid,\n ...(history.controllers ? history.controllers : {}),\n ...(preview.controllers ? preview.controllers : {}),\n ...homepage.controllers,\n};\n"],"names":["collectionTypes","components","contentTypes","init","relations","singleTypes","uid","history","controllers","preview","homepage"],"mappings":";;;;;;;;;;;AAWA,kBAAe;IACb,kBAAoBA,EAAAA,eAAAA;AACpBC,IAAAA,UAAAA;IACA,eAAiBC,EAAAA,YAAAA;AACjBC,IAAAA,IAAAA;AACAC,IAAAA,SAAAA;IACA,cAAgBC,EAAAA,WAAAA;AAChBC,IAAAA,GAAAA;AACA,IAAA,GAAIC,QAAQC,WAAW,GAAGD,QAAQC,WAAW,GAAG,EAAE;AAClD,IAAA,GAAIC,QAAQD,WAAW,GAAGC,QAAQD,WAAW,GAAG,EAAE;AAClD,IAAA,GAAGE,SAASF;AACd,CAAE;;;;"}
@@ -0,0 +1,57 @@
1
+ 'use strict';
2
+
3
+ var yup = require('yup');
4
+ var strapiUtils = require('@strapi/utils');
5
+
6
+ function _interopNamespaceDefault(e) {
7
+ var n = Object.create(null);
8
+ if (e) {
9
+ Object.keys(e).forEach(function (k) {
10
+ if (k !== 'default') {
11
+ var d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: function () { return e[k]; }
15
+ });
16
+ }
17
+ });
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+
23
+ var yup__namespace = /*#__PURE__*/_interopNamespaceDefault(yup);
24
+
25
+ const createHomepageController = ()=>{
26
+ const homepageService = strapi.plugin('content-manager').service('homepage');
27
+ const recentDocumentParamsSchema = yup__namespace.object().shape({
28
+ action: yup__namespace.mixed().oneOf([
29
+ 'update',
30
+ 'publish'
31
+ ]).required()
32
+ });
33
+ return {
34
+ async getRecentDocuments (ctx) {
35
+ let action;
36
+ try {
37
+ action = (await recentDocumentParamsSchema.validate(ctx.query)).action;
38
+ } catch (error) {
39
+ if (error instanceof yup__namespace.ValidationError) {
40
+ throw new strapiUtils.errors.ValidationError(error.message);
41
+ }
42
+ throw error;
43
+ }
44
+ if (action === 'publish') {
45
+ return {
46
+ data: await homepageService.getRecentlyPublishedDocuments()
47
+ };
48
+ }
49
+ return {
50
+ data: await homepageService.getRecentlyUpdatedDocuments()
51
+ };
52
+ }
53
+ };
54
+ };
55
+
56
+ exports.createHomepageController = createHomepageController;
57
+ //# sourceMappingURL=homepage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homepage.js","sources":["../../../../server/src/homepage/controllers/homepage.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as yup from 'yup';\nimport { errors } from '@strapi/utils';\nimport type { GetRecentDocuments } from '../../../../shared/contracts/homepage';\n\nconst createHomepageController = () => {\n const homepageService = strapi.plugin('content-manager').service('homepage');\n\n const recentDocumentParamsSchema = yup.object().shape({\n action: yup\n .mixed<GetRecentDocuments.Request['query']['action']>()\n .oneOf(['update', 'publish'])\n .required(),\n });\n\n return {\n async getRecentDocuments(ctx): Promise<GetRecentDocuments.Response> {\n let action;\n\n try {\n action = (await recentDocumentParamsSchema.validate(ctx.query)).action;\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new errors.ValidationError(error.message);\n }\n throw error;\n }\n\n if (action === 'publish') {\n return { data: await homepageService.getRecentlyPublishedDocuments() };\n }\n\n return { data: await homepageService.getRecentlyUpdatedDocuments() };\n },\n } satisfies Core.Controller;\n};\n\nexport { createHomepageController };\n"],"names":["createHomepageController","homepageService","strapi","plugin","service","recentDocumentParamsSchema","yup","object","shape","action","mixed","oneOf","required","getRecentDocuments","ctx","validate","query","error","ValidationError","errors","message","data","getRecentlyPublishedDocuments","getRecentlyUpdatedDocuments"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,wBAA2B,GAAA,IAAA;AAC/B,IAAA,MAAMC,kBAAkBC,MAAOC,CAAAA,MAAM,CAAC,iBAAA,CAAA,CAAmBC,OAAO,CAAC,UAAA,CAAA;AAEjE,IAAA,MAAMC,0BAA6BC,GAAAA,cAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACpDC,QAAAA,MAAAA,EAAQH,cACLI,CAAAA,KAAK,EACLC,CAAAA,KAAK,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,CAAA,CAC3BC,QAAQ;AACb,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,oBAAmBC,GAAG,EAAA;YAC1B,IAAIL,MAAAA;YAEJ,IAAI;gBACFA,MAAS,GAAC,CAAA,MAAMJ,0BAA2BU,CAAAA,QAAQ,CAACD,GAAIE,CAAAA,KAAK,CAAA,EAAGP,MAAM;AACxE,aAAA,CAAE,OAAOQ,KAAO,EAAA;gBACd,IAAIA,KAAAA,YAAiBX,cAAIY,CAAAA,eAAe,EAAE;AACxC,oBAAA,MAAM,IAAIC,kBAAAA,CAAOD,eAAe,CAACD,MAAMG,OAAO,CAAA;AAChD;gBACA,MAAMH,KAAAA;AACR;AAEA,YAAA,IAAIR,WAAW,SAAW,EAAA;gBACxB,OAAO;oBAAEY,IAAM,EAAA,MAAMpB,gBAAgBqB,6BAA6B;AAAG,iBAAA;AACvE;YAEA,OAAO;gBAAED,IAAM,EAAA,MAAMpB,gBAAgBsB,2BAA2B;AAAG,aAAA;AACrE;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,36 @@
1
+ import * as yup from 'yup';
2
+ import { errors } from '@strapi/utils';
3
+
4
+ const createHomepageController = ()=>{
5
+ const homepageService = strapi.plugin('content-manager').service('homepage');
6
+ const recentDocumentParamsSchema = yup.object().shape({
7
+ action: yup.mixed().oneOf([
8
+ 'update',
9
+ 'publish'
10
+ ]).required()
11
+ });
12
+ return {
13
+ async getRecentDocuments (ctx) {
14
+ let action;
15
+ try {
16
+ action = (await recentDocumentParamsSchema.validate(ctx.query)).action;
17
+ } catch (error) {
18
+ if (error instanceof yup.ValidationError) {
19
+ throw new errors.ValidationError(error.message);
20
+ }
21
+ throw error;
22
+ }
23
+ if (action === 'publish') {
24
+ return {
25
+ data: await homepageService.getRecentlyPublishedDocuments()
26
+ };
27
+ }
28
+ return {
29
+ data: await homepageService.getRecentlyUpdatedDocuments()
30
+ };
31
+ }
32
+ };
33
+ };
34
+
35
+ export { createHomepageController };
36
+ //# sourceMappingURL=homepage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homepage.mjs","sources":["../../../../server/src/homepage/controllers/homepage.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as yup from 'yup';\nimport { errors } from '@strapi/utils';\nimport type { GetRecentDocuments } from '../../../../shared/contracts/homepage';\n\nconst createHomepageController = () => {\n const homepageService = strapi.plugin('content-manager').service('homepage');\n\n const recentDocumentParamsSchema = yup.object().shape({\n action: yup\n .mixed<GetRecentDocuments.Request['query']['action']>()\n .oneOf(['update', 'publish'])\n .required(),\n });\n\n return {\n async getRecentDocuments(ctx): Promise<GetRecentDocuments.Response> {\n let action;\n\n try {\n action = (await recentDocumentParamsSchema.validate(ctx.query)).action;\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new errors.ValidationError(error.message);\n }\n throw error;\n }\n\n if (action === 'publish') {\n return { data: await homepageService.getRecentlyPublishedDocuments() };\n }\n\n return { data: await homepageService.getRecentlyUpdatedDocuments() };\n },\n } satisfies Core.Controller;\n};\n\nexport { createHomepageController };\n"],"names":["createHomepageController","homepageService","strapi","plugin","service","recentDocumentParamsSchema","yup","object","shape","action","mixed","oneOf","required","getRecentDocuments","ctx","validate","query","error","ValidationError","errors","message","data","getRecentlyPublishedDocuments","getRecentlyUpdatedDocuments"],"mappings":";;;AAKA,MAAMA,wBAA2B,GAAA,IAAA;AAC/B,IAAA,MAAMC,kBAAkBC,MAAOC,CAAAA,MAAM,CAAC,iBAAA,CAAA,CAAmBC,OAAO,CAAC,UAAA,CAAA;AAEjE,IAAA,MAAMC,0BAA6BC,GAAAA,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACpDC,QAAAA,MAAAA,EAAQH,GACLI,CAAAA,KAAK,EACLC,CAAAA,KAAK,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,CAAA,CAC3BC,QAAQ;AACb,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,oBAAmBC,GAAG,EAAA;YAC1B,IAAIL,MAAAA;YAEJ,IAAI;gBACFA,MAAS,GAAC,CAAA,MAAMJ,0BAA2BU,CAAAA,QAAQ,CAACD,GAAIE,CAAAA,KAAK,CAAA,EAAGP,MAAM;AACxE,aAAA,CAAE,OAAOQ,KAAO,EAAA;gBACd,IAAIA,KAAAA,YAAiBX,GAAIY,CAAAA,eAAe,EAAE;AACxC,oBAAA,MAAM,IAAIC,MAAAA,CAAOD,eAAe,CAACD,MAAMG,OAAO,CAAA;AAChD;gBACA,MAAMH,KAAAA;AACR;AAEA,YAAA,IAAIR,WAAW,SAAW,EAAA;gBACxB,OAAO;oBAAEY,IAAM,EAAA,MAAMpB,gBAAgBqB,6BAA6B;AAAG,iBAAA;AACvE;YAEA,OAAO;gBAAED,IAAM,EAAA,MAAMpB,gBAAgBsB,2BAA2B;AAAG,aAAA;AACrE;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ var homepage = require('./homepage.js');
4
+
5
+ const controllers = {
6
+ homepage: homepage.createHomepageController
7
+ };
8
+
9
+ exports.controllers = controllers;
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../server/src/homepage/controllers/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { createHomepageController } from './homepage';\n\nexport const controllers = {\n homepage: createHomepageController,\n /**\n * Casting is needed because the types aren't aware that Strapi supports\n * passing a controller factory as the value, instead of a controller object directly\n */\n} as unknown as Plugin.LoadedPlugin['controllers'];\n"],"names":["controllers","homepage","createHomepageController"],"mappings":";;;;MAGaA,WAAc,GAAA;IACzBC,QAAUC,EAAAA;AAKZ;;;;"}
@@ -0,0 +1,8 @@
1
+ import { createHomepageController } from './homepage.mjs';
2
+
3
+ const controllers = {
4
+ homepage: createHomepageController
5
+ };
6
+
7
+ export { controllers };
8
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../../server/src/homepage/controllers/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { createHomepageController } from './homepage';\n\nexport const controllers = {\n homepage: createHomepageController,\n /**\n * Casting is needed because the types aren't aware that Strapi supports\n * passing a controller factory as the value, instead of a controller object directly\n */\n} as unknown as Plugin.LoadedPlugin['controllers'];\n"],"names":["controllers","homepage","createHomepageController"],"mappings":";;MAGaA,WAAc,GAAA;IACzBC,QAAUC,EAAAA;AAKZ;;;;"}
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ var index = require('./routes/index.js');
4
+ var index$1 = require('./controllers/index.js');
5
+ var index$2 = require('./services/index.js');
6
+
7
+ var homepage = {
8
+ routes: index.routes,
9
+ controllers: index$1.controllers,
10
+ services: index$2.services
11
+ };
12
+
13
+ module.exports = homepage;
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../server/src/homepage/index.ts"],"sourcesContent":["import { routes } from './routes';\nimport { controllers } from './controllers';\nimport { services } from './services';\n\nexport default {\n routes,\n controllers,\n services,\n};\n"],"names":["routes","controllers","services"],"mappings":";;;;;;AAIA,eAAe;AACbA,YAAAA,YAAAA;AACAC,iBAAAA,mBAAAA;AACAC,cAAAA;AACF,CAAE;;;;"}
@@ -0,0 +1,12 @@
1
+ import { routes } from './routes/index.mjs';
2
+ import { controllers } from './controllers/index.mjs';
3
+ import { services } from './services/index.mjs';
4
+
5
+ var homepage = {
6
+ routes,
7
+ controllers,
8
+ services
9
+ };
10
+
11
+ export { homepage as default };
12
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../server/src/homepage/index.ts"],"sourcesContent":["import { routes } from './routes';\nimport { controllers } from './controllers';\nimport { services } from './services';\n\nexport default {\n routes,\n controllers,\n services,\n};\n"],"names":["routes","controllers","services"],"mappings":";;;;AAIA,eAAe;AACbA,IAAAA,MAAAA;AACAC,IAAAA,WAAAA;AACAC,IAAAA;AACF,CAAE;;;;"}
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ const info = {
4
+ pluginName: 'content-manager',
5
+ type: 'admin'
6
+ };
7
+ const homepageRouter = {
8
+ type: 'admin',
9
+ routes: [
10
+ {
11
+ method: 'GET',
12
+ info,
13
+ path: '/homepage/recent-documents',
14
+ handler: 'homepage.getRecentDocuments',
15
+ config: {
16
+ policies: [
17
+ 'admin::isAuthenticatedAdmin'
18
+ ]
19
+ }
20
+ }
21
+ ]
22
+ };
23
+
24
+ exports.homepageRouter = homepageRouter;
25
+ //# sourceMappingURL=homepage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homepage.js","sources":["../../../../server/src/homepage/routes/homepage.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\n\nconst info = { pluginName: 'content-manager', type: 'admin' };\n\nconst homepageRouter: Plugin.LoadedPlugin['routes'][string] = {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n info,\n path: '/homepage/recent-documents',\n handler: 'homepage.getRecentDocuments',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n\nexport { homepageRouter };\n"],"names":["info","pluginName","type","homepageRouter","routes","method","path","handler","config","policies"],"mappings":";;AAEA,MAAMA,IAAO,GAAA;IAAEC,UAAY,EAAA,iBAAA;IAAmBC,IAAM,EAAA;AAAQ,CAAA;AAE5D,MAAMC,cAAwD,GAAA;IAC5DD,IAAM,EAAA,OAAA;IACNE,MAAQ,EAAA;AACN,QAAA;YACEC,MAAQ,EAAA,KAAA;AACRL,YAAAA,IAAAA;YACAM,IAAM,EAAA,4BAAA;YACNC,OAAS,EAAA,6BAAA;YACTC,MAAQ,EAAA;gBACNC,QAAU,EAAA;AAAC,oBAAA;AAA8B;AAC3C;AACF;AACD;AACH;;;;"}
@@ -0,0 +1,23 @@
1
+ const info = {
2
+ pluginName: 'content-manager',
3
+ type: 'admin'
4
+ };
5
+ const homepageRouter = {
6
+ type: 'admin',
7
+ routes: [
8
+ {
9
+ method: 'GET',
10
+ info,
11
+ path: '/homepage/recent-documents',
12
+ handler: 'homepage.getRecentDocuments',
13
+ config: {
14
+ policies: [
15
+ 'admin::isAuthenticatedAdmin'
16
+ ]
17
+ }
18
+ }
19
+ ]
20
+ };
21
+
22
+ export { homepageRouter };
23
+ //# sourceMappingURL=homepage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homepage.mjs","sources":["../../../../server/src/homepage/routes/homepage.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\n\nconst info = { pluginName: 'content-manager', type: 'admin' };\n\nconst homepageRouter: Plugin.LoadedPlugin['routes'][string] = {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n info,\n path: '/homepage/recent-documents',\n handler: 'homepage.getRecentDocuments',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n\nexport { homepageRouter };\n"],"names":["info","pluginName","type","homepageRouter","routes","method","path","handler","config","policies"],"mappings":"AAEA,MAAMA,IAAO,GAAA;IAAEC,UAAY,EAAA,iBAAA;IAAmBC,IAAM,EAAA;AAAQ,CAAA;AAE5D,MAAMC,cAAwD,GAAA;IAC5DD,IAAM,EAAA,OAAA;IACNE,MAAQ,EAAA;AACN,QAAA;YACEC,MAAQ,EAAA,KAAA;AACRL,YAAAA,IAAAA;YACAM,IAAM,EAAA,4BAAA;YACNC,OAAS,EAAA,6BAAA;YACTC,MAAQ,EAAA;gBACNC,QAAU,EAAA;AAAC,oBAAA;AAA8B;AAC3C;AACF;AACD;AACH;;;;"}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var homepage = require('./homepage.js');
4
+
5
+ /**
6
+ * The routes will be merged with the other Content Manager routers,
7
+ * so we need to avoid conficts in the router name, and to prefix the path for each route.
8
+ */ const routes = {
9
+ homepage: homepage.homepageRouter
10
+ };
11
+
12
+ exports.routes = routes;
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../server/src/homepage/routes/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { homepageRouter } from './homepage';\n\n/**\n * The routes will be merged with the other Content Manager routers,\n * so we need to avoid conficts in the router name, and to prefix the path for each route.\n */\nexport const routes = {\n homepage: homepageRouter,\n} satisfies Plugin.LoadedPlugin['routes'];\n"],"names":["routes","homepage","homepageRouter"],"mappings":";;;;AAGA;;;UAIaA,MAAS,GAAA;IACpBC,QAAUC,EAAAA;AACZ;;;;"}
@@ -0,0 +1,11 @@
1
+ import { homepageRouter } from './homepage.mjs';
2
+
3
+ /**
4
+ * The routes will be merged with the other Content Manager routers,
5
+ * so we need to avoid conficts in the router name, and to prefix the path for each route.
6
+ */ const routes = {
7
+ homepage: homepageRouter
8
+ };
9
+
10
+ export { routes };
11
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../../server/src/homepage/routes/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { homepageRouter } from './homepage';\n\n/**\n * The routes will be merged with the other Content Manager routers,\n * so we need to avoid conficts in the router name, and to prefix the path for each route.\n */\nexport const routes = {\n homepage: homepageRouter,\n} satisfies Plugin.LoadedPlugin['routes'];\n"],"names":["routes","homepage","homepageRouter"],"mappings":";;AAGA;;;UAIaA,MAAS,GAAA;IACpBC,QAAUC,EAAAA;AACZ;;;;"}
@@ -0,0 +1,157 @@
1
+ 'use strict';
2
+
3
+ var strapiUtils = require('@strapi/utils');
4
+
5
+ const createHomepageService = ({ strapi })=>{
6
+ const MAX_DOCUMENTS = 4;
7
+ const metadataService = strapi.plugin('content-manager').service('document-metadata');
8
+ const permissionService = strapi.admin.services.permission;
9
+ const getConfiguration = async (contentTypeUids)=>{
10
+ /**
11
+ * Don't use the strapi.store util because we need to make
12
+ * more precise queries than exact key matches, in order to make as few queries as possible.
13
+ */ const coreStore = strapi.db.query('strapi::core-store');
14
+ const rawConfigurations = await coreStore.findMany({
15
+ where: {
16
+ key: {
17
+ $in: contentTypeUids.map((contentType)=>`plugin_content_manager_configuration_content_types::${contentType}`)
18
+ }
19
+ }
20
+ });
21
+ return rawConfigurations.map((rawConfiguration)=>{
22
+ return JSON.parse(rawConfiguration.value);
23
+ });
24
+ };
25
+ const getPermittedContentTypes = async ()=>{
26
+ const readPermissions = await permissionService.findMany({
27
+ where: {
28
+ role: {
29
+ users: {
30
+ id: strapi.requestContext.get()?.state?.user.id
31
+ }
32
+ },
33
+ action: 'plugin::content-manager.explorer.read'
34
+ }
35
+ });
36
+ return readPermissions.map((permission)=>permission.subject).filter(Boolean);
37
+ };
38
+ const getContentTypesMeta = (allowedContentTypeUids, configurations)=>{
39
+ return allowedContentTypeUids.map((uid)=>{
40
+ const configuration = configurations.find((config)=>config.uid === uid);
41
+ const contentType = strapi.contentType(uid);
42
+ const fields = [
43
+ 'documentId',
44
+ 'updatedAt'
45
+ ];
46
+ // Add fields required to get the status if D&P is enabled
47
+ const hasDraftAndPublish = strapiUtils.contentTypes.hasDraftAndPublish(contentType);
48
+ if (hasDraftAndPublish) {
49
+ fields.push('publishedAt');
50
+ }
51
+ // Only add the main field if it's defined
52
+ if (configuration?.settings.mainField) {
53
+ fields.push(configuration.settings.mainField);
54
+ }
55
+ // Only add locale if it's localized
56
+ const isLocalized = contentType.pluginOptions?.i18n?.localized;
57
+ if (isLocalized) {
58
+ fields.push('locale');
59
+ }
60
+ return {
61
+ fields,
62
+ mainField: configuration.settings.mainField,
63
+ contentType,
64
+ hasDraftAndPublish,
65
+ uid
66
+ };
67
+ });
68
+ };
69
+ const formatDocuments = (documents, meta)=>{
70
+ return documents.map((document)=>{
71
+ return {
72
+ documentId: document.documentId,
73
+ locale: document.locale ?? null,
74
+ updatedAt: new Date(document.updatedAt),
75
+ title: document[meta.mainField ?? 'documentId'],
76
+ publishedAt: meta.hasDraftAndPublish && document.publishedAt ? new Date(document.publishedAt) : null,
77
+ contentTypeUid: meta.uid,
78
+ contentTypeDisplayName: meta.contentType.info.displayName,
79
+ kind: meta.contentType.kind
80
+ };
81
+ });
82
+ };
83
+ const addStatusToDocuments = async (documents)=>{
84
+ return Promise.all(documents.map(async (recentDocument)=>{
85
+ const hasDraftAndPublish = strapiUtils.contentTypes.hasDraftAndPublish(strapi.contentType(recentDocument.contentTypeUid));
86
+ /**
87
+ * Tries to query the other version of the document if draft and publish is enabled,
88
+ * so that we know when to give the "modified" status.
89
+ */ const { availableStatus } = await metadataService.getMetadata(recentDocument.contentTypeUid, recentDocument, {
90
+ availableStatus: hasDraftAndPublish,
91
+ availableLocales: false
92
+ });
93
+ const status = metadataService.getStatus(recentDocument, availableStatus);
94
+ return {
95
+ ...recentDocument,
96
+ status: hasDraftAndPublish ? status : undefined
97
+ };
98
+ }));
99
+ };
100
+ const permissionCheckerService = strapi.plugin('content-manager').service('permission-checker');
101
+ const getPermissionChecker = (uid)=>permissionCheckerService.create({
102
+ userAbility: strapi.requestContext.get()?.state.userAbility,
103
+ model: uid
104
+ });
105
+ return {
106
+ async getRecentlyPublishedDocuments () {
107
+ const permittedContentTypes = await getPermittedContentTypes();
108
+ const allowedContentTypeUids = permittedContentTypes.filter((uid)=>{
109
+ return strapiUtils.contentTypes.hasDraftAndPublish(strapi.contentType(uid));
110
+ });
111
+ // Fetch the configuration for each content type in a single query
112
+ const configurations = await getConfiguration(allowedContentTypeUids);
113
+ // Get the necessary metadata for the documents
114
+ const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);
115
+ // Now actually fetch and format the documents
116
+ const recentDocuments = await Promise.all(contentTypesMeta.map(async (meta)=>{
117
+ const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({
118
+ limit: MAX_DOCUMENTS,
119
+ sort: 'publishedAt:desc',
120
+ fields: meta.fields,
121
+ status: 'published'
122
+ });
123
+ const docs = await strapi.documents(meta.uid).findMany(permissionQuery);
124
+ return formatDocuments(docs, meta);
125
+ }));
126
+ const overallRecentDocuments = recentDocuments.flat().sort((a, b)=>{
127
+ if (!a.publishedAt || !b.publishedAt) return 0;
128
+ return b.publishedAt.valueOf() - a.publishedAt.valueOf();
129
+ }).slice(0, MAX_DOCUMENTS);
130
+ return addStatusToDocuments(overallRecentDocuments);
131
+ },
132
+ async getRecentlyUpdatedDocuments () {
133
+ const allowedContentTypeUids = await getPermittedContentTypes();
134
+ // Fetch the configuration for each content type in a single query
135
+ const configurations = await getConfiguration(allowedContentTypeUids);
136
+ // Get the necessary metadata for the documents
137
+ const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);
138
+ // Now actually fetch and format the documents
139
+ const recentDocuments = await Promise.all(contentTypesMeta.map(async (meta)=>{
140
+ const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({
141
+ limit: MAX_DOCUMENTS,
142
+ sort: 'updatedAt:desc',
143
+ fields: meta.fields
144
+ });
145
+ const docs = await strapi.documents(meta.uid).findMany(permissionQuery);
146
+ return formatDocuments(docs, meta);
147
+ }));
148
+ const overallRecentDocuments = recentDocuments.flat().sort((a, b)=>{
149
+ return b.updatedAt.valueOf() - a.updatedAt.valueOf();
150
+ }).slice(0, MAX_DOCUMENTS);
151
+ return addStatusToDocuments(overallRecentDocuments);
152
+ }
153
+ };
154
+ };
155
+
156
+ exports.createHomepageService = createHomepageService;
157
+ //# sourceMappingURL=homepage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homepage.js","sources":["../../../../server/src/homepage/services/homepage.ts"],"sourcesContent":["import type { Core, Modules, Schema } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport type { GetRecentDocuments, RecentDocument } from '../../../../shared/contracts/homepage';\n\nconst createHomepageService = ({ strapi }: { strapi: Core.Strapi }) => {\n const MAX_DOCUMENTS = 4;\n\n const metadataService = strapi.plugin('content-manager').service('document-metadata');\n const permissionService = strapi.admin.services.permission;\n\n type ContentTypeConfiguration = {\n uid: RecentDocument['contentTypeUid'];\n settings: { mainField: string };\n };\n const getConfiguration = async (\n contentTypeUids: RecentDocument['contentTypeUid'][]\n ): Promise<ContentTypeConfiguration[]> => {\n /**\n * Don't use the strapi.store util because we need to make\n * more precise queries than exact key matches, in order to make as few queries as possible.\n */\n const coreStore = strapi.db.query('strapi::core-store');\n const rawConfigurations = await coreStore.findMany({\n where: {\n key: {\n $in: contentTypeUids.map(\n (contentType) => `plugin_content_manager_configuration_content_types::${contentType}`\n ),\n },\n },\n });\n\n return rawConfigurations.map((rawConfiguration) => {\n return JSON.parse(rawConfiguration.value);\n });\n };\n\n const getPermittedContentTypes = async () => {\n const readPermissions: Modules.Permissions.PermissionRule[] = await permissionService.findMany({\n where: {\n role: { users: { id: strapi.requestContext.get()?.state?.user.id } },\n action: 'plugin::content-manager.explorer.read',\n },\n });\n\n return readPermissions\n .map((permission) => permission.subject)\n .filter(Boolean) as RecentDocument['contentTypeUid'][];\n };\n\n type ContentTypeMeta = {\n fields: string[];\n mainField: string;\n contentType: Schema.ContentType;\n hasDraftAndPublish: boolean;\n uid: RecentDocument['contentTypeUid'];\n };\n\n const getContentTypesMeta = (\n allowedContentTypeUids: RecentDocument['contentTypeUid'][],\n configurations: ContentTypeConfiguration[]\n ): ContentTypeMeta[] => {\n return allowedContentTypeUids.map((uid) => {\n const configuration = configurations.find((config) => config.uid === uid);\n const contentType = strapi.contentType(uid);\n const fields = ['documentId', 'updatedAt'];\n\n // Add fields required to get the status if D&P is enabled\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(contentType);\n if (hasDraftAndPublish) {\n fields.push('publishedAt');\n }\n\n // Only add the main field if it's defined\n if (configuration?.settings.mainField) {\n fields.push(configuration.settings.mainField);\n }\n\n // Only add locale if it's localized\n const isLocalized = (contentType.pluginOptions?.i18n as any)?.localized;\n if (isLocalized) {\n fields.push('locale');\n }\n\n return {\n fields,\n mainField: configuration!.settings.mainField,\n contentType,\n hasDraftAndPublish,\n uid,\n };\n });\n };\n\n const formatDocuments = (documents: Modules.Documents.AnyDocument[], meta: ContentTypeMeta) => {\n return documents.map((document) => {\n return {\n documentId: document.documentId,\n locale: document.locale ?? null,\n updatedAt: new Date(document.updatedAt),\n title: document[meta.mainField ?? 'documentId'],\n publishedAt:\n meta.hasDraftAndPublish && document.publishedAt ? new Date(document.publishedAt) : null,\n contentTypeUid: meta.uid,\n contentTypeDisplayName: meta.contentType.info.displayName,\n kind: meta.contentType.kind,\n };\n });\n };\n\n const addStatusToDocuments = async (documents: RecentDocument[]): Promise<RecentDocument[]> => {\n return Promise.all(\n documents.map(async (recentDocument) => {\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(\n strapi.contentType(recentDocument.contentTypeUid)\n );\n /**\n * Tries to query the other version of the document if draft and publish is enabled,\n * so that we know when to give the \"modified\" status.\n */\n const { availableStatus } = await metadataService.getMetadata(\n recentDocument.contentTypeUid,\n recentDocument,\n {\n availableStatus: hasDraftAndPublish,\n availableLocales: false,\n }\n );\n const status: RecentDocument['status'] = metadataService.getStatus(\n recentDocument,\n availableStatus\n );\n\n return {\n ...recentDocument,\n status: hasDraftAndPublish ? status : undefined,\n };\n })\n );\n };\n\n const permissionCheckerService = strapi.plugin('content-manager').service('permission-checker');\n const getPermissionChecker = (uid: string) =>\n permissionCheckerService.create({\n userAbility: strapi.requestContext.get()?.state.userAbility,\n model: uid,\n });\n\n return {\n async getRecentlyPublishedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n const permittedContentTypes = await getPermittedContentTypes();\n const allowedContentTypeUids = permittedContentTypes.filter((uid) => {\n return contentTypes.hasDraftAndPublish(strapi.contentType(uid));\n });\n // Fetch the configuration for each content type in a single query\n const configurations = await getConfiguration(allowedContentTypeUids);\n // Get the necessary metadata for the documents\n const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);\n // Now actually fetch and format the documents\n const recentDocuments = await Promise.all(\n contentTypesMeta.map(async (meta) => {\n const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({\n limit: MAX_DOCUMENTS,\n sort: 'publishedAt:desc',\n fields: meta.fields,\n status: 'published',\n });\n\n const docs = await strapi.documents(meta.uid).findMany(permissionQuery);\n\n return formatDocuments(docs, meta);\n })\n );\n\n const overallRecentDocuments = recentDocuments\n .flat()\n .sort((a, b) => {\n if (!a.publishedAt || !b.publishedAt) return 0;\n return b.publishedAt.valueOf() - a.publishedAt.valueOf();\n })\n .slice(0, MAX_DOCUMENTS);\n\n return addStatusToDocuments(overallRecentDocuments);\n },\n\n async getRecentlyUpdatedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n const allowedContentTypeUids = await getPermittedContentTypes();\n // Fetch the configuration for each content type in a single query\n const configurations = await getConfiguration(allowedContentTypeUids);\n // Get the necessary metadata for the documents\n const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);\n // Now actually fetch and format the documents\n const recentDocuments = await Promise.all(\n contentTypesMeta.map(async (meta) => {\n const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({\n limit: MAX_DOCUMENTS,\n sort: 'updatedAt:desc',\n fields: meta.fields,\n });\n\n const docs = await strapi.documents(meta.uid).findMany(permissionQuery);\n\n return formatDocuments(docs, meta);\n })\n );\n\n const overallRecentDocuments = recentDocuments\n .flat()\n .sort((a, b) => {\n return b.updatedAt.valueOf() - a.updatedAt.valueOf();\n })\n .slice(0, MAX_DOCUMENTS);\n\n return addStatusToDocuments(overallRecentDocuments);\n },\n };\n};\n\nexport { createHomepageService };\n"],"names":["createHomepageService","strapi","MAX_DOCUMENTS","metadataService","plugin","service","permissionService","admin","services","permission","getConfiguration","contentTypeUids","coreStore","db","query","rawConfigurations","findMany","where","key","$in","map","contentType","rawConfiguration","JSON","parse","value","getPermittedContentTypes","readPermissions","role","users","id","requestContext","get","state","user","action","subject","filter","Boolean","getContentTypesMeta","allowedContentTypeUids","configurations","uid","configuration","find","config","fields","hasDraftAndPublish","contentTypes","push","settings","mainField","isLocalized","pluginOptions","i18n","localized","formatDocuments","documents","meta","document","documentId","locale","updatedAt","Date","title","publishedAt","contentTypeUid","contentTypeDisplayName","info","displayName","kind","addStatusToDocuments","Promise","all","recentDocument","availableStatus","getMetadata","availableLocales","status","getStatus","undefined","permissionCheckerService","getPermissionChecker","create","userAbility","model","getRecentlyPublishedDocuments","permittedContentTypes","contentTypesMeta","recentDocuments","permissionQuery","sanitizedQuery","read","limit","sort","docs","overallRecentDocuments","flat","a","b","valueOf","slice","getRecentlyUpdatedDocuments"],"mappings":"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"}