@webiny/api-aco 5.39.0-beta.1 → 5.39.0-beta.3

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 (89) hide show
  1. package/apps/AcoApp.js +6 -19
  2. package/apps/AcoApp.js.map +1 -1
  3. package/apps/AcoApps.js +4 -7
  4. package/apps/AcoApps.js.map +1 -1
  5. package/createAcoContext.js +13 -11
  6. package/createAcoContext.js.map +1 -1
  7. package/createAcoGraphQL.js +1 -0
  8. package/createAcoGraphQL.js.map +1 -1
  9. package/createAcoModels.js +1 -17
  10. package/createAcoModels.js.map +1 -1
  11. package/createAcoStorageOperations.d.ts +0 -1
  12. package/createAcoStorageOperations.js +6 -6
  13. package/createAcoStorageOperations.js.map +1 -1
  14. package/filter/filter.gql.js +4 -1
  15. package/filter/filter.gql.js.map +1 -1
  16. package/filter/filter.model.d.ts +1 -3
  17. package/filter/filter.model.js +4 -6
  18. package/filter/filter.model.js.map +1 -1
  19. package/filter/filter.so.js +29 -27
  20. package/filter/filter.so.js.map +1 -1
  21. package/filter/filter.types.d.ts +1 -1
  22. package/filter/filter.types.js.map +1 -1
  23. package/folder/folder.crud.js +6 -9
  24. package/folder/folder.crud.js.map +1 -1
  25. package/folder/folder.gql.js +4 -1
  26. package/folder/folder.gql.js.map +1 -1
  27. package/folder/folder.model.d.ts +1 -3
  28. package/folder/folder.model.js +4 -6
  29. package/folder/folder.model.js.map +1 -1
  30. package/folder/folder.so.js +31 -19
  31. package/folder/folder.so.js.map +1 -1
  32. package/folder/folder.types.d.ts +5 -2
  33. package/folder/folder.types.js.map +1 -1
  34. package/index.d.ts +1 -1
  35. package/index.js +1 -2
  36. package/index.js.map +1 -1
  37. package/package.json +25 -26
  38. package/plugins/AcoAppModifierPlugin.js +1 -4
  39. package/plugins/AcoAppModifierPlugin.js.map +1 -1
  40. package/plugins/AcoAppRegisterPlugin.js +1 -4
  41. package/plugins/AcoAppRegisterPlugin.js.map +1 -1
  42. package/record/graphql/createAppResolvers.js +5 -7
  43. package/record/graphql/createAppResolvers.js.map +1 -1
  44. package/record/graphql/createAppSchema.js +7 -4
  45. package/record/graphql/createAppSchema.js.map +1 -1
  46. package/record/record.model.d.ts +1 -3
  47. package/record/record.model.js +4 -6
  48. package/record/record.model.js.map +1 -1
  49. package/record/record.so.js +32 -22
  50. package/record/record.so.js.map +1 -1
  51. package/record/record.types.d.ts +2 -2
  52. package/record/record.types.js.map +1 -1
  53. package/types.d.ts +4 -1
  54. package/types.js.map +1 -1
  55. package/utils/FolderLevelPermissions.js +15 -23
  56. package/utils/FolderLevelPermissions.js.map +1 -1
  57. package/utils/decorators/CmsEntriesCrudDecorators.js +17 -71
  58. package/utils/decorators/CmsEntriesCrudDecorators.js.map +1 -1
  59. package/utils/decorators/createFolderType.d.ts +2 -0
  60. package/utils/decorators/createFolderType.js +18 -0
  61. package/utils/decorators/createFolderType.js.map +1 -0
  62. package/utils/decorators/filterEntriesByFolderFactory.d.ts +6 -0
  63. package/utils/decorators/filterEntriesByFolderFactory.js +37 -0
  64. package/utils/decorators/filterEntriesByFolderFactory.js.map +1 -0
  65. package/utils/decorators/isPageModel.d.ts +5 -0
  66. package/utils/decorators/isPageModel.js +20 -0
  67. package/utils/decorators/isPageModel.js.map +1 -0
  68. package/utils/decorators/where.d.ts +2 -1
  69. package/utils/decorators/where.js +30 -15
  70. package/utils/decorators/where.js.map +1 -1
  71. package/utils/modelFactory.d.ts +1 -3
  72. package/utils/modelFactory.js +4 -9
  73. package/utils/modelFactory.js.map +1 -1
  74. package/utils/pickEntryFieldValues.d.ts +3 -0
  75. package/utils/pickEntryFieldValues.js +31 -0
  76. package/utils/pickEntryFieldValues.js.map +1 -0
  77. package/utils/resolve.d.ts +1 -1
  78. package/fields/index.d.ts +0 -2
  79. package/fields/index.js +0 -14
  80. package/fields/index.js.map +0 -1
  81. package/fields/location.d.ts +0 -2
  82. package/fields/location.js +0 -46
  83. package/fields/location.js.map +0 -1
  84. package/utils/fieldResolver.d.ts +0 -16
  85. package/utils/fieldResolver.js +0 -46
  86. package/utils/fieldResolver.js.map +0 -1
  87. package/utils/getFieldValues.d.ts +0 -7
  88. package/utils/getFieldValues.js +0 -24
  89. package/utils/getFieldValues.js.map +0 -1
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.createSearchModelDefinition = exports.SEARCH_RECORD_MODEL_ID = exports.DEFAULT_FIELDS = void 0;
7
7
  var _createModelField = require("../utils/createModelField");
8
+ var _apiHeadlessCms = require("@webiny/api-headless-cms");
8
9
  const typeField = () => (0, _createModelField.createModelField)({
9
10
  label: "Type",
10
11
  type: "text",
@@ -73,15 +74,12 @@ exports.SEARCH_RECORD_MODEL_ID = SEARCH_RECORD_MODEL_ID;
73
74
  const DEFAULT_FIELDS = ["type", "title", "content", "location", "data", "tags"];
74
75
  exports.DEFAULT_FIELDS = DEFAULT_FIELDS;
75
76
  const createSearchModelDefinition = params => {
76
- return {
77
+ return (0, _apiHeadlessCms.createPrivateModelDefinition)({
77
78
  name: "ACO - Search Record",
78
79
  modelId: SEARCH_RECORD_MODEL_ID,
79
80
  titleFieldId: "title",
80
- layout: DEFAULT_FIELDS.map(field => [field]),
81
- fields: [typeField(), titleField(), contentField(), locationField([locationFolderIdField()]), dataField(params === null || params === void 0 ? void 0 : params.fields), tagsField()],
82
- description: "ACO - Search record model",
83
- isPrivate: true
84
- };
81
+ fields: [typeField(), titleField(), contentField(), locationField([locationFolderIdField()]), dataField(params?.fields), tagsField()]
82
+ });
85
83
  };
86
84
  exports.createSearchModelDefinition = createSearchModelDefinition;
87
85
 
@@ -1 +1 @@
1
- {"version":3,"names":["_createModelField","require","typeField","createModelField","label","type","validation","name","message","titleField","contentField","locationField","fields","multipleValues","settings","locationFolderIdField","dataField","tagsField","SEARCH_RECORD_MODEL_ID","exports","DEFAULT_FIELDS","createSearchModelDefinition","params","modelId","titleFieldId","layout","map","field","description","isPrivate"],"sources":["record.model.ts"],"sourcesContent":["import { CmsModelField } from \"@webiny/api-headless-cms/types\";\nimport { createModelField } from \"~/utils/createModelField\";\nimport { CmsPrivateModelFull } from \"@webiny/api-headless-cms\";\n\nexport type SearchRecordModelDefinition = Omit<CmsPrivateModelFull, \"noValidate\" | \"group\">;\n\nconst typeField = () =>\n createModelField({\n label: \"Type\",\n type: \"text\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n });\n\nconst titleField = () =>\n createModelField({\n label: \"Title\",\n type: \"text\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n });\n\nconst contentField = () =>\n createModelField({\n label: \"Content\",\n type: \"text\"\n });\n\nconst locationField = (fields: CmsModelField[]) =>\n createModelField({\n label: \"Location\",\n type: \"object\",\n multipleValues: false,\n validation: [\n {\n name: \"required\",\n message: \"The location field must be populated.\"\n }\n ],\n settings: {\n fields\n }\n });\n\nconst locationFolderIdField = () =>\n createModelField({\n label: \"Folder Id\",\n type: \"text\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n });\n\nconst dataField = (fields?: CmsModelField[]) => {\n return createModelField({\n label: \"Data\",\n type: \"object\",\n multipleValues: false,\n validation: [\n {\n name: \"required\",\n message: \"The data field must be populated.\"\n }\n ],\n settings: {\n fields\n }\n });\n};\n\nconst tagsField = () =>\n createModelField({\n label: \"Tags\",\n type: \"text\",\n multipleValues: true,\n validation: [\n {\n name: \"required\",\n message: \"The tags field must be populated.\"\n }\n ]\n });\n\nexport const SEARCH_RECORD_MODEL_ID = \"acoSearchRecord\";\n\ninterface CreateSearchModelDefinitionParams {\n fields?: CmsModelField[];\n}\n\nexport const DEFAULT_FIELDS = [\"type\", \"title\", \"content\", \"location\", \"data\", \"tags\"];\n\nexport const createSearchModelDefinition = (\n params?: CreateSearchModelDefinitionParams\n): SearchRecordModelDefinition => {\n return {\n name: \"ACO - Search Record\",\n modelId: SEARCH_RECORD_MODEL_ID,\n titleFieldId: \"title\",\n layout: DEFAULT_FIELDS.map(field => [field]),\n fields: [\n typeField(),\n titleField(),\n contentField(),\n locationField([locationFolderIdField()]),\n dataField(params?.fields),\n tagsField()\n ],\n description: \"ACO - Search record model\",\n isPrivate: true\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["_createModelField","require","_apiHeadlessCms","typeField","createModelField","label","type","validation","name","message","titleField","contentField","locationField","fields","multipleValues","settings","locationFolderIdField","dataField","tagsField","SEARCH_RECORD_MODEL_ID","exports","DEFAULT_FIELDS","createSearchModelDefinition","params","createPrivateModelDefinition","modelId","titleFieldId"],"sources":["record.model.ts"],"sourcesContent":["import { CmsModelField } from \"@webiny/api-headless-cms/types\";\nimport { createModelField } from \"~/utils/createModelField\";\nimport { createPrivateModelDefinition } from \"@webiny/api-headless-cms\";\n\nconst typeField = () =>\n createModelField({\n label: \"Type\",\n type: \"text\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n });\n\nconst titleField = () =>\n createModelField({\n label: \"Title\",\n type: \"text\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n });\n\nconst contentField = () =>\n createModelField({\n label: \"Content\",\n type: \"text\"\n });\n\nconst locationField = (fields: CmsModelField[]) =>\n createModelField({\n label: \"Location\",\n type: \"object\",\n multipleValues: false,\n validation: [\n {\n name: \"required\",\n message: \"The location field must be populated.\"\n }\n ],\n settings: {\n fields\n }\n });\n\nconst locationFolderIdField = () =>\n createModelField({\n label: \"Folder Id\",\n type: \"text\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n });\n\nconst dataField = (fields?: CmsModelField[]) => {\n return createModelField({\n label: \"Data\",\n type: \"object\",\n multipleValues: false,\n validation: [\n {\n name: \"required\",\n message: \"The data field must be populated.\"\n }\n ],\n settings: {\n fields\n }\n });\n};\n\nconst tagsField = () =>\n createModelField({\n label: \"Tags\",\n type: \"text\",\n multipleValues: true,\n validation: [\n {\n name: \"required\",\n message: \"The tags field must be populated.\"\n }\n ]\n });\n\nexport const SEARCH_RECORD_MODEL_ID = \"acoSearchRecord\";\n\ninterface CreateSearchModelDefinitionParams {\n fields?: CmsModelField[];\n}\n\nexport const DEFAULT_FIELDS = [\"type\", \"title\", \"content\", \"location\", \"data\", \"tags\"];\n\nexport const createSearchModelDefinition = (params?: CreateSearchModelDefinitionParams) => {\n return createPrivateModelDefinition({\n name: \"ACO - Search Record\",\n modelId: SEARCH_RECORD_MODEL_ID,\n titleFieldId: \"title\",\n fields: [\n typeField(),\n titleField(),\n contentField(),\n locationField([locationFolderIdField()]),\n dataField(params?.fields),\n tagsField()\n ]\n });\n};\n"],"mappings":";;;;;;AACA,IAAAA,iBAAA,GAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AAEA,MAAME,SAAS,GAAGA,CAAA,KACd,IAAAC,kCAAgB,EAAC;EACbC,KAAK,EAAE,MAAM;EACbC,IAAI,EAAE,MAAM;EACZC,UAAU,EAAE,CACR;IACIC,IAAI,EAAE,UAAU;IAChBC,OAAO,EAAE;EACb,CAAC;AAET,CAAC,CAAC;AAEN,MAAMC,UAAU,GAAGA,CAAA,KACf,IAAAN,kCAAgB,EAAC;EACbC,KAAK,EAAE,OAAO;EACdC,IAAI,EAAE,MAAM;EACZC,UAAU,EAAE,CACR;IACIC,IAAI,EAAE,UAAU;IAChBC,OAAO,EAAE;EACb,CAAC;AAET,CAAC,CAAC;AAEN,MAAME,YAAY,GAAGA,CAAA,KACjB,IAAAP,kCAAgB,EAAC;EACbC,KAAK,EAAE,SAAS;EAChBC,IAAI,EAAE;AACV,CAAC,CAAC;AAEN,MAAMM,aAAa,GAAIC,MAAuB,IAC1C,IAAAT,kCAAgB,EAAC;EACbC,KAAK,EAAE,UAAU;EACjBC,IAAI,EAAE,QAAQ;EACdQ,cAAc,EAAE,KAAK;EACrBP,UAAU,EAAE,CACR;IACIC,IAAI,EAAE,UAAU;IAChBC,OAAO,EAAE;EACb,CAAC,CACJ;EACDM,QAAQ,EAAE;IACNF;EACJ;AACJ,CAAC,CAAC;AAEN,MAAMG,qBAAqB,GAAGA,CAAA,KAC1B,IAAAZ,kCAAgB,EAAC;EACbC,KAAK,EAAE,WAAW;EAClBC,IAAI,EAAE,MAAM;EACZC,UAAU,EAAE,CACR;IACIC,IAAI,EAAE,UAAU;IAChBC,OAAO,EAAE;EACb,CAAC;AAET,CAAC,CAAC;AAEN,MAAMQ,SAAS,GAAIJ,MAAwB,IAAK;EAC5C,OAAO,IAAAT,kCAAgB,EAAC;IACpBC,KAAK,EAAE,MAAM;IACbC,IAAI,EAAE,QAAQ;IACdQ,cAAc,EAAE,KAAK;IACrBP,UAAU,EAAE,CACR;MACIC,IAAI,EAAE,UAAU;MAChBC,OAAO,EAAE;IACb,CAAC,CACJ;IACDM,QAAQ,EAAE;MACNF;IACJ;EACJ,CAAC,CAAC;AACN,CAAC;AAED,MAAMK,SAAS,GAAGA,CAAA,KACd,IAAAd,kCAAgB,EAAC;EACbC,KAAK,EAAE,MAAM;EACbC,IAAI,EAAE,MAAM;EACZQ,cAAc,EAAE,IAAI;EACpBP,UAAU,EAAE,CACR;IACIC,IAAI,EAAE,UAAU;IAChBC,OAAO,EAAE;EACb,CAAC;AAET,CAAC,CAAC;AAEC,MAAMU,sBAAsB,GAAG,iBAAiB;AAACC,OAAA,CAAAD,sBAAA,GAAAA,sBAAA;AAMjD,MAAME,cAAc,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC;AAACD,OAAA,CAAAC,cAAA,GAAAA,cAAA;AAEhF,MAAMC,2BAA2B,GAAIC,MAA0C,IAAK;EACvF,OAAO,IAAAC,4CAA4B,EAAC;IAChChB,IAAI,EAAE,qBAAqB;IAC3BiB,OAAO,EAAEN,sBAAsB;IAC/BO,YAAY,EAAE,OAAO;IACrBb,MAAM,EAAE,CACJV,SAAS,CAAC,CAAC,EACXO,UAAU,CAAC,CAAC,EACZC,YAAY,CAAC,CAAC,EACdC,aAAa,CAAC,CAACI,qBAAqB,CAAC,CAAC,CAAC,CAAC,EACxCC,SAAS,CAACM,MAAM,EAAEV,MAAM,CAAC,EACzBK,SAAS,CAAC,CAAC;EAEnB,CAAC,CAAC;AACN,CAAC;AAACE,OAAA,CAAAE,2BAAA,GAAAA,2BAAA"}
@@ -5,13 +5,12 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.createSearchRecordOperations = void 0;
8
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
9
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
8
+ var _omit = _interopRequireDefault(require("lodash/omit"));
10
9
  var _error = _interopRequireDefault(require("@webiny/error"));
11
- var _getFieldValues = require("../utils/getFieldValues");
10
+ var _pickEntryFieldValues = require("../utils/pickEntryFieldValues");
12
11
  var _acoRecordId = require("../utils/acoRecordId");
13
12
  var _record = require("./record.model");
14
- const _excluded = ["tags", "data"];
13
+ var _constants = require("@webiny/api-headless-cms/constants");
15
14
  const createSearchRecordOperations = params => {
16
15
  const {
17
16
  cms,
@@ -38,7 +37,7 @@ const createSearchRecordOperations = params => {
38
37
  }) {
39
38
  return security.withoutAuthorization(async () => {
40
39
  const record = await getRecord(model, id);
41
- return (0, _getFieldValues.getRecordFieldValues)(record);
40
+ return (0, _pickEntryFieldValues.pickEntryFieldValues)(record);
42
41
  });
43
42
  },
44
43
  listRecords(model, params) {
@@ -47,11 +46,14 @@ const createSearchRecordOperations = params => {
47
46
  sort,
48
47
  where
49
48
  } = params;
50
- const [entries, meta] = await cms.listLatestEntries(model, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
49
+ const [entries, meta] = await cms.listLatestEntries(model, {
50
+ ...params,
51
51
  sort,
52
- where: (0, _objectSpread2.default)({}, where || {})
53
- }));
54
- return [entries.map(entry => (0, _getFieldValues.getRecordFieldValues)(entry)), meta];
52
+ where: {
53
+ ...(where || {})
54
+ }
55
+ });
56
+ return [entries.map(_pickEntryFieldValues.pickEntryFieldValues), meta];
55
57
  });
56
58
  },
57
59
  listTags(model, params) {
@@ -60,9 +62,10 @@ const createSearchRecordOperations = params => {
60
62
  where
61
63
  } = params;
62
64
  const items = await cms.getUniqueFieldValues(model, {
63
- where: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, where || {}), {}, {
65
+ where: {
66
+ ...(where || {}),
64
67
  latest: true
65
- }),
68
+ },
66
69
  fieldId: "tags"
67
70
  });
68
71
  const meta = {
@@ -84,17 +87,17 @@ const createSearchRecordOperations = params => {
84
87
  }) {
85
88
  return security.withoutAuthorization(async () => {
86
89
  const {
87
- tags = [],
88
- data = {}
89
- } = SearchRecordData,
90
- rest = (0, _objectWithoutProperties2.default)(SearchRecordData, _excluded);
91
- const entry = await cms.createEntry(model, (0, _objectSpread2.default)((0, _objectSpread2.default)({
90
+ tags = [],
91
+ data = {},
92
+ ...rest
93
+ } = SearchRecordData;
94
+ const entry = await cms.createEntry(model, {
92
95
  tags,
93
- data
94
- }, rest), {}, {
96
+ data,
97
+ ...rest,
95
98
  id: (0, _acoRecordId.attachAcoRecordPrefix)(rest.id)
96
- }));
97
- return (0, _getFieldValues.getRecordFieldValues)(entry);
99
+ });
100
+ return (0, _pickEntryFieldValues.pickEntryFieldValues)(entry);
98
101
  });
99
102
  },
100
103
  updateRecord(model, {
@@ -105,9 +108,16 @@ const createSearchRecordOperations = params => {
105
108
  const original = await this.getRecord(model, {
106
109
  id
107
110
  });
108
- const input = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), data);
111
+ const input = {
112
+ /**
113
+ * We are omitting the standard entry meta fields:
114
+ * we don't want to override them with the ones coming from the `original` entry.
115
+ */
116
+ ...(0, _omit.default)(original, _constants.ENTRY_META_FIELDS),
117
+ ...data
118
+ };
109
119
  const entry = await cms.updateEntry(model, (0, _acoRecordId.attachAcoRecordPrefix)(original.id), input);
110
- return (0, _getFieldValues.getRecordFieldValues)(entry);
120
+ return (0, _pickEntryFieldValues.pickEntryFieldValues)(entry);
111
121
  });
112
122
  },
113
123
  moveRecord(model, params) {
@@ -1 +1 @@
1
- {"version":3,"names":["_error","_interopRequireDefault","require","_getFieldValues","_acoRecordId","_record","_excluded","createSearchRecordOperations","params","cms","security","getRecord","model","id","revisions","storageOperations","entries","getLatestByIds","ids","attachAcoRecordPrefix","length","WebinyError","withoutAuthorization","record","getRecordFieldValues","listRecords","sort","where","meta","listLatestEntries","_objectSpread2","default","map","entry","listTags","items","getUniqueFieldValues","latest","fieldId","hasMoreItems","totalCount","cursor","tags","item","tag","value","count","createRecord","data","SearchRecordData","rest","_objectWithoutProperties2","createEntry","updateRecord","original","input","updateEntry","moveRecord","folderId","wbyAco_location","lookFor","SEARCH_RECORD_MODEL_ID","modelId","substring","location","deleteRecord","deleteEntry","exports"],"sources":["record.so.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { CreateAcoStorageOperationsParams } from \"~/createAcoStorageOperations\";\nimport { getRecordFieldValues } from \"~/utils/getFieldValues\";\nimport { AcoSearchRecordStorageOperations } from \"./record.types\";\nimport { CmsModel, UpdateCmsEntryInput } from \"@webiny/api-headless-cms/types\";\nimport { attachAcoRecordPrefix } from \"~/utils/acoRecordId\";\nimport { SEARCH_RECORD_MODEL_ID } from \"~/record/record.model\";\n\nexport const createSearchRecordOperations = (\n params: CreateAcoStorageOperationsParams\n): AcoSearchRecordStorageOperations => {\n const { cms, security } = params;\n\n const getRecord = async (model: CmsModel, id: string) => {\n /**\n * The record \"id\" has been passed by the original entry.\n * We need to retrieve it via `cms.storageOperations.entries.getLatestByIds()` method and return the first one.\n */\n const revisions = await cms.storageOperations.entries.getLatestByIds(model, {\n ids: [attachAcoRecordPrefix(id)]\n });\n\n if (revisions.length === 0) {\n throw new WebinyError(\"Record not found.\", \"NOT_FOUND\", {\n id\n });\n }\n\n return revisions[0];\n };\n\n return {\n async getRecord(model, { id }) {\n return security.withoutAuthorization(async () => {\n const record = await getRecord(model, id);\n return getRecordFieldValues(record);\n });\n },\n listRecords(model, params) {\n return security.withoutAuthorization(async () => {\n const { sort, where } = params;\n\n const [entries, meta] = await cms.listLatestEntries(model, {\n ...params,\n sort,\n where: {\n ...(where || {})\n }\n });\n\n return [entries.map(entry => getRecordFieldValues(entry)), meta];\n });\n },\n listTags(model, params) {\n return security.withoutAuthorization(async () => {\n const { where } = params;\n\n const items = await cms.getUniqueFieldValues(model, {\n where: {\n ...(where || {}),\n latest: true\n },\n fieldId: \"tags\"\n });\n\n const meta = {\n hasMoreItems: false,\n totalCount: items.length,\n cursor: null\n };\n\n const tags = items.map(item => {\n return {\n tag: item.value,\n count: item.count\n };\n });\n\n return [tags, meta];\n });\n },\n createRecord(model, { data: SearchRecordData }) {\n return security.withoutAuthorization(async () => {\n const { tags = [], data = {}, ...rest } = SearchRecordData;\n const entry = await cms.createEntry(model, {\n tags,\n data,\n ...rest,\n id: attachAcoRecordPrefix(rest.id)\n });\n\n return getRecordFieldValues(entry);\n });\n },\n updateRecord(this: AcoSearchRecordStorageOperations, model, { id, data }) {\n return security.withoutAuthorization(async () => {\n const original = await this.getRecord(model, { id });\n\n const input = {\n ...original,\n ...data\n };\n\n const entry = await cms.updateEntry(\n model,\n attachAcoRecordPrefix(original.id),\n input\n );\n\n return getRecordFieldValues(entry);\n });\n },\n moveRecord(this: AcoSearchRecordStorageOperations, model, params) {\n const { id, folderId } = params;\n return security.withoutAuthorization(async () => {\n const original = await this.getRecord(model, { id });\n\n const input: UpdateCmsEntryInput = {\n wbyAco_location: {\n folderId\n }\n };\n /**\n * We only apply the location to the search record model as we do not want to override the users data.\n */\n const lookFor = `${SEARCH_RECORD_MODEL_ID}-`;\n if (model.modelId.substring(0, lookFor.length) === lookFor) {\n input.location = {\n folderId\n };\n }\n\n await cms.updateEntry(model, attachAcoRecordPrefix(original.id), input);\n\n return true;\n });\n },\n deleteRecord(model, { id }) {\n return security.withoutAuthorization(async () => {\n await cms.deleteEntry(model, attachAcoRecordPrefix(id));\n return true;\n });\n }\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["_omit","_interopRequireDefault","require","_error","_pickEntryFieldValues","_acoRecordId","_record","_constants","createSearchRecordOperations","params","cms","security","getRecord","model","id","revisions","storageOperations","entries","getLatestByIds","ids","attachAcoRecordPrefix","length","WebinyError","withoutAuthorization","record","pickEntryFieldValues","listRecords","sort","where","meta","listLatestEntries","map","listTags","items","getUniqueFieldValues","latest","fieldId","hasMoreItems","totalCount","cursor","tags","item","tag","value","count","createRecord","data","SearchRecordData","rest","entry","createEntry","updateRecord","original","input","omit","ENTRY_META_FIELDS","updateEntry","moveRecord","folderId","wbyAco_location","lookFor","SEARCH_RECORD_MODEL_ID","modelId","substring","location","deleteRecord","deleteEntry","exports"],"sources":["record.so.ts"],"sourcesContent":["import omit from \"lodash/omit\";\nimport WebinyError from \"@webiny/error\";\nimport { CreateAcoStorageOperationsParams } from \"~/createAcoStorageOperations\";\nimport { pickEntryFieldValues } from \"~/utils/pickEntryFieldValues\";\nimport { AcoSearchRecordStorageOperations, SearchRecord } from \"./record.types\";\nimport { CmsModel, UpdateCmsEntryInput } from \"@webiny/api-headless-cms/types\";\nimport { attachAcoRecordPrefix } from \"~/utils/acoRecordId\";\nimport { SEARCH_RECORD_MODEL_ID } from \"~/record/record.model\";\nimport { ENTRY_META_FIELDS } from \"@webiny/api-headless-cms/constants\";\n\nexport const createSearchRecordOperations = (\n params: CreateAcoStorageOperationsParams\n): AcoSearchRecordStorageOperations => {\n const { cms, security } = params;\n\n const getRecord = async (model: CmsModel, id: string) => {\n /**\n * The record \"id\" has been passed by the original entry.\n * We need to retrieve it via `cms.storageOperations.entries.getLatestByIds()` method and return the first one.\n */\n const revisions = await cms.storageOperations.entries.getLatestByIds(model, {\n ids: [attachAcoRecordPrefix(id)]\n });\n\n if (revisions.length === 0) {\n throw new WebinyError(\"Record not found.\", \"NOT_FOUND\", {\n id\n });\n }\n\n return revisions[0];\n };\n\n return {\n async getRecord(model, { id }) {\n return security.withoutAuthorization(async () => {\n const record = await getRecord(model, id);\n return pickEntryFieldValues<SearchRecord<any>>(record);\n });\n },\n listRecords(model, params) {\n return security.withoutAuthorization(async () => {\n const { sort, where } = params;\n\n const [entries, meta] = await cms.listLatestEntries(model, {\n ...params,\n sort,\n where: {\n ...(where || {})\n }\n });\n\n return [entries.map(pickEntryFieldValues<SearchRecord<any>>), meta];\n });\n },\n listTags(model, params) {\n return security.withoutAuthorization(async () => {\n const { where } = params;\n\n const items = await cms.getUniqueFieldValues(model, {\n where: {\n ...(where || {}),\n latest: true\n },\n fieldId: \"tags\"\n });\n\n const meta = {\n hasMoreItems: false,\n totalCount: items.length,\n cursor: null\n };\n\n const tags = items.map(item => {\n return {\n tag: item.value,\n count: item.count\n };\n });\n\n return [tags, meta];\n });\n },\n createRecord(model, { data: SearchRecordData }) {\n return security.withoutAuthorization(async () => {\n const { tags = [], data = {}, ...rest } = SearchRecordData;\n const entry = await cms.createEntry(model, {\n tags,\n data,\n ...rest,\n id: attachAcoRecordPrefix(rest.id)\n });\n\n return pickEntryFieldValues<SearchRecord<any>>(entry);\n });\n },\n updateRecord(this: AcoSearchRecordStorageOperations, model, { id, data }) {\n return security.withoutAuthorization(async () => {\n const original = await this.getRecord(model, { id });\n\n const input = {\n /**\n * We are omitting the standard entry meta fields:\n * we don't want to override them with the ones coming from the `original` entry.\n */\n ...omit(original, ENTRY_META_FIELDS),\n ...data\n };\n\n const entry = await cms.updateEntry(\n model,\n attachAcoRecordPrefix(original.id),\n input\n );\n\n return pickEntryFieldValues<SearchRecord<any>>(entry);\n });\n },\n moveRecord(this: AcoSearchRecordStorageOperations, model, params) {\n const { id, folderId } = params;\n return security.withoutAuthorization(async () => {\n const original = await this.getRecord(model, { id });\n\n const input: UpdateCmsEntryInput = {\n wbyAco_location: {\n folderId\n }\n };\n /**\n * We only apply the location to the search record model as we do not want to override the users data.\n */\n const lookFor = `${SEARCH_RECORD_MODEL_ID}-`;\n if (model.modelId.substring(0, lookFor.length) === lookFor) {\n input.location = {\n folderId\n };\n }\n\n await cms.updateEntry(model, attachAcoRecordPrefix(original.id), input);\n\n return true;\n });\n },\n deleteRecord(model, { id }) {\n return security.withoutAuthorization(async () => {\n await cms.deleteEntry(model, attachAcoRecordPrefix(id));\n return true;\n });\n }\n };\n};\n"],"mappings":"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"}
@@ -114,7 +114,7 @@ export interface AcoSearchRecordCrudBase {
114
114
  create<TData extends GenericSearchData = GenericSearchData>(data: CreateSearchRecordParams<TData>): Promise<SearchRecord<TData>>;
115
115
  update<TData extends GenericSearchData = GenericSearchData>(id: string, data: UpdateSearchRecordParams<TData>): Promise<SearchRecord<TData>>;
116
116
  move(id: string, folderId?: string | null): Promise<boolean>;
117
- delete(id: string): Promise<Boolean>;
117
+ delete(id: string): Promise<boolean>;
118
118
  }
119
119
  export interface AcoSearchRecordCrud extends Omit<AcoSearchRecordCrudBase, "get" | "list" | "create" | "update" | "delete" | "listTags" | "move"> {
120
120
  get<TData>(model: CmsModel, id: string): Promise<SearchRecord<TData>>;
@@ -123,7 +123,7 @@ export interface AcoSearchRecordCrud extends Omit<AcoSearchRecordCrudBase, "get"
123
123
  create<TData>(model: CmsModel, data: CreateSearchRecordParams<TData>): Promise<SearchRecord<TData>>;
124
124
  update<TData>(model: CmsModel, id: string, data: UpdateSearchRecordParams<TData>): Promise<SearchRecord<TData>>;
125
125
  move(model: CmsModel, id: string, folderId?: string | null): Promise<boolean>;
126
- delete(model: CmsModel, id: string): Promise<Boolean>;
126
+ delete(model: CmsModel, id: string): Promise<boolean>;
127
127
  onSearchRecordBeforeCreate: Topic<OnSearchRecordBeforeCreateTopicParams>;
128
128
  onSearchRecordAfterCreate: Topic<OnSearchRecordAfterCreateTopicParams>;
129
129
  onSearchRecordBeforeUpdate: Topic<OnSearchRecordBeforeUpdateTopicParams>;
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["record.types.ts"],"sourcesContent":["import { AcoBaseFields, ListMeta } from \"~/types\";\nimport { Topic } from \"@webiny/pubsub/types\";\nimport { CmsModel } from \"@webiny/api-headless-cms/types\";\n\nexport type GenericSearchData = {\n [key: string]: any;\n};\n\nexport interface Location {\n folderId: string;\n}\n\nexport interface SearchRecord<TData extends GenericSearchData = GenericSearchData>\n extends AcoBaseFields {\n type: string;\n title: string;\n content?: string;\n location: Location;\n data: TData;\n tags: string[];\n}\n\nexport interface SearchRecordTag {\n tag: string;\n count: number;\n}\n\nexport interface ListSearchRecordsWhere<TData extends GenericSearchData = GenericSearchData> {\n type: string;\n location?: {\n folderId: string;\n };\n tags_in?: string[];\n tags_startsWith?: string;\n tags_not_startsWith?: string;\n data?: TData;\n}\n\nexport interface ListSearchRecordsParams {\n where?: ListSearchRecordsWhere;\n search?: string;\n sort?: string[];\n limit?: number;\n after?: string | null;\n}\n\nexport type CreateSearchRecordParams<TData> = Pick<\n SearchRecord<TData>,\n \"id\" | \"title\" | \"content\" | \"type\" | \"location\" | \"data\" | \"tags\"\n>;\n\nexport interface UpdateSearchRecordParams<TData extends GenericSearchData> {\n title?: string;\n content?: string;\n location?: Location;\n data?: TData;\n tags?: string[];\n}\n\nexport interface DeleteSearchRecordParams {\n id: string;\n}\n\nexport interface ListSearchRecordTagsWhere {\n type: string;\n}\n\nexport interface ListSearchRecordTagsParams {\n where?: ListSearchRecordTagsWhere;\n}\n\nexport interface StorageOperationsGetSearchRecordParams {\n id: string;\n}\n\nexport type StorageOperationsListSearchRecordsParams = ListSearchRecordsParams;\nexport type StorageOperationsListSearchRecordTagsParams = ListSearchRecordTagsParams;\n\nexport interface StorageOperationsCreateSearchRecordParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n data: CreateSearchRecordParams<TData>;\n}\n\nexport interface StorageOperationsUpdateSearchRecordParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n id: string;\n data: UpdateSearchRecordParams<TData>;\n}\n\nexport interface StorageOperationsMoveSearchRecordParams {\n id: string;\n folderId?: string | null;\n}\n\nexport type StorageOperationsDeleteSearchRecordParams = DeleteSearchRecordParams;\n\nexport interface OnSearchRecordBeforeCreateTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n input: CreateSearchRecordParams<TData>;\n}\n\nexport interface OnSearchRecordAfterCreateTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n record: SearchRecord<TData>;\n}\n\nexport interface OnSearchRecordBeforeUpdateTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n original: SearchRecord<TData>;\n input: Record<string, any>;\n}\n\nexport interface OnSearchRecordBeforeMoveTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n original: SearchRecord<TData>;\n folderId?: string | null;\n}\n\nexport interface OnSearchRecordAfterMoveTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n original: SearchRecord<TData>;\n folderId?: string | null;\n}\n\nexport interface OnSearchRecordAfterUpdateTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n original: SearchRecord<TData>;\n record: SearchRecord<TData>;\n input: Record<string, any>;\n}\n\nexport interface OnSearchRecordBeforeDeleteTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n record: SearchRecord<TData>;\n}\n\nexport interface OnSearchRecordAfterDeleteTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n record: SearchRecord<TData>;\n}\n\nexport interface AcoSearchRecordCrudBase {\n get<TData extends GenericSearchData = GenericSearchData>(\n id: string\n ): Promise<SearchRecord<TData>>;\n list<TData extends GenericSearchData = GenericSearchData>(\n params: ListSearchRecordsParams\n ): Promise<[SearchRecord<TData>[], ListMeta]>;\n listTags(params: ListSearchRecordTagsParams): Promise<[SearchRecordTag[], ListMeta]>;\n create<TData extends GenericSearchData = GenericSearchData>(\n data: CreateSearchRecordParams<TData>\n ): Promise<SearchRecord<TData>>;\n update<TData extends GenericSearchData = GenericSearchData>(\n id: string,\n data: UpdateSearchRecordParams<TData>\n ): Promise<SearchRecord<TData>>;\n move(id: string, folderId?: string | null): Promise<boolean>;\n delete(id: string): Promise<Boolean>;\n}\n\nexport interface AcoSearchRecordCrud\n extends Omit<\n AcoSearchRecordCrudBase,\n \"get\" | \"list\" | \"create\" | \"update\" | \"delete\" | \"listTags\" | \"move\"\n > {\n get<TData>(model: CmsModel, id: string): Promise<SearchRecord<TData>>;\n list<TData>(\n model: CmsModel,\n params: ListSearchRecordsParams\n ): Promise<[SearchRecord<TData>[], ListMeta]>;\n listTags(\n model: CmsModel,\n params: ListSearchRecordTagsParams\n ): Promise<[SearchRecordTag[], ListMeta]>;\n create<TData>(\n model: CmsModel,\n data: CreateSearchRecordParams<TData>\n ): Promise<SearchRecord<TData>>;\n update<TData>(\n model: CmsModel,\n id: string,\n data: UpdateSearchRecordParams<TData>\n ): Promise<SearchRecord<TData>>;\n move(model: CmsModel, id: string, folderId?: string | null): Promise<boolean>;\n delete(model: CmsModel, id: string): Promise<Boolean>;\n onSearchRecordBeforeCreate: Topic<OnSearchRecordBeforeCreateTopicParams>;\n onSearchRecordAfterCreate: Topic<OnSearchRecordAfterCreateTopicParams>;\n onSearchRecordBeforeUpdate: Topic<OnSearchRecordBeforeUpdateTopicParams>;\n onSearchRecordAfterUpdate: Topic<OnSearchRecordAfterUpdateTopicParams>;\n onSearchRecordBeforeMove: Topic<OnSearchRecordBeforeMoveTopicParams>;\n onSearchRecordAfterMove: Topic<OnSearchRecordAfterMoveTopicParams>;\n onSearchRecordBeforeDelete: Topic<OnSearchRecordBeforeDeleteTopicParams>;\n onSearchRecordAfterDelete: Topic<OnSearchRecordAfterDeleteTopicParams>;\n}\n\nexport interface AcoSearchRecordStorageOperations {\n getRecord<TData extends GenericSearchData = GenericSearchData>(\n model: CmsModel,\n params: StorageOperationsGetSearchRecordParams\n ): Promise<SearchRecord<TData>>;\n listRecords<TData extends GenericSearchData = GenericSearchData>(\n model: CmsModel,\n params: StorageOperationsListSearchRecordsParams\n ): Promise<[SearchRecord<TData>[], ListMeta]>;\n listTags(\n model: CmsModel,\n params: StorageOperationsListSearchRecordTagsParams\n ): Promise<[SearchRecordTag[], ListMeta]>;\n createRecord<TData extends GenericSearchData = GenericSearchData>(\n model: CmsModel,\n params: StorageOperationsCreateSearchRecordParams<TData>\n ): Promise<SearchRecord<TData>>;\n updateRecord<TData extends GenericSearchData = GenericSearchData>(\n model: CmsModel,\n params: StorageOperationsUpdateSearchRecordParams<TData>\n ): Promise<SearchRecord<TData>>;\n moveRecord(model: CmsModel, params: StorageOperationsMoveSearchRecordParams): Promise<boolean>;\n deleteRecord(\n model: CmsModel,\n params: StorageOperationsDeleteSearchRecordParams\n ): Promise<boolean>;\n}\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["record.types.ts"],"sourcesContent":["import { AcoBaseFields, ListMeta } from \"~/types\";\nimport { Topic } from \"@webiny/pubsub/types\";\nimport { CmsModel } from \"@webiny/api-headless-cms/types\";\n\nexport type GenericSearchData = {\n [key: string]: any;\n};\n\nexport interface Location {\n folderId: string;\n}\n\nexport interface SearchRecord<TData extends GenericSearchData = GenericSearchData>\n extends AcoBaseFields {\n type: string;\n title: string;\n content?: string;\n location: Location;\n data: TData;\n tags: string[];\n}\n\nexport interface SearchRecordTag {\n tag: string;\n count: number;\n}\n\nexport interface ListSearchRecordsWhere<TData extends GenericSearchData = GenericSearchData> {\n type: string;\n location?: {\n folderId: string;\n };\n tags_in?: string[];\n tags_startsWith?: string;\n tags_not_startsWith?: string;\n data?: TData;\n}\n\nexport interface ListSearchRecordsParams {\n where?: ListSearchRecordsWhere;\n search?: string;\n sort?: string[];\n limit?: number;\n after?: string | null;\n}\n\nexport type CreateSearchRecordParams<TData> = Pick<\n SearchRecord<TData>,\n \"id\" | \"title\" | \"content\" | \"type\" | \"location\" | \"data\" | \"tags\"\n>;\n\nexport interface UpdateSearchRecordParams<TData extends GenericSearchData> {\n title?: string;\n content?: string;\n location?: Location;\n data?: TData;\n tags?: string[];\n}\n\nexport interface DeleteSearchRecordParams {\n id: string;\n}\n\nexport interface ListSearchRecordTagsWhere {\n type: string;\n}\n\nexport interface ListSearchRecordTagsParams {\n where?: ListSearchRecordTagsWhere;\n}\n\nexport interface StorageOperationsGetSearchRecordParams {\n id: string;\n}\n\nexport type StorageOperationsListSearchRecordsParams = ListSearchRecordsParams;\nexport type StorageOperationsListSearchRecordTagsParams = ListSearchRecordTagsParams;\n\nexport interface StorageOperationsCreateSearchRecordParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n data: CreateSearchRecordParams<TData>;\n}\n\nexport interface StorageOperationsUpdateSearchRecordParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n id: string;\n data: UpdateSearchRecordParams<TData>;\n}\n\nexport interface StorageOperationsMoveSearchRecordParams {\n id: string;\n folderId?: string | null;\n}\n\nexport type StorageOperationsDeleteSearchRecordParams = DeleteSearchRecordParams;\n\nexport interface OnSearchRecordBeforeCreateTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n input: CreateSearchRecordParams<TData>;\n}\n\nexport interface OnSearchRecordAfterCreateTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n record: SearchRecord<TData>;\n}\n\nexport interface OnSearchRecordBeforeUpdateTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n original: SearchRecord<TData>;\n input: Record<string, any>;\n}\n\nexport interface OnSearchRecordBeforeMoveTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n original: SearchRecord<TData>;\n folderId?: string | null;\n}\n\nexport interface OnSearchRecordAfterMoveTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n original: SearchRecord<TData>;\n folderId?: string | null;\n}\n\nexport interface OnSearchRecordAfterUpdateTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n original: SearchRecord<TData>;\n record: SearchRecord<TData>;\n input: Record<string, any>;\n}\n\nexport interface OnSearchRecordBeforeDeleteTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n record: SearchRecord<TData>;\n}\n\nexport interface OnSearchRecordAfterDeleteTopicParams<\n TData extends GenericSearchData = GenericSearchData\n> {\n model: CmsModel;\n record: SearchRecord<TData>;\n}\n\nexport interface AcoSearchRecordCrudBase {\n get<TData extends GenericSearchData = GenericSearchData>(\n id: string\n ): Promise<SearchRecord<TData>>;\n list<TData extends GenericSearchData = GenericSearchData>(\n params: ListSearchRecordsParams\n ): Promise<[SearchRecord<TData>[], ListMeta]>;\n listTags(params: ListSearchRecordTagsParams): Promise<[SearchRecordTag[], ListMeta]>;\n create<TData extends GenericSearchData = GenericSearchData>(\n data: CreateSearchRecordParams<TData>\n ): Promise<SearchRecord<TData>>;\n update<TData extends GenericSearchData = GenericSearchData>(\n id: string,\n data: UpdateSearchRecordParams<TData>\n ): Promise<SearchRecord<TData>>;\n move(id: string, folderId?: string | null): Promise<boolean>;\n delete(id: string): Promise<boolean>;\n}\n\nexport interface AcoSearchRecordCrud\n extends Omit<\n AcoSearchRecordCrudBase,\n \"get\" | \"list\" | \"create\" | \"update\" | \"delete\" | \"listTags\" | \"move\"\n > {\n get<TData>(model: CmsModel, id: string): Promise<SearchRecord<TData>>;\n list<TData>(\n model: CmsModel,\n params: ListSearchRecordsParams\n ): Promise<[SearchRecord<TData>[], ListMeta]>;\n listTags(\n model: CmsModel,\n params: ListSearchRecordTagsParams\n ): Promise<[SearchRecordTag[], ListMeta]>;\n create<TData>(\n model: CmsModel,\n data: CreateSearchRecordParams<TData>\n ): Promise<SearchRecord<TData>>;\n update<TData>(\n model: CmsModel,\n id: string,\n data: UpdateSearchRecordParams<TData>\n ): Promise<SearchRecord<TData>>;\n move(model: CmsModel, id: string, folderId?: string | null): Promise<boolean>;\n delete(model: CmsModel, id: string): Promise<boolean>;\n onSearchRecordBeforeCreate: Topic<OnSearchRecordBeforeCreateTopicParams>;\n onSearchRecordAfterCreate: Topic<OnSearchRecordAfterCreateTopicParams>;\n onSearchRecordBeforeUpdate: Topic<OnSearchRecordBeforeUpdateTopicParams>;\n onSearchRecordAfterUpdate: Topic<OnSearchRecordAfterUpdateTopicParams>;\n onSearchRecordBeforeMove: Topic<OnSearchRecordBeforeMoveTopicParams>;\n onSearchRecordAfterMove: Topic<OnSearchRecordAfterMoveTopicParams>;\n onSearchRecordBeforeDelete: Topic<OnSearchRecordBeforeDeleteTopicParams>;\n onSearchRecordAfterDelete: Topic<OnSearchRecordAfterDeleteTopicParams>;\n}\n\nexport interface AcoSearchRecordStorageOperations {\n getRecord<TData extends GenericSearchData = GenericSearchData>(\n model: CmsModel,\n params: StorageOperationsGetSearchRecordParams\n ): Promise<SearchRecord<TData>>;\n listRecords<TData extends GenericSearchData = GenericSearchData>(\n model: CmsModel,\n params: StorageOperationsListSearchRecordsParams\n ): Promise<[SearchRecord<TData>[], ListMeta]>;\n listTags(\n model: CmsModel,\n params: StorageOperationsListSearchRecordTagsParams\n ): Promise<[SearchRecordTag[], ListMeta]>;\n createRecord<TData extends GenericSearchData = GenericSearchData>(\n model: CmsModel,\n params: StorageOperationsCreateSearchRecordParams<TData>\n ): Promise<SearchRecord<TData>>;\n updateRecord<TData extends GenericSearchData = GenericSearchData>(\n model: CmsModel,\n params: StorageOperationsUpdateSearchRecordParams<TData>\n ): Promise<SearchRecord<TData>>;\n moveRecord(model: CmsModel, params: StorageOperationsMoveSearchRecordParams): Promise<boolean>;\n deleteRecord(\n model: CmsModel,\n params: StorageOperationsDeleteSearchRecordParams\n ): Promise<boolean>;\n}\n"],"mappings":""}
package/types.d.ts CHANGED
@@ -31,8 +31,11 @@ export interface AcoBaseFields {
31
31
  id: string;
32
32
  entryId: string;
33
33
  createdOn: string;
34
- createdBy: User;
34
+ modifiedOn: string | null;
35
35
  savedOn: string;
36
+ createdBy: User;
37
+ modifiedBy: User | null;
38
+ savedBy: User;
36
39
  }
37
40
  export interface AdvancedContentOrganisation {
38
41
  folder: AcoFolderCrud;
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["_filter","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_folder","_record","ListSortDirection"],"sources":["types.ts"],"sourcesContent":["import { TenancyContext, Tenant } from \"@webiny/api-tenancy/types\";\nimport { Context as BaseContext } from \"@webiny/handler/types\";\nimport { I18NContext, I18NLocale } from \"@webiny/api-i18n/types\";\nimport { SecurityContext } from \"@webiny/api-security/types\";\nimport { AdminUsersContext } from \"@webiny/api-admin-users/types\";\nimport { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport { CmsContext, CmsModel, CmsModelField } from \"@webiny/api-headless-cms/types\";\nimport {\n AcoSearchRecordCrud,\n AcoSearchRecordCrudBase,\n AcoSearchRecordStorageOperations,\n SearchRecord\n} from \"~/record/record.types\";\nimport { AcoFolderCrud, AcoFolderStorageOperations } from \"~/folder/folder.types\";\nimport { AcoFilterCrud, AcoFilterStorageOperations } from \"~/filter/filter.types\";\nimport { FolderLevelPermissions } from \"~/utils/FolderLevelPermissions\";\n\nexport * from \"./filter/filter.types\";\nexport * from \"./folder/folder.types\";\nexport * from \"./record/record.types\";\n\nexport interface User {\n id: string;\n type: string;\n displayName: string | null;\n}\n\nexport interface ListMeta {\n cursor: string | null;\n totalCount: number;\n hasMoreItems: boolean;\n}\n\nexport enum ListSortDirection {\n ASC,\n DESC\n}\n\nexport type ListSort = Record<string, ListSortDirection>;\n\nexport interface AcoBaseFields {\n id: string;\n entryId: string;\n createdOn: string;\n createdBy: User;\n savedOn: string;\n}\n\nexport interface AdvancedContentOrganisation {\n folder: AcoFolderCrud;\n search: AcoSearchRecordCrud;\n filter: AcoFilterCrud;\n folderLevelPermissions: FolderLevelPermissions;\n apps: IAcoApps;\n registerApp: (params: IAcoAppRegisterParams) => Promise<IAcoApp>;\n getApp: (name: string) => IAcoApp;\n listApps: () => IAcoApp[];\n}\n\nexport interface CreateAcoParams {\n getLocale: () => I18NLocale;\n getTenant: () => Tenant;\n storageOperations: AcoStorageOperations;\n folderLevelPermissions: FolderLevelPermissions;\n}\n\nexport type AcoStorageOperations = AcoFolderStorageOperations &\n AcoSearchRecordStorageOperations &\n AcoFilterStorageOperations;\n\nexport interface AcoContext\n extends BaseContext,\n I18NContext,\n TenancyContext,\n SecurityContext,\n AdminUsersContext,\n CmsContext,\n FileManagerContext {\n aco: AdvancedContentOrganisation;\n}\n\n/**\n * @deprecated Use AcoContext instead\n */\nexport type ACOContext = AcoContext;\n\n/**\n * Apps\n */\nexport interface IAcoAppAddFieldCallable {\n (field: CmsModelField): void;\n}\n\nexport interface IAcoAppRemoveFieldCallable {\n (id: string): void;\n}\n\nexport interface IAcoAppModifyFieldCallableCallback {\n (field: CmsModelField): CmsModelField;\n}\n\nexport interface IAcoAppModifyFieldCallable {\n (id: string, cb: IAcoAppModifyFieldCallableCallback): void;\n}\n\nexport interface IAcoApp {\n context: AcoContext;\n search: AcoSearchRecordCrudBase;\n folder: AcoFolderCrud;\n name: string;\n model: CmsModel;\n getFields: () => CmsModelField[];\n addField: IAcoAppAddFieldCallable;\n removeField: IAcoAppRemoveFieldCallable;\n modifyField: IAcoAppModifyFieldCallable;\n}\n// TODO: determine correct type\nexport type IAcoAppOnEntry<T = any> = (entry: SearchRecord<T>) => Promise<SearchRecord<T>>;\nexport type IAcoAppOnEntryList<T = any> = (entry: SearchRecord<T>[]) => Promise<SearchRecord<T>[]>;\nexport type AcoRequestAction = \"create\" | \"update\" | \"delete\" | \"move\" | \"fetch\";\nexport type IAcoAppOnAnyRequest = (context: AcoContext, action: AcoRequestAction) => Promise<void>;\n\nexport interface IAcoAppParams {\n name: string;\n apiName: string;\n model: CmsModel;\n fields: CmsModelField[];\n onEntry?: IAcoAppOnEntry;\n onEntryList?: IAcoAppOnEntryList;\n onAnyRequest?: IAcoAppOnAnyRequest;\n}\n\nexport type IAcoAppsOptions = CreateAcoParams;\n\nexport interface IAcoApps {\n list: () => IAcoApp[];\n register: (app: IAcoAppParams) => Promise<IAcoApp>;\n}\n\nexport type IAcoAppRegisterParams = Omit<IAcoAppParams, \"model\">;\n"],"mappings":";;;;;;;;;AAiBA,IAAAA,OAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,OAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAL,OAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAb,OAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAS,OAAA,GAAAb,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAW,OAAA,EAAAV,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAS,OAAA,CAAAT,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,OAAA,CAAAT,GAAA;IAAA;EAAA;AAAA;AACA,IAAAU,OAAA,GAAAd,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAY,OAAA,EAAAX,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAU,OAAA,CAAAV,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,OAAA,CAAAV,GAAA;IAAA;EAAA;AAAA;AAAsC,IAc1BW,iBAAiB,0BAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAA,OAAjBA,iBAAiB;AAAA;AAgD7B;AACA;AACA;AAGA;AACA;AACA;AA4BA;AAAAN,OAAA,CAAAM,iBAAA,GAAAA,iBAAA"}
1
+ {"version":3,"names":["_filter","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_folder","_record","ListSortDirection"],"sources":["types.ts"],"sourcesContent":["import { TenancyContext, Tenant } from \"@webiny/api-tenancy/types\";\nimport { Context as BaseContext } from \"@webiny/handler/types\";\nimport { I18NContext, I18NLocale } from \"@webiny/api-i18n/types\";\nimport { SecurityContext } from \"@webiny/api-security/types\";\nimport { AdminUsersContext } from \"@webiny/api-admin-users/types\";\nimport { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport { CmsContext, CmsModel, CmsModelField } from \"@webiny/api-headless-cms/types\";\nimport {\n AcoSearchRecordCrud,\n AcoSearchRecordCrudBase,\n AcoSearchRecordStorageOperations,\n SearchRecord\n} from \"~/record/record.types\";\nimport { AcoFolderCrud, AcoFolderStorageOperations } from \"~/folder/folder.types\";\nimport { AcoFilterCrud, AcoFilterStorageOperations } from \"~/filter/filter.types\";\nimport { FolderLevelPermissions } from \"~/utils/FolderLevelPermissions\";\n\nexport * from \"./filter/filter.types\";\nexport * from \"./folder/folder.types\";\nexport * from \"./record/record.types\";\n\nexport interface User {\n id: string;\n type: string;\n displayName: string | null;\n}\n\nexport interface ListMeta {\n cursor: string | null;\n totalCount: number;\n hasMoreItems: boolean;\n}\n\nexport enum ListSortDirection {\n ASC,\n DESC\n}\n\nexport type ListSort = Record<string, ListSortDirection>;\n\nexport interface AcoBaseFields {\n id: string;\n entryId: string;\n createdOn: string;\n modifiedOn: string | null;\n savedOn: string;\n createdBy: User;\n modifiedBy: User | null;\n savedBy: User;\n}\n\nexport interface AdvancedContentOrganisation {\n folder: AcoFolderCrud;\n search: AcoSearchRecordCrud;\n filter: AcoFilterCrud;\n folderLevelPermissions: FolderLevelPermissions;\n apps: IAcoApps;\n registerApp: (params: IAcoAppRegisterParams) => Promise<IAcoApp>;\n getApp: (name: string) => IAcoApp;\n listApps: () => IAcoApp[];\n}\n\nexport interface CreateAcoParams {\n getLocale: () => I18NLocale;\n getTenant: () => Tenant;\n storageOperations: AcoStorageOperations;\n folderLevelPermissions: FolderLevelPermissions;\n}\n\nexport type AcoStorageOperations = AcoFolderStorageOperations &\n AcoSearchRecordStorageOperations &\n AcoFilterStorageOperations;\n\nexport interface AcoContext\n extends BaseContext,\n I18NContext,\n TenancyContext,\n SecurityContext,\n AdminUsersContext,\n CmsContext,\n FileManagerContext {\n aco: AdvancedContentOrganisation;\n}\n\n/**\n * @deprecated Use AcoContext instead\n */\nexport type ACOContext = AcoContext;\n\n/**\n * Apps\n */\nexport interface IAcoAppAddFieldCallable {\n (field: CmsModelField): void;\n}\n\nexport interface IAcoAppRemoveFieldCallable {\n (id: string): void;\n}\n\nexport interface IAcoAppModifyFieldCallableCallback {\n (field: CmsModelField): CmsModelField;\n}\n\nexport interface IAcoAppModifyFieldCallable {\n (id: string, cb: IAcoAppModifyFieldCallableCallback): void;\n}\n\nexport interface IAcoApp {\n context: AcoContext;\n search: AcoSearchRecordCrudBase;\n folder: AcoFolderCrud;\n name: string;\n model: CmsModel;\n getFields: () => CmsModelField[];\n addField: IAcoAppAddFieldCallable;\n removeField: IAcoAppRemoveFieldCallable;\n modifyField: IAcoAppModifyFieldCallable;\n}\n// TODO: determine correct type\nexport type IAcoAppOnEntry<T = any> = (entry: SearchRecord<T>) => Promise<SearchRecord<T>>;\nexport type IAcoAppOnEntryList<T = any> = (entry: SearchRecord<T>[]) => Promise<SearchRecord<T>[]>;\nexport type AcoRequestAction = \"create\" | \"update\" | \"delete\" | \"move\" | \"fetch\";\nexport type IAcoAppOnAnyRequest = (context: AcoContext, action: AcoRequestAction) => Promise<void>;\n\nexport interface IAcoAppParams {\n name: string;\n apiName: string;\n model: CmsModel;\n fields: CmsModelField[];\n onEntry?: IAcoAppOnEntry;\n onEntryList?: IAcoAppOnEntryList;\n onAnyRequest?: IAcoAppOnAnyRequest;\n}\n\nexport type IAcoAppsOptions = CreateAcoParams;\n\nexport interface IAcoApps {\n list: () => IAcoApp[];\n register: (app: IAcoAppParams) => Promise<IAcoApp>;\n}\n\nexport type IAcoAppRegisterParams = Omit<IAcoAppParams, \"model\">;\n"],"mappings":";;;;;;;;;AAiBA,IAAAA,OAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,OAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAL,OAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAb,OAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAS,OAAA,GAAAb,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAW,OAAA,EAAAV,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAS,OAAA,CAAAT,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,OAAA,CAAAT,GAAA;IAAA;EAAA;AAAA;AACA,IAAAU,OAAA,GAAAd,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAY,OAAA,EAAAX,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAU,OAAA,CAAAV,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,OAAA,CAAAV,GAAA;IAAA;EAAA;AAAA;AAAsC,IAc1BW,iBAAiB,0BAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAA,OAAjBA,iBAAiB;AAAA;AAmD7B;AACA;AACA;AAGA;AACA;AACA;AA4BA;AAAAN,OAAA,CAAAM,iBAAA,GAAAA,iBAAA"}
@@ -1,24 +1,13 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports.FolderLevelPermissions = void 0;
8
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
7
  var _apiSecurity = require("@webiny/api-security");
11
- var _structuredClone = _interopRequireDefault(require("@ungap/structured-clone"));
12
8
  class FolderLevelPermissions {
9
+ allFolders = {};
13
10
  constructor(params) {
14
- (0, _defineProperty2.default)(this, "getIdentity", void 0);
15
- (0, _defineProperty2.default)(this, "getIdentityTeam", void 0);
16
- (0, _defineProperty2.default)(this, "listPermissions", void 0);
17
- (0, _defineProperty2.default)(this, "listAllFoldersCallback", void 0);
18
- (0, _defineProperty2.default)(this, "canUseTeams", void 0);
19
- (0, _defineProperty2.default)(this, "canUseFolderLevelPermissions", void 0);
20
- (0, _defineProperty2.default)(this, "isAuthorizationEnabled", void 0);
21
- (0, _defineProperty2.default)(this, "allFolders", {});
22
11
  this.getIdentity = params.getIdentity;
23
12
  this.getIdentityTeam = params.getIdentityTeam;
24
13
  this.listPermissions = params.listPermissions;
@@ -37,10 +26,10 @@ class FolderLevelPermissions {
37
26
  }
38
27
  async listAllFolders(folderType) {
39
28
  if (folderType in this.allFolders) {
40
- return (0, _structuredClone.default)(this.allFolders[folderType]);
29
+ return structuredClone(this.allFolders[folderType]);
41
30
  }
42
31
  this.allFolders[folderType] = await this.listAllFoldersCallback(folderType);
43
- return (0, _structuredClone.default)(this.allFolders[folderType]);
32
+ return structuredClone(this.allFolders[folderType]);
44
33
  }
45
34
  async listAllFoldersWithPermissions(folderType) {
46
35
  const folders = await this.listAllFolders(folderType);
@@ -79,7 +68,6 @@ class FolderLevelPermissions {
79
68
  }
80
69
  const processedFolderPermissions = [];
81
70
  const processFolderPermissions = folder => {
82
- var _folder$permissions;
83
71
  if (processedFolderPermissions.some(fp => fp.folderId === folder.id)) {
84
72
  return;
85
73
  }
@@ -88,7 +76,9 @@ class FolderLevelPermissions {
88
76
  const currentFolderPermissions = {
89
77
  folderId: folder.id,
90
78
  // On new folders, permissions can be `null`. Guard against that.
91
- permissions: ((_folder$permissions = folder.permissions) === null || _folder$permissions === void 0 ? void 0 : _folder$permissions.map(permission => (0, _objectSpread2.default)({}, permission))) || []
79
+ permissions: folder.permissions?.map(permission => ({
80
+ ...permission
81
+ })) || []
92
82
  };
93
83
 
94
84
  // Check for permissions inherited from parent folder.
@@ -114,9 +104,10 @@ class FolderLevelPermissions {
114
104
  const mustInherit = !isPublicParentFolder || currentFolderPermissions.permissions.length === 0;
115
105
  if (mustInherit) {
116
106
  const inheritedPermissions = processedParentFolderPermissions.permissions.map(p => {
117
- return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, p), {}, {
107
+ return {
108
+ ...p,
118
109
  inheritedFrom: "parent:" + processedParentFolderPermissions.folderId
119
- });
110
+ };
120
111
  });
121
112
  currentFolderPermissions.permissions.push(...inheritedPermissions);
122
113
  }
@@ -211,9 +202,10 @@ class FolderLevelPermissions {
211
202
  }
212
203
  const parentFolder = foldersList.find(f => f.id === folder.parentId);
213
204
  if (parentFolder) {
214
- const canAccessParentFolder = await this.canAccessFolder((0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
205
+ const canAccessParentFolder = await this.canAccessFolder({
206
+ ...params,
215
207
  folder: parentFolder
216
- }));
208
+ });
217
209
  if (!canAccessParentFolder) {
218
210
  return false;
219
211
  }
@@ -224,7 +216,7 @@ class FolderLevelPermissions {
224
216
  foldersList: params.foldersList
225
217
  });
226
218
  const identity = this.getIdentity();
227
- const currentIdentityPermission = folderPermissions === null || folderPermissions === void 0 ? void 0 : folderPermissions.permissions.find(p => {
219
+ const currentIdentityPermission = folderPermissions?.permissions.find(p => {
228
220
  return p.target === `admin:${identity.id}`;
229
221
  });
230
222
  if (!currentIdentityPermission) {
@@ -294,7 +286,7 @@ class FolderLevelPermissions {
294
286
  foldersList
295
287
  });
296
288
  const identity = this.getIdentity();
297
- const currentIdentityPermission = folderPermissions === null || folderPermissions === void 0 ? void 0 : folderPermissions.permissions.find(p => {
289
+ const currentIdentityPermission = folderPermissions?.permissions.find(p => {
298
290
  return p.target === `admin:${identity.id}`;
299
291
  });
300
292
  if (!currentIdentityPermission) {
@@ -353,7 +345,7 @@ class FolderLevelPermissions {
353
345
  }
354
346
  }
355
347
  permissionsIncludeNonInheritedPermissions(folderPermissionsList) {
356
- return folderPermissionsList === null || folderPermissionsList === void 0 ? void 0 : folderPermissionsList.some(p => !p.inheritedFrom);
348
+ return folderPermissionsList?.some(p => !p.inheritedFrom);
357
349
  }
358
350
  }
359
351
  exports.FolderLevelPermissions = FolderLevelPermissions;
@@ -1 +1 @@
1
- {"version":3,"names":["_apiSecurity","require","_structuredClone","_interopRequireDefault","FolderLevelPermissions","constructor","params","_defineProperty2","default","getIdentity","getIdentityTeam","listPermissions","listAllFoldersCallback","listAllFolders","canUseTeams","canUseFolderLevelPermissions","isAuthorizationEnabled","folderType","allFolders","structuredClone","listAllFoldersWithPermissions","folders","filteredFoldersWithPermissions","filterFolders","rwd","assignFolderPermissions","invalidateCache","listFoldersPermissions","foldersList","identity","permissions","identityTeam","processedFolderPermissions","processFolderPermissions","folder","_folder$permissions","some","fp","folderId","id","currentFolderPermissions","map","permission","_objectSpread2","parentId","parentFolder","find","f","processedParentFolderPermissions","isPublicParentFolder","p","level","mustInherit","length","inheritedPermissions","inheritedFrom","push","currentIdentityIncludedInPermissions","target","currentIdentityPermissionIndex","findIndex","currentIdentityPermission","splice","unshift","hasFullAccess","name","teamPermission","mustAddPublicPermission","i","getFolderPermissions","folderPermissionsList","type","canAccessFolder","canAccessParentFolder","folderPermissions","managePermissions","ensureCanAccessFolder","NotAuthorizedError","canManageFolderPermissions","canManageFolderStructure","canManageFolderContent","canAccessFolderContent","ensureCanAccessFolderContent","canCreateFolderInRoot","filteredFolders","Array","isArray","permissionsIncludeNonInheritedPermissions","exports"],"sources":["FolderLevelPermissions.ts"],"sourcesContent":["import { Authentication } from \"@webiny/api-authentication/types\";\nimport { SecurityPermission, Team } from \"@webiny/api-security/types\";\nimport { Folder } from \"~/folder/folder.types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\nimport structuredClone from \"@ungap/structured-clone\";\n\nexport type FolderAccessLevel = \"owner\" | \"viewer\" | \"editor\" | \"public\";\n\nexport interface FolderPermission {\n target: string;\n level: FolderAccessLevel;\n inheritedFrom?: string;\n}\n\nexport interface FolderPermissionsListItem {\n folderId: string;\n permissions: FolderPermission[];\n}\n\nexport type FolderPermissionsList = FolderPermissionsListItem[];\n\nexport interface CanAccessFolderContentParams {\n folder: Pick<Folder, \"id\" | \"type\" | \"parentId\">;\n rwd?: \"r\" | \"w\" | \"d\";\n foldersList?: Folder[];\n}\n\nexport interface CanAccessFolderParams extends CanAccessFolderContentParams {\n managePermissions?: boolean;\n}\n\ninterface FilterFoldersParams {\n folders: Array<Folder>;\n rwd?: \"r\" | \"w\" | \"d\";\n}\n\ninterface GetFolderPermissionsParams {\n folder: Pick<Folder, \"id\" | \"type\">;\n foldersList?: Folder[];\n}\n\ninterface ListFolderPermissionsParams {\n folderType: string;\n foldersList?: Folder[];\n}\n\nexport interface FolderLevelPermissionsParams {\n getIdentity: Authentication[\"getIdentity\"];\n getIdentityTeam: () => Promise<Team | null>;\n listPermissions: () => Promise<SecurityPermission[]>;\n listAllFolders: (folderType: string) => Promise<Folder[]>;\n canUseTeams: () => boolean;\n canUseFolderLevelPermissions: () => boolean;\n isAuthorizationEnabled: () => boolean;\n}\n\nexport class FolderLevelPermissions {\n private readonly getIdentity: Authentication[\"getIdentity\"];\n private readonly getIdentityTeam: () => Promise<Team | null>;\n private readonly listPermissions: () => Promise<SecurityPermission[]>;\n private readonly listAllFoldersCallback: (folderType: string) => Promise<Folder[]>;\n private readonly canUseTeams: () => boolean;\n private readonly canUseFolderLevelPermissions: () => boolean;\n private readonly isAuthorizationEnabled: () => boolean;\n private allFolders: Record<string, Folder[]> = {};\n\n constructor(params: FolderLevelPermissionsParams) {\n this.getIdentity = params.getIdentity;\n this.getIdentityTeam = params.getIdentityTeam;\n this.listPermissions = params.listPermissions;\n this.listAllFoldersCallback = params.listAllFolders;\n this.canUseTeams = params.canUseTeams;\n this.canUseFolderLevelPermissions = params.canUseFolderLevelPermissions;\n\n this.isAuthorizationEnabled = params.isAuthorizationEnabled;\n\n // TODO: resolve this issue.\n // We immediately enable authorization, because, at the moment, the rest of the system\n // requires us to have FLP always enabled. We must now disable it, even if the security's\n // `isAuthorizationEnabled` is set to false. To resolve this, we'll need to refactor CMS-based\n // CRUD files and have them use CMS storage operations instead of CMS CRUD methods.\n // We'll be handling this in the near future.\n this.isAuthorizationEnabled = () => true;\n }\n\n async listAllFolders(folderType: string): Promise<Folder[]> {\n if (folderType in this.allFolders) {\n return structuredClone(this.allFolders[folderType]);\n }\n\n this.allFolders[folderType] = await this.listAllFoldersCallback(folderType);\n return structuredClone(this.allFolders[folderType]);\n }\n\n async listAllFoldersWithPermissions(folderType: string) {\n const folders = await this.listAllFolders(folderType);\n\n // Filter folders based on permissions and assign permissions to each folder.\n const filteredFoldersWithPermissions = await this.filterFolders({\n folders,\n rwd: \"r\"\n });\n\n await this.assignFolderPermissions(filteredFoldersWithPermissions);\n\n return filteredFoldersWithPermissions;\n }\n\n invalidateCache(folderType?: string) {\n if (folderType) {\n if (folderType in this.allFolders) {\n delete this.allFolders[folderType];\n }\n } else {\n this.allFolders = {};\n }\n }\n\n async listFoldersPermissions(\n params: ListFolderPermissionsParams\n ): Promise<FolderPermissionsList> {\n if (!this.canUseFolderLevelPermissions() || !this.isAuthorizationEnabled()) {\n return [];\n }\n\n const { folderType, foldersList } = params;\n\n const allFolders = foldersList || (await this.listAllFolders(folderType));\n const identity = this.getIdentity();\n const permissions = await this.listPermissions();\n\n let identityTeam: Team | null;\n if (this.canUseTeams()) {\n identityTeam = await this.getIdentityTeam();\n }\n\n const processedFolderPermissions: FolderPermissionsListItem[] = [];\n\n const processFolderPermissions = (folder: Folder) => {\n if (processedFolderPermissions.some(fp => fp.folderId === folder.id)) {\n return;\n }\n\n // Copy permissions, so we don't modify the original object.\n const currentFolderPermissions: FolderPermissionsListItem = {\n folderId: folder.id,\n // On new folders, permissions can be `null`. Guard against that.\n permissions: folder.permissions?.map(permission => ({ ...permission })) || []\n };\n\n // Check for permissions inherited from parent folder.\n if (folder.parentId) {\n const parentFolder = allFolders!.find(f => f.id === folder.parentId)!;\n if (parentFolder) {\n // First check if the parent folder has already been processed.\n let processedParentFolderPermissions = processedFolderPermissions.find(\n fp => fp.folderId === parentFolder.id\n );\n\n // If not, process the parent folder.\n if (!processedParentFolderPermissions) {\n processFolderPermissions(parentFolder);\n processedParentFolderPermissions = processedFolderPermissions.find(\n fp => fp.folderId === folder.parentId\n );\n }\n\n // If the parent folder has permissions, let's add them to the current folder.\n if (processedParentFolderPermissions) {\n const isPublicParentFolder =\n processedParentFolderPermissions.permissions.some(\n p => p.level === \"public\"\n );\n\n // We inherit parent permissions if:\n // 1. the parent folder is not public or...\n // 2. ...the parent folder is public, but the current folder doesn't have any permissions set\n const mustInherit =\n !isPublicParentFolder ||\n currentFolderPermissions.permissions.length === 0;\n\n if (mustInherit) {\n const inheritedPermissions =\n processedParentFolderPermissions.permissions.map(p => {\n return {\n ...p,\n inheritedFrom:\n \"parent:\" + processedParentFolderPermissions!.folderId\n };\n });\n\n currentFolderPermissions.permissions.push(...inheritedPermissions);\n }\n }\n }\n }\n\n // Let's ensure current identity's permission is included in the permissions array.\n // We first check if the current identity is already included in the permissions array.\n // If not, we check if the user has full access or if the team user belongs to has access.\n const currentIdentityIncludedInPermissions = currentFolderPermissions.permissions.some(\n p => p.target === `admin:${identity.id}`\n );\n\n if (currentIdentityIncludedInPermissions) {\n // Ensure existing identity permission is always the first one in the array.\n const currentIdentityPermissionIndex =\n currentFolderPermissions.permissions.findIndex(\n p => p.target === `admin:${identity.id}`\n );\n\n if (currentIdentityPermissionIndex > 0) {\n const [currentIdentityPermission] = currentFolderPermissions.permissions.splice(\n currentIdentityPermissionIndex,\n 1\n );\n currentFolderPermissions.permissions.unshift(currentIdentityPermission);\n }\n } else {\n // Current identity not included in permissions? Let's add it.\n let currentIdentityPermission: FolderPermission | null = null;\n\n // 1. Check if the user has full access.\n const hasFullAccess = permissions.some(p => p.name === \"*\");\n if (hasFullAccess) {\n currentIdentityPermission = {\n target: `admin:${identity.id}`,\n level: \"owner\",\n inheritedFrom: \"role:full-access\"\n };\n } else if (identityTeam) {\n // 2. Check the team user belongs to grants access to the folder.\n const teamPermission = currentFolderPermissions.permissions.find(\n p => p.target === `team:${identityTeam!.id}`\n );\n\n if (teamPermission) {\n currentIdentityPermission = {\n target: `admin:${identity.id}`,\n level: teamPermission.level,\n inheritedFrom: \"team:\" + identityTeam!.id\n };\n }\n }\n\n if (currentIdentityPermission) {\n // If permission is found, let's add it to the beginning of the array.\n // We're doing this just because it looks nicer in the UI.\n currentFolderPermissions.permissions.unshift(currentIdentityPermission);\n }\n }\n\n // Note that this can only happen with root folders. All other (child) folders will\n // always have at least one permission (inherited from parent).\n const mustAddPublicPermission = currentFolderPermissions.permissions.length === 0;\n if (mustAddPublicPermission) {\n currentFolderPermissions.permissions = [\n {\n target: `admin:${identity.id}`,\n level: \"public\",\n inheritedFrom: \"public\"\n }\n ];\n }\n\n processedFolderPermissions.push(currentFolderPermissions);\n };\n\n for (let i = 0; i < allFolders!.length; i++) {\n const folder = allFolders![i];\n processFolderPermissions(folder);\n }\n\n return processedFolderPermissions;\n }\n\n async getFolderPermissions(\n params: GetFolderPermissionsParams\n ): Promise<FolderPermissionsListItem | undefined> {\n const { folder, foldersList } = params;\n const folderPermissionsList = await this.listFoldersPermissions({\n folderType: folder.type,\n foldersList\n });\n\n return folderPermissionsList.find(fp => fp.folderId === folder.id);\n }\n\n async canAccessFolder(params: CanAccessFolderParams) {\n if (!this.canUseFolderLevelPermissions() || !this.isAuthorizationEnabled()) {\n return true;\n }\n\n const { folder } = params;\n\n // We check for parent folder access first because the passed folder should be\n // inaccessible if the parent folder is inaccessible.\n if (folder.parentId) {\n let foldersList = params.foldersList;\n if (!foldersList) {\n foldersList = await this.listAllFolders(folder.type);\n }\n\n const parentFolder = foldersList.find(f => f.id === folder.parentId);\n if (parentFolder) {\n const canAccessParentFolder = await this.canAccessFolder({\n ...params,\n folder: parentFolder\n });\n\n if (!canAccessParentFolder) {\n return false;\n }\n }\n }\n\n const folderPermissions = await this.getFolderPermissions({\n folder,\n foldersList: params.foldersList\n });\n\n const identity = this.getIdentity();\n const currentIdentityPermission = folderPermissions?.permissions.find(p => {\n return p.target === `admin:${identity.id}`;\n });\n\n if (!currentIdentityPermission) {\n return false;\n }\n\n const { level } = currentIdentityPermission;\n\n if (params.managePermissions) {\n return level === \"owner\";\n }\n\n // Checking for \"write\" or \"delete\" access. Allow only if the\n // user is an owner or the folder is public (no FLP assigned).\n if (params.rwd !== \"r\") {\n return level === \"owner\" || level === \"public\";\n }\n\n return true;\n }\n\n async ensureCanAccessFolder(params: CanAccessFolderParams) {\n const canAccessFolder = await this.canAccessFolder(params);\n if (!canAccessFolder) {\n throw new NotAuthorizedError();\n }\n }\n\n canManageFolderPermissions(folder: Folder) {\n if (!this.canUseFolderLevelPermissions()) {\n return false;\n }\n\n if (!this.isAuthorizationEnabled()) {\n return true;\n }\n\n return this.canAccessFolder({ folder, rwd: \"w\", managePermissions: true });\n }\n\n canManageFolderStructure(folder: Folder) {\n if (!this.canUseFolderLevelPermissions() || !this.isAuthorizationEnabled()) {\n return true;\n }\n\n return this.canAccessFolder({ folder, rwd: \"w\" });\n }\n\n canManageFolderContent(folder: Folder) {\n if (!this.canUseFolderLevelPermissions() || !this.isAuthorizationEnabled()) {\n return true;\n }\n\n return this.canAccessFolderContent({ folder, rwd: \"w\" });\n }\n\n async canAccessFolderContent(params: CanAccessFolderContentParams) {\n if (!this.canUseFolderLevelPermissions() || !this.isAuthorizationEnabled()) {\n return true;\n }\n\n const { folder, foldersList } = params;\n\n const folderPermissions = await this.getFolderPermissions({\n folder,\n foldersList\n });\n\n const identity = this.getIdentity();\n const currentIdentityPermission = folderPermissions?.permissions.find(p => {\n return p.target === `admin:${identity.id}`;\n });\n\n if (!currentIdentityPermission) {\n return false;\n }\n\n // If the user is not an owner and we're checking for \"write\" or\n // \"delete\" access, then we can immediately return false.\n if (params.rwd !== \"r\") {\n const { level } = currentIdentityPermission;\n return level !== \"viewer\";\n }\n\n return true;\n }\n\n async ensureCanAccessFolderContent(params: CanAccessFolderContentParams) {\n const canAccessFolderContent = await this.canAccessFolderContent(params);\n if (!canAccessFolderContent) {\n throw new NotAuthorizedError();\n }\n }\n\n async canCreateFolderInRoot() {\n return true;\n }\n\n async filterFolders(params: FilterFoldersParams) {\n const filteredFolders: Folder[] = [];\n\n const { folders, rwd } = params;\n for (let i = 0; i < folders.length; i++) {\n const folder = folders[i];\n const canAccessFolder = await this.canAccessFolder({ folder, rwd });\n if (canAccessFolder) {\n filteredFolders.push(folder);\n }\n }\n\n return filteredFolders;\n }\n\n async assignFolderPermissions(folder: Folder | Folder[]) {\n const folders = Array.isArray(folder) ? folder : [folder];\n\n for (let i = 0; i < folders.length; i++) {\n const folder = folders[i];\n const folderPermissions = await this.getFolderPermissions({ folder });\n if (folderPermissions) {\n folder.permissions = folderPermissions.permissions;\n } else {\n folder.permissions = [];\n }\n }\n }\n\n permissionsIncludeNonInheritedPermissions(folderPermissionsList?: FolderPermission[]) {\n return folderPermissionsList?.some(p => !p.inheritedFrom);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_apiSecurity","require","FolderLevelPermissions","allFolders","constructor","params","getIdentity","getIdentityTeam","listPermissions","listAllFoldersCallback","listAllFolders","canUseTeams","canUseFolderLevelPermissions","isAuthorizationEnabled","folderType","structuredClone","listAllFoldersWithPermissions","folders","filteredFoldersWithPermissions","filterFolders","rwd","assignFolderPermissions","invalidateCache","listFoldersPermissions","foldersList","identity","permissions","identityTeam","processedFolderPermissions","processFolderPermissions","folder","some","fp","folderId","id","currentFolderPermissions","map","permission","parentId","parentFolder","find","f","processedParentFolderPermissions","isPublicParentFolder","p","level","mustInherit","length","inheritedPermissions","inheritedFrom","push","currentIdentityIncludedInPermissions","target","currentIdentityPermissionIndex","findIndex","currentIdentityPermission","splice","unshift","hasFullAccess","name","teamPermission","mustAddPublicPermission","i","getFolderPermissions","folderPermissionsList","type","canAccessFolder","canAccessParentFolder","folderPermissions","managePermissions","ensureCanAccessFolder","NotAuthorizedError","canManageFolderPermissions","canManageFolderStructure","canManageFolderContent","canAccessFolderContent","ensureCanAccessFolderContent","canCreateFolderInRoot","filteredFolders","Array","isArray","permissionsIncludeNonInheritedPermissions","exports"],"sources":["FolderLevelPermissions.ts"],"sourcesContent":["import { Authentication } from \"@webiny/api-authentication/types\";\nimport { SecurityPermission, Team } from \"@webiny/api-security/types\";\nimport { Folder } from \"~/folder/folder.types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\n\nexport type FolderAccessLevel = \"owner\" | \"viewer\" | \"editor\" | \"public\";\n\nexport interface FolderPermission {\n target: string;\n level: FolderAccessLevel;\n inheritedFrom?: string;\n}\n\nexport interface FolderPermissionsListItem {\n folderId: string;\n permissions: FolderPermission[];\n}\n\nexport type FolderPermissionsList = FolderPermissionsListItem[];\n\nexport interface CanAccessFolderContentParams {\n folder: Pick<Folder, \"id\" | \"type\" | \"parentId\">;\n rwd?: \"r\" | \"w\" | \"d\";\n foldersList?: Folder[];\n}\n\nexport interface CanAccessFolderParams extends CanAccessFolderContentParams {\n managePermissions?: boolean;\n}\n\ninterface FilterFoldersParams {\n folders: Array<Folder>;\n rwd?: \"r\" | \"w\" | \"d\";\n}\n\ninterface GetFolderPermissionsParams {\n folder: Pick<Folder, \"id\" | \"type\">;\n foldersList?: Folder[];\n}\n\ninterface ListFolderPermissionsParams {\n folderType: string;\n foldersList?: Folder[];\n}\n\nexport interface FolderLevelPermissionsParams {\n getIdentity: Authentication[\"getIdentity\"];\n getIdentityTeam: () => Promise<Team | null>;\n listPermissions: () => Promise<SecurityPermission[]>;\n listAllFolders: (folderType: string) => Promise<Folder[]>;\n canUseTeams: () => boolean;\n canUseFolderLevelPermissions: () => boolean;\n isAuthorizationEnabled: () => boolean;\n}\n\nexport class FolderLevelPermissions {\n private readonly getIdentity: Authentication[\"getIdentity\"];\n private readonly getIdentityTeam: () => Promise<Team | null>;\n private readonly listPermissions: () => Promise<SecurityPermission[]>;\n private readonly listAllFoldersCallback: (folderType: string) => Promise<Folder[]>;\n private readonly canUseTeams: () => boolean;\n private readonly canUseFolderLevelPermissions: () => boolean;\n private readonly isAuthorizationEnabled: () => boolean;\n private allFolders: Record<string, Folder[]> = {};\n\n constructor(params: FolderLevelPermissionsParams) {\n this.getIdentity = params.getIdentity;\n this.getIdentityTeam = params.getIdentityTeam;\n this.listPermissions = params.listPermissions;\n this.listAllFoldersCallback = params.listAllFolders;\n this.canUseTeams = params.canUseTeams;\n this.canUseFolderLevelPermissions = params.canUseFolderLevelPermissions;\n\n this.isAuthorizationEnabled = params.isAuthorizationEnabled;\n\n // TODO: resolve this issue.\n // We immediately enable authorization, because, at the moment, the rest of the system\n // requires us to have FLP always enabled. We must now disable it, even if the security's\n // `isAuthorizationEnabled` is set to false. To resolve this, we'll need to refactor CMS-based\n // CRUD files and have them use CMS storage operations instead of CMS CRUD methods.\n // We'll be handling this in the near future.\n this.isAuthorizationEnabled = () => true;\n }\n\n async listAllFolders(folderType: string): Promise<Folder[]> {\n if (folderType in this.allFolders) {\n return structuredClone(this.allFolders[folderType]);\n }\n\n this.allFolders[folderType] = await this.listAllFoldersCallback(folderType);\n return structuredClone(this.allFolders[folderType]);\n }\n\n async listAllFoldersWithPermissions(folderType: string) {\n const folders = await this.listAllFolders(folderType);\n\n // Filter folders based on permissions and assign permissions to each folder.\n const filteredFoldersWithPermissions = await this.filterFolders({\n folders,\n rwd: \"r\"\n });\n\n await this.assignFolderPermissions(filteredFoldersWithPermissions);\n\n return filteredFoldersWithPermissions;\n }\n\n invalidateCache(folderType?: string) {\n if (folderType) {\n if (folderType in this.allFolders) {\n delete this.allFolders[folderType];\n }\n } else {\n this.allFolders = {};\n }\n }\n\n async listFoldersPermissions(\n params: ListFolderPermissionsParams\n ): Promise<FolderPermissionsList> {\n if (!this.canUseFolderLevelPermissions() || !this.isAuthorizationEnabled()) {\n return [];\n }\n\n const { folderType, foldersList } = params;\n\n const allFolders = foldersList || (await this.listAllFolders(folderType));\n const identity = this.getIdentity();\n const permissions = await this.listPermissions();\n\n let identityTeam: Team | null;\n if (this.canUseTeams()) {\n identityTeam = await this.getIdentityTeam();\n }\n\n const processedFolderPermissions: FolderPermissionsListItem[] = [];\n\n const processFolderPermissions = (folder: Folder) => {\n if (processedFolderPermissions.some(fp => fp.folderId === folder.id)) {\n return;\n }\n\n // Copy permissions, so we don't modify the original object.\n const currentFolderPermissions: FolderPermissionsListItem = {\n folderId: folder.id,\n // On new folders, permissions can be `null`. Guard against that.\n permissions: folder.permissions?.map(permission => ({ ...permission })) || []\n };\n\n // Check for permissions inherited from parent folder.\n if (folder.parentId) {\n const parentFolder = allFolders!.find(f => f.id === folder.parentId)!;\n if (parentFolder) {\n // First check if the parent folder has already been processed.\n let processedParentFolderPermissions = processedFolderPermissions.find(\n fp => fp.folderId === parentFolder.id\n );\n\n // If not, process the parent folder.\n if (!processedParentFolderPermissions) {\n processFolderPermissions(parentFolder);\n processedParentFolderPermissions = processedFolderPermissions.find(\n fp => fp.folderId === folder.parentId\n );\n }\n\n // If the parent folder has permissions, let's add them to the current folder.\n if (processedParentFolderPermissions) {\n const isPublicParentFolder =\n processedParentFolderPermissions.permissions.some(\n p => p.level === \"public\"\n );\n\n // We inherit parent permissions if:\n // 1. the parent folder is not public or...\n // 2. ...the parent folder is public, but the current folder doesn't have any permissions set\n const mustInherit =\n !isPublicParentFolder ||\n currentFolderPermissions.permissions.length === 0;\n\n if (mustInherit) {\n const inheritedPermissions =\n processedParentFolderPermissions.permissions.map(p => {\n return {\n ...p,\n inheritedFrom:\n \"parent:\" + processedParentFolderPermissions!.folderId\n };\n });\n\n currentFolderPermissions.permissions.push(...inheritedPermissions);\n }\n }\n }\n }\n\n // Let's ensure current identity's permission is included in the permissions array.\n // We first check if the current identity is already included in the permissions array.\n // If not, we check if the user has full access or if the team user belongs to has access.\n const currentIdentityIncludedInPermissions = currentFolderPermissions.permissions.some(\n p => p.target === `admin:${identity.id}`\n );\n\n if (currentIdentityIncludedInPermissions) {\n // Ensure existing identity permission is always the first one in the array.\n const currentIdentityPermissionIndex =\n currentFolderPermissions.permissions.findIndex(\n p => p.target === `admin:${identity.id}`\n );\n\n if (currentIdentityPermissionIndex > 0) {\n const [currentIdentityPermission] = currentFolderPermissions.permissions.splice(\n currentIdentityPermissionIndex,\n 1\n );\n currentFolderPermissions.permissions.unshift(currentIdentityPermission);\n }\n } else {\n // Current identity not included in permissions? Let's add it.\n let currentIdentityPermission: FolderPermission | null = null;\n\n // 1. Check if the user has full access.\n const hasFullAccess = permissions.some(p => p.name === \"*\");\n if (hasFullAccess) {\n currentIdentityPermission = {\n target: `admin:${identity.id}`,\n level: \"owner\",\n inheritedFrom: \"role:full-access\"\n };\n } else if (identityTeam) {\n // 2. Check the team user belongs to grants access to the folder.\n const teamPermission = currentFolderPermissions.permissions.find(\n p => p.target === `team:${identityTeam!.id}`\n );\n\n if (teamPermission) {\n currentIdentityPermission = {\n target: `admin:${identity.id}`,\n level: teamPermission.level,\n inheritedFrom: \"team:\" + identityTeam!.id\n };\n }\n }\n\n if (currentIdentityPermission) {\n // If permission is found, let's add it to the beginning of the array.\n // We're doing this just because it looks nicer in the UI.\n currentFolderPermissions.permissions.unshift(currentIdentityPermission);\n }\n }\n\n // Note that this can only happen with root folders. All other (child) folders will\n // always have at least one permission (inherited from parent).\n const mustAddPublicPermission = currentFolderPermissions.permissions.length === 0;\n if (mustAddPublicPermission) {\n currentFolderPermissions.permissions = [\n {\n target: `admin:${identity.id}`,\n level: \"public\",\n inheritedFrom: \"public\"\n }\n ];\n }\n\n processedFolderPermissions.push(currentFolderPermissions);\n };\n\n for (let i = 0; i < allFolders!.length; i++) {\n const folder = allFolders![i];\n processFolderPermissions(folder);\n }\n\n return processedFolderPermissions;\n }\n\n async getFolderPermissions(\n params: GetFolderPermissionsParams\n ): Promise<FolderPermissionsListItem | undefined> {\n const { folder, foldersList } = params;\n const folderPermissionsList = await this.listFoldersPermissions({\n folderType: folder.type,\n foldersList\n });\n\n return folderPermissionsList.find(fp => fp.folderId === folder.id);\n }\n\n async canAccessFolder(params: CanAccessFolderParams) {\n if (!this.canUseFolderLevelPermissions() || !this.isAuthorizationEnabled()) {\n return true;\n }\n\n const { folder } = params;\n\n // We check for parent folder access first because the passed folder should be\n // inaccessible if the parent folder is inaccessible.\n if (folder.parentId) {\n let foldersList = params.foldersList;\n if (!foldersList) {\n foldersList = await this.listAllFolders(folder.type);\n }\n\n const parentFolder = foldersList.find(f => f.id === folder.parentId);\n if (parentFolder) {\n const canAccessParentFolder = await this.canAccessFolder({\n ...params,\n folder: parentFolder\n });\n\n if (!canAccessParentFolder) {\n return false;\n }\n }\n }\n\n const folderPermissions = await this.getFolderPermissions({\n folder,\n foldersList: params.foldersList\n });\n\n const identity = this.getIdentity();\n const currentIdentityPermission = folderPermissions?.permissions.find(p => {\n return p.target === `admin:${identity.id}`;\n });\n\n if (!currentIdentityPermission) {\n return false;\n }\n\n const { level } = currentIdentityPermission;\n\n if (params.managePermissions) {\n return level === \"owner\";\n }\n\n // Checking for \"write\" or \"delete\" access. Allow only if the\n // user is an owner or the folder is public (no FLP assigned).\n if (params.rwd !== \"r\") {\n return level === \"owner\" || level === \"public\";\n }\n\n return true;\n }\n\n async ensureCanAccessFolder(params: CanAccessFolderParams) {\n const canAccessFolder = await this.canAccessFolder(params);\n if (!canAccessFolder) {\n throw new NotAuthorizedError();\n }\n }\n\n canManageFolderPermissions(folder: Folder) {\n if (!this.canUseFolderLevelPermissions()) {\n return false;\n }\n\n if (!this.isAuthorizationEnabled()) {\n return true;\n }\n\n return this.canAccessFolder({ folder, rwd: \"w\", managePermissions: true });\n }\n\n canManageFolderStructure(folder: Folder) {\n if (!this.canUseFolderLevelPermissions() || !this.isAuthorizationEnabled()) {\n return true;\n }\n\n return this.canAccessFolder({ folder, rwd: \"w\" });\n }\n\n canManageFolderContent(folder: Folder) {\n if (!this.canUseFolderLevelPermissions() || !this.isAuthorizationEnabled()) {\n return true;\n }\n\n return this.canAccessFolderContent({ folder, rwd: \"w\" });\n }\n\n async canAccessFolderContent(params: CanAccessFolderContentParams) {\n if (!this.canUseFolderLevelPermissions() || !this.isAuthorizationEnabled()) {\n return true;\n }\n\n const { folder, foldersList } = params;\n\n const folderPermissions = await this.getFolderPermissions({\n folder,\n foldersList\n });\n\n const identity = this.getIdentity();\n const currentIdentityPermission = folderPermissions?.permissions.find(p => {\n return p.target === `admin:${identity.id}`;\n });\n\n if (!currentIdentityPermission) {\n return false;\n }\n\n // If the user is not an owner and we're checking for \"write\" or\n // \"delete\" access, then we can immediately return false.\n if (params.rwd !== \"r\") {\n const { level } = currentIdentityPermission;\n return level !== \"viewer\";\n }\n\n return true;\n }\n\n async ensureCanAccessFolderContent(params: CanAccessFolderContentParams) {\n const canAccessFolderContent = await this.canAccessFolderContent(params);\n if (!canAccessFolderContent) {\n throw new NotAuthorizedError();\n }\n }\n\n async canCreateFolderInRoot() {\n return true;\n }\n\n async filterFolders(params: FilterFoldersParams) {\n const filteredFolders: Folder[] = [];\n\n const { folders, rwd } = params;\n for (let i = 0; i < folders.length; i++) {\n const folder = folders[i];\n const canAccessFolder = await this.canAccessFolder({ folder, rwd });\n if (canAccessFolder) {\n filteredFolders.push(folder);\n }\n }\n\n return filteredFolders;\n }\n\n async assignFolderPermissions(folder: Folder | Folder[]) {\n const folders = Array.isArray(folder) ? folder : [folder];\n\n for (let i = 0; i < folders.length; i++) {\n const folder = folders[i];\n const folderPermissions = await this.getFolderPermissions({ folder });\n if (folderPermissions) {\n folder.permissions = folderPermissions.permissions;\n } else {\n folder.permissions = [];\n }\n }\n }\n\n permissionsIncludeNonInheritedPermissions(folderPermissionsList?: FolderPermission[]) {\n return folderPermissionsList?.some(p => !p.inheritedFrom);\n }\n}\n"],"mappings":"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"}