@webiny/api-aco 0.0.0-unstable.9e825fd5fb → 0.0.0-unstable.a9593f74dd

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 (183) hide show
  1. package/README.md +6 -6
  2. package/apps/AcoApp.d.ts +21 -0
  3. package/apps/AcoApp.js +143 -0
  4. package/apps/AcoApp.js.map +1 -0
  5. package/apps/AcoApps.d.ts +10 -0
  6. package/apps/AcoApps.js +75 -0
  7. package/apps/AcoApps.js.map +1 -0
  8. package/apps/app.gql.d.ts +3 -0
  9. package/apps/app.gql.js +60 -0
  10. package/apps/app.gql.js.map +1 -0
  11. package/apps/index.d.ts +2 -0
  12. package/apps/index.js +29 -0
  13. package/apps/index.js.map +1 -0
  14. package/createAcoContext.d.ts +5 -1
  15. package/createAcoContext.js +159 -28
  16. package/createAcoContext.js.map +1 -1
  17. package/createAcoGraphQL.d.ts +2 -2
  18. package/createAcoGraphQL.js +39 -6
  19. package/createAcoGraphQL.js.map +1 -1
  20. package/createAcoHooks.js +9 -3
  21. package/createAcoHooks.js.map +1 -1
  22. package/createAcoModels.js +6 -42
  23. package/createAcoModels.js.map +1 -1
  24. package/createAcoStorageOperations.d.ts +0 -1
  25. package/createAcoStorageOperations.js +10 -7
  26. package/createAcoStorageOperations.js.map +1 -1
  27. package/{createAcoFields.d.ts → fields/index.d.ts} +1 -1
  28. package/fields/index.js +14 -0
  29. package/fields/index.js.map +1 -0
  30. package/fields/location.d.ts +2 -0
  31. package/fields/location.js +46 -0
  32. package/fields/location.js.map +1 -0
  33. package/filter/filter.crud.d.ts +3 -0
  34. package/filter/filter.crud.js +94 -0
  35. package/filter/filter.crud.js.map +1 -0
  36. package/filter/filter.gql.d.ts +3 -0
  37. package/filter/filter.gql.js +153 -0
  38. package/filter/filter.gql.js.map +1 -0
  39. package/filter/filter.model.d.ts +2 -0
  40. package/filter/filter.model.js +125 -0
  41. package/filter/filter.model.js.map +1 -0
  42. package/filter/filter.so.d.ts +3 -0
  43. package/filter/filter.so.js +98 -0
  44. package/filter/filter.so.js.map +1 -0
  45. package/filter/filter.types.d.ts +95 -0
  46. package/filter/filter.types.js +14 -0
  47. package/filter/filter.types.js.map +1 -0
  48. package/folder/folder.crud.d.ts +8 -1
  49. package/folder/folder.crud.js +201 -4
  50. package/folder/folder.crud.js.map +1 -1
  51. package/folder/folder.gql.js +98 -6
  52. package/folder/folder.gql.js.map +1 -1
  53. package/folder/folder.model.d.ts +1 -3
  54. package/folder/folder.model.js +54 -25
  55. package/folder/folder.model.js.map +1 -1
  56. package/folder/folder.so.js +38 -18
  57. package/folder/folder.so.js.map +1 -1
  58. package/folder/folder.types.d.ts +35 -3
  59. package/folder/folder.types.js +3 -1
  60. package/folder/folder.types.js.map +1 -1
  61. package/folder/onFolderBeforeDeleteAco.hook.d.ts +2 -0
  62. package/folder/onFolderBeforeDeleteAco.hook.js +67 -0
  63. package/folder/onFolderBeforeDeleteAco.hook.js.map +1 -0
  64. package/folder/onFolderBeforeDeleteFm.hook.d.ts +2 -0
  65. package/folder/onFolderBeforeDeleteFm.hook.js +49 -0
  66. package/folder/onFolderBeforeDeleteFm.hook.js.map +1 -0
  67. package/folder/onFolderBeforeDeleteHcms.hook.d.ts +2 -0
  68. package/folder/onFolderBeforeDeleteHcms.hook.js +56 -0
  69. package/folder/onFolderBeforeDeleteHcms.hook.js.map +1 -0
  70. package/index.d.ts +9 -1
  71. package/index.js +57 -5
  72. package/index.js.map +1 -1
  73. package/package.json +38 -32
  74. package/plugins/AcoAppModifierPlugin.d.ts +43 -0
  75. package/plugins/AcoAppModifierPlugin.js +58 -0
  76. package/plugins/AcoAppModifierPlugin.js.map +1 -0
  77. package/plugins/AcoAppRegisterPlugin.d.ts +8 -0
  78. package/plugins/AcoAppRegisterPlugin.js +21 -0
  79. package/plugins/AcoAppRegisterPlugin.js.map +1 -0
  80. package/plugins/index.d.ts +2 -0
  81. package/plugins/index.js +29 -0
  82. package/plugins/index.js.map +1 -0
  83. package/record/graphql/createAppResolvers.d.ts +14 -0
  84. package/record/graphql/createAppResolvers.js +115 -0
  85. package/record/graphql/createAppResolvers.js.map +1 -0
  86. package/record/graphql/createAppSchema.d.ts +9 -0
  87. package/record/graphql/createAppSchema.js +147 -0
  88. package/record/graphql/createAppSchema.js.map +1 -0
  89. package/record/record.crud.js +49 -13
  90. package/record/record.crud.js.map +1 -1
  91. package/record/record.gql.d.ts +8 -3
  92. package/record/record.gql.js +38 -112
  93. package/record/record.gql.js.map +1 -1
  94. package/record/record.model.d.ts +7 -3
  95. package/record/record.model.js +42 -13
  96. package/record/record.model.js.map +1 -1
  97. package/record/record.so.js +109 -45
  98. package/record/record.so.js.map +1 -1
  99. package/record/record.types.d.ts +71 -18
  100. package/record/record.types.js +3 -1
  101. package/record/record.types.js.map +1 -1
  102. package/types.d.ts +69 -8
  103. package/types.js +52 -4
  104. package/types.js.map +1 -1
  105. package/utils/FolderLevelPermissions.d.ts +71 -0
  106. package/utils/FolderLevelPermissions.js +353 -0
  107. package/utils/FolderLevelPermissions.js.map +1 -0
  108. package/utils/acoRecordId.d.ts +6 -0
  109. package/utils/acoRecordId.js +35 -0
  110. package/utils/acoRecordId.js.map +1 -0
  111. package/utils/createListSort.js +3 -1
  112. package/utils/createListSort.js.map +1 -1
  113. package/utils/createModelField.js +3 -1
  114. package/utils/createModelField.js.map +1 -1
  115. package/utils/createOperationsWrapper.js +3 -1
  116. package/utils/createOperationsWrapper.js.map +1 -1
  117. package/utils/decorators/CmsEntriesCrudDecorators.d.ts +11 -0
  118. package/utils/decorators/CmsEntriesCrudDecorators.js +232 -0
  119. package/utils/decorators/CmsEntriesCrudDecorators.js.map +1 -0
  120. package/utils/decorators/constants.d.ts +1 -0
  121. package/utils/decorators/constants.js +10 -0
  122. package/utils/decorators/constants.js.map +1 -0
  123. package/utils/decorators/where.d.ts +14 -0
  124. package/utils/decorators/where.js +52 -0
  125. package/utils/decorators/where.js.map +1 -0
  126. package/utils/ensureAuthentication.d.ts +2 -0
  127. package/utils/ensureAuthentication.js +16 -0
  128. package/utils/ensureAuthentication.js.map +1 -0
  129. package/utils/getFolderAndItsAncestors.d.ts +7 -0
  130. package/utils/getFolderAndItsAncestors.js +53 -0
  131. package/utils/getFolderAndItsAncestors.js.map +1 -0
  132. package/utils/isInstallationPending.js +3 -1
  133. package/utils/isInstallationPending.js.map +1 -1
  134. package/utils/modelFactory.d.ts +1 -3
  135. package/utils/modelFactory.js +7 -10
  136. package/utils/modelFactory.js.map +1 -1
  137. package/utils/pickEntryFieldValues.d.ts +3 -0
  138. package/utils/pickEntryFieldValues.js +31 -0
  139. package/utils/pickEntryFieldValues.js.map +1 -0
  140. package/utils/resolve.d.ts +3 -2
  141. package/utils/resolve.js +13 -2
  142. package/utils/resolve.js.map +1 -1
  143. package/context/folders.d.ts +0 -2
  144. package/context/folders.js +0 -261
  145. package/context/folders.js.map +0 -1
  146. package/context/index.d.ts +0 -2
  147. package/context/index.js +0 -22
  148. package/context/index.js.map +0 -1
  149. package/context/links.d.ts +0 -2
  150. package/context/links.js +0 -270
  151. package/context/links.js.map +0 -1
  152. package/createAcoCrud.d.ts +0 -2
  153. package/createAcoCrud.js +0 -17
  154. package/createAcoCrud.js.map +0 -1
  155. package/createAcoFields.js +0 -40
  156. package/createAcoFields.js.map +0 -1
  157. package/folder/onFolderBeforeDelete.hook.d.ts +0 -2
  158. package/folder/onFolderBeforeDelete.hook.js +0 -53
  159. package/folder/onFolderBeforeDelete.hook.js.map +0 -1
  160. package/graphql/base.gql.d.ts +0 -3
  161. package/graphql/base.gql.js +0 -63
  162. package/graphql/base.gql.js.map +0 -1
  163. package/graphql/folders.gql.d.ts +0 -3
  164. package/graphql/folders.gql.js +0 -126
  165. package/graphql/folders.gql.js.map +0 -1
  166. package/graphql/index.d.ts +0 -1
  167. package/graphql/index.js +0 -15
  168. package/graphql/index.js.map +0 -1
  169. package/graphql/links.gql.d.ts +0 -3
  170. package/graphql/links.gql.js +0 -123
  171. package/graphql/links.gql.js.map +0 -1
  172. package/subscriptions/afterFolderDelete.d.ts +0 -3
  173. package/subscriptions/afterFolderDelete.js +0 -62
  174. package/subscriptions/afterFolderDelete.js.map +0 -1
  175. package/subscriptions/index.d.ts +0 -3
  176. package/subscriptions/index.js +0 -14
  177. package/subscriptions/index.js.map +0 -1
  178. package/utils/fieldResolver.d.ts +0 -16
  179. package/utils/fieldResolver.js +0 -44
  180. package/utils/fieldResolver.js.map +0 -1
  181. package/utils/getFieldValues.d.ts +0 -2
  182. package/utils/getFieldValues.js +0 -19
  183. package/utils/getFieldValues.js.map +0 -1
@@ -1,12 +1,21 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.createFolderCrudMethods = void 0;
7
8
  var _pubsub = require("@webiny/pubsub");
9
+ var _validation = require("@webiny/validation");
10
+ var _getFolderAndItsAncestors = require("../utils/getFolderAndItsAncestors");
11
+ var _NotAuthorizedError = _interopRequireDefault(require("@webiny/api-security/NotAuthorizedError"));
12
+ var _error = _interopRequireDefault(require("@webiny/error"));
13
+ const FIXED_FOLDER_LISTING_LIMIT = 10_000;
8
14
  const createFolderCrudMethods = ({
9
- storageOperations
15
+ storageOperations,
16
+ folderLevelPermissions,
17
+ listAdminUsers,
18
+ listTeams
10
19
  }) => {
11
20
  // create
12
21
  const onFolderBeforeCreate = (0, _pubsub.createTopic)("aco.onFolderBeforeCreate");
@@ -28,20 +37,81 @@ const createFolderCrudMethods = ({
28
37
  onFolderBeforeDelete,
29
38
  onFolderAfterDelete,
30
39
  async get(id) {
31
- return storageOperations.getFolder({
40
+ const folder = await storageOperations.getFolder({
32
41
  id
33
42
  });
43
+ await folderLevelPermissions.ensureCanAccessFolder({
44
+ folder,
45
+ rwd: "r"
46
+ });
47
+ await folderLevelPermissions.assignFolderPermissions(folder);
48
+ return folder;
34
49
  },
35
50
  async list(params) {
36
- return storageOperations.listFolders(params);
51
+ // No matter what was the limit set in the params, initially, we always retrieve
52
+ // all folders. The limit is then applied with the filtered folders list below.
53
+ const filteredFolders = await folderLevelPermissions.listAllFoldersWithPermissions(params.where.type).then(filteredFolders => {
54
+ // If `parentId` was included in the `where` clause, we need to filter the folders.
55
+ // TODO: we might want to incorporate this into the `listAllFoldersWithPermissions` method.
56
+ if (params.where.parentId) {
57
+ // Filter by parent ID.
58
+ return filteredFolders.filter(folder => folder.parentId === params.where.parentId);
59
+ }
60
+ return filteredFolders;
61
+ });
62
+ const totalCount = filteredFolders.length;
63
+ let hasMoreItems = false;
64
+ let cursor = null;
65
+
66
+ // Apply cursor/limit params.
67
+ if (params.after) {
68
+ const afterListItemIndex = filteredFolders.findIndex(folder => folder.id === params.after);
69
+ if (afterListItemIndex >= 0) {
70
+ // Remove all items below the "after" item.
71
+ filteredFolders.splice(0, afterListItemIndex + 1);
72
+ }
73
+ }
74
+ hasMoreItems = !!params.limit && filteredFolders.length > params.limit;
75
+ if (hasMoreItems) {
76
+ cursor = filteredFolders[params.limit - 1]?.id || null;
77
+ filteredFolders.splice(params.limit);
78
+ }
79
+ return [filteredFolders, {
80
+ totalCount,
81
+ hasMoreItems,
82
+ cursor
83
+ }];
84
+ },
85
+ async listAll(params) {
86
+ return this.list({
87
+ ...params,
88
+ limit: FIXED_FOLDER_LISTING_LIMIT
89
+ });
37
90
  },
38
91
  async create(data) {
92
+ let canCreateFolder = false;
93
+ if (data.parentId) {
94
+ const parentFolder = await storageOperations.getFolder({
95
+ id: data.parentId
96
+ });
97
+ canCreateFolder = await folderLevelPermissions.canAccessFolder({
98
+ folder: parentFolder,
99
+ rwd: "w"
100
+ });
101
+ } else {
102
+ canCreateFolder = await folderLevelPermissions.canCreateFolderInRoot();
103
+ }
104
+ if (!canCreateFolder) {
105
+ throw new _NotAuthorizedError.default();
106
+ }
39
107
  await onFolderBeforeCreate.publish({
40
108
  input: data
41
109
  });
42
110
  const folder = await storageOperations.createFolder({
43
111
  data
44
112
  });
113
+ folderLevelPermissions.invalidateCache();
114
+ await folderLevelPermissions.assignFolderPermissions(folder);
45
115
  await onFolderAfterCreate.publish({
46
116
  folder
47
117
  });
@@ -51,6 +121,63 @@ const createFolderCrudMethods = ({
51
121
  const original = await storageOperations.getFolder({
52
122
  id
53
123
  });
124
+ const canUpdateFolder = await folderLevelPermissions.canAccessFolder({
125
+ folder: original,
126
+ rwd: "w"
127
+ });
128
+ if (!canUpdateFolder) {
129
+ throw new _NotAuthorizedError.default();
130
+ }
131
+
132
+ // Validate data.
133
+ if (Array.isArray(data.permissions)) {
134
+ data.permissions.forEach(permission => {
135
+ const targetIsValid = permission.target.startsWith("admin:") || permission.target.startsWith("team:");
136
+ if (!targetIsValid) {
137
+ throw new Error(`Permission target "${permission.target}" is not valid.`);
138
+ }
139
+ if (permission.inheritedFrom) {
140
+ throw new Error(`Permission "inheritedFrom" cannot be set manually.`);
141
+ }
142
+ });
143
+ }
144
+
145
+ // Parent change is not allowed if the user doesn't have access to the new parent.
146
+ if (data.parentId && data.parentId !== original.parentId) {
147
+ try {
148
+ // Getting the parent folder will throw an error if the user doesn't have access.
149
+ await this.get(data.parentId);
150
+ } catch (e) {
151
+ if (e instanceof _NotAuthorizedError.default) {
152
+ throw new _error.default(`Cannot move folder to a new parent because you don't have access to the new parent.`, "CANNOT_MOVE_FOLDER_TO_NEW_PARENT");
153
+ }
154
+
155
+ // If we didn't receive the expected error, we still want to throw it.
156
+ throw e;
157
+ }
158
+ }
159
+
160
+ // Let's prepare a custom folder permissions list, where the folder contains the updated data.
161
+ const customFoldersList = await folderLevelPermissions.listAllFolders(original.type).then(folders => {
162
+ const foldersClone = structuredClone(folders);
163
+ return foldersClone.map(folder => {
164
+ if (folder.id === id) {
165
+ Object.assign(folder, data);
166
+ }
167
+ return folder;
168
+ });
169
+ });
170
+ const stillHasAccess = await folderLevelPermissions.canAccessFolder({
171
+ folder: {
172
+ id,
173
+ type: original.type
174
+ },
175
+ rwd: "w",
176
+ foldersList: customFoldersList
177
+ });
178
+ if (!stillHasAccess) {
179
+ throw new _error.default(`Cannot continue because you would loose access to this folder.`, "CANNOT_LOOSE_FOLDER_ACCESS");
180
+ }
54
181
  await onFolderBeforeUpdate.publish({
55
182
  original,
56
183
  input: {
@@ -70,12 +197,18 @@ const createFolderCrudMethods = ({
70
197
  },
71
198
  folder
72
199
  });
200
+ folderLevelPermissions.invalidateCache();
201
+ await folderLevelPermissions.assignFolderPermissions(folder);
73
202
  return folder;
74
203
  },
75
204
  async delete(id) {
76
205
  const folder = await storageOperations.getFolder({
77
206
  id
78
207
  });
208
+ await folderLevelPermissions.ensureCanAccessFolder({
209
+ folder,
210
+ rwd: "d"
211
+ });
79
212
  await onFolderBeforeDelete.publish({
80
213
  folder
81
214
  });
@@ -86,7 +219,71 @@ const createFolderCrudMethods = ({
86
219
  folder
87
220
  });
88
221
  return true;
222
+ },
223
+ async getAncestors(folder) {
224
+ const [folders] = await this.listAll({
225
+ where: {
226
+ type: folder.type
227
+ }
228
+ });
229
+ return (0, _getFolderAndItsAncestors.getFolderAndItsAncestors)({
230
+ folder,
231
+ folders
232
+ });
233
+ },
234
+ /**
235
+ * @deprecated use `getAncestors` instead
236
+ */
237
+ async getFolderWithAncestors(id) {
238
+ const folder = await this.get(id);
239
+ return this.getAncestors(folder);
240
+ },
241
+ async listFolderLevelPermissionsTargets() {
242
+ const adminUsers = await listAdminUsers();
243
+ const teams = await listTeams();
244
+ const teamTargets = teams.map(team => ({
245
+ id: team.id,
246
+ type: "team",
247
+ target: `team:${team.id}`,
248
+ name: team.name || "",
249
+ meta: {}
250
+ }));
251
+ const adminUserTargets = adminUsers.map(user => {
252
+ let name = user.displayName;
253
+ if (!name) {
254
+ // For backwards compatibility, we also want to try concatenating first and last name.
255
+ name = [user.firstName, user.lastName].filter(Boolean).join(" ");
256
+ }
257
+
258
+ // We're doing the validation because, with non-Cognito IdPs (Okta, Auth0), the email
259
+ // field might actually contain a non-email value: `id:${IdP_Identity_ID}`. In that case,
260
+ // let's not assign anything to the `email` field.
261
+ let email = user.email;
262
+ try {
263
+ _validation.validation.validateSync(email, "email");
264
+ } catch {
265
+ email = null;
266
+ }
267
+ const image = user.avatar?.src || null;
268
+ return {
269
+ id: user.id,
270
+ type: "admin",
271
+ target: `admin:${user.id}`,
272
+ name,
273
+ meta: {
274
+ email,
275
+ image
276
+ }
277
+ };
278
+ });
279
+ const results = [...teamTargets, ...adminUserTargets];
280
+ const meta = {
281
+ totalCount: results.length
282
+ };
283
+ return [results, meta];
89
284
  }
90
285
  };
91
286
  };
92
- exports.createFolderCrudMethods = createFolderCrudMethods;
287
+ exports.createFolderCrudMethods = createFolderCrudMethods;
288
+
289
+ //# sourceMappingURL=folder.crud.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createFolderCrudMethods","storageOperations","onFolderBeforeCreate","createTopic","onFolderAfterCreate","onFolderBeforeUpdate","onFolderAfterUpdate","onFolderBeforeDelete","onFolderAfterDelete","get","id","getFolder","list","params","listFolders","create","data","publish","input","folder","createFolder","update","original","updateFolder","delete","deleteFolder"],"sources":["folder.crud.ts"],"sourcesContent":["import { createTopic } from \"@webiny/pubsub\";\n\nimport { CreateAcoParams } from \"~/types\";\nimport {\n AcoFolderCrud,\n OnFolderAfterCreateTopicParams,\n OnFolderAfterDeleteTopicParams,\n OnFolderAfterUpdateTopicParams,\n OnFolderBeforeCreateTopicParams,\n OnFolderBeforeDeleteTopicParams,\n OnFolderBeforeUpdateTopicParams\n} from \"./folder.types\";\n\nexport const createFolderCrudMethods = ({ storageOperations }: CreateAcoParams): AcoFolderCrud => {\n // create\n const onFolderBeforeCreate = createTopic<OnFolderBeforeCreateTopicParams>(\n \"aco.onFolderBeforeCreate\"\n );\n const onFolderAfterCreate =\n createTopic<OnFolderAfterCreateTopicParams>(\"aco.onFolderAfterCreate\");\n // update\n const onFolderBeforeUpdate = createTopic<OnFolderBeforeUpdateTopicParams>(\n \"aco.onFolderBeforeUpdate\"\n );\n const onFolderAfterUpdate =\n createTopic<OnFolderAfterUpdateTopicParams>(\"aco.onFolderAfterUpdate\");\n // delete\n const onFolderBeforeDelete = createTopic<OnFolderBeforeDeleteTopicParams>(\n \"aco.onFolderBeforeDelete\"\n );\n const onFolderAfterDelete =\n createTopic<OnFolderAfterDeleteTopicParams>(\"aco.onFolderAfterDelete\");\n\n return {\n /**\n * Lifecycle events\n */\n onFolderBeforeCreate,\n onFolderAfterCreate,\n onFolderBeforeUpdate,\n onFolderAfterUpdate,\n onFolderBeforeDelete,\n onFolderAfterDelete,\n async get(id) {\n return storageOperations.getFolder({ id });\n },\n async list(params) {\n return storageOperations.listFolders(params);\n },\n async create(data) {\n await onFolderBeforeCreate.publish({ input: data });\n const folder = await storageOperations.createFolder({ data });\n await onFolderAfterCreate.publish({ folder });\n return folder;\n },\n async update(id, data) {\n const original = await storageOperations.getFolder({ id });\n await onFolderBeforeUpdate.publish({ original, input: { id, data } });\n const folder = await storageOperations.updateFolder({ id, data });\n await onFolderAfterUpdate.publish({ original, input: { id, data }, folder });\n return folder;\n },\n async delete(id: string) {\n const folder = await storageOperations.getFolder({ id });\n await onFolderBeforeDelete.publish({ folder });\n await storageOperations.deleteFolder({ id });\n await onFolderAfterDelete.publish({ folder });\n return true;\n }\n };\n};\n"],"mappings":";;;;;;AAAA;AAaO,MAAMA,uBAAuB,GAAG,CAAC;EAAEC;AAAmC,CAAC,KAAoB;EAC9F;EACA,MAAMC,oBAAoB,GAAG,IAAAC,mBAAW,EACpC,0BAA0B,CAC7B;EACD,MAAMC,mBAAmB,GACrB,IAAAD,mBAAW,EAAiC,yBAAyB,CAAC;EAC1E;EACA,MAAME,oBAAoB,GAAG,IAAAF,mBAAW,EACpC,0BAA0B,CAC7B;EACD,MAAMG,mBAAmB,GACrB,IAAAH,mBAAW,EAAiC,yBAAyB,CAAC;EAC1E;EACA,MAAMI,oBAAoB,GAAG,IAAAJ,mBAAW,EACpC,0BAA0B,CAC7B;EACD,MAAMK,mBAAmB,GACrB,IAAAL,mBAAW,EAAiC,yBAAyB,CAAC;EAE1E,OAAO;IACH;AACR;AACA;IACQD,oBAAoB;IACpBE,mBAAmB;IACnBC,oBAAoB;IACpBC,mBAAmB;IACnBC,oBAAoB;IACpBC,mBAAmB;IACnB,MAAMC,GAAG,CAACC,EAAE,EAAE;MACV,OAAOT,iBAAiB,CAACU,SAAS,CAAC;QAAED;MAAG,CAAC,CAAC;IAC9C,CAAC;IACD,MAAME,IAAI,CAACC,MAAM,EAAE;MACf,OAAOZ,iBAAiB,CAACa,WAAW,CAACD,MAAM,CAAC;IAChD,CAAC;IACD,MAAME,MAAM,CAACC,IAAI,EAAE;MACf,MAAMd,oBAAoB,CAACe,OAAO,CAAC;QAAEC,KAAK,EAAEF;MAAK,CAAC,CAAC;MACnD,MAAMG,MAAM,GAAG,MAAMlB,iBAAiB,CAACmB,YAAY,CAAC;QAAEJ;MAAK,CAAC,CAAC;MAC7D,MAAMZ,mBAAmB,CAACa,OAAO,CAAC;QAAEE;MAAO,CAAC,CAAC;MAC7C,OAAOA,MAAM;IACjB,CAAC;IACD,MAAME,MAAM,CAACX,EAAE,EAAEM,IAAI,EAAE;MACnB,MAAMM,QAAQ,GAAG,MAAMrB,iBAAiB,CAACU,SAAS,CAAC;QAAED;MAAG,CAAC,CAAC;MAC1D,MAAML,oBAAoB,CAACY,OAAO,CAAC;QAAEK,QAAQ;QAAEJ,KAAK,EAAE;UAAER,EAAE;UAAEM;QAAK;MAAE,CAAC,CAAC;MACrE,MAAMG,MAAM,GAAG,MAAMlB,iBAAiB,CAACsB,YAAY,CAAC;QAAEb,EAAE;QAAEM;MAAK,CAAC,CAAC;MACjE,MAAMV,mBAAmB,CAACW,OAAO,CAAC;QAAEK,QAAQ;QAAEJ,KAAK,EAAE;UAAER,EAAE;UAAEM;QAAK,CAAC;QAAEG;MAAO,CAAC,CAAC;MAC5E,OAAOA,MAAM;IACjB,CAAC;IACD,MAAMK,MAAM,CAACd,EAAU,EAAE;MACrB,MAAMS,MAAM,GAAG,MAAMlB,iBAAiB,CAACU,SAAS,CAAC;QAAED;MAAG,CAAC,CAAC;MACxD,MAAMH,oBAAoB,CAACU,OAAO,CAAC;QAAEE;MAAO,CAAC,CAAC;MAC9C,MAAMlB,iBAAiB,CAACwB,YAAY,CAAC;QAAEf;MAAG,CAAC,CAAC;MAC5C,MAAMF,mBAAmB,CAACS,OAAO,CAAC;QAAEE;MAAO,CAAC,CAAC;MAC7C,OAAO,IAAI;IACf;EACJ,CAAC;AACL,CAAC;AAAC"}
1
+ {"version":3,"names":["_pubsub","require","_validation","_getFolderAndItsAncestors","_NotAuthorizedError","_interopRequireDefault","_error","FIXED_FOLDER_LISTING_LIMIT","createFolderCrudMethods","storageOperations","folderLevelPermissions","listAdminUsers","listTeams","onFolderBeforeCreate","createTopic","onFolderAfterCreate","onFolderBeforeUpdate","onFolderAfterUpdate","onFolderBeforeDelete","onFolderAfterDelete","get","id","folder","getFolder","ensureCanAccessFolder","rwd","assignFolderPermissions","list","params","filteredFolders","listAllFoldersWithPermissions","where","type","then","parentId","filter","totalCount","length","hasMoreItems","cursor","after","afterListItemIndex","findIndex","splice","limit","listAll","create","data","canCreateFolder","parentFolder","canAccessFolder","canCreateFolderInRoot","NotAuthorizedError","publish","input","createFolder","invalidateCache","update","original","canUpdateFolder","Array","isArray","permissions","forEach","permission","targetIsValid","target","startsWith","Error","inheritedFrom","e","WError","customFoldersList","listAllFolders","folders","foldersClone","structuredClone","map","Object","assign","stillHasAccess","foldersList","updateFolder","delete","deleteFolder","getAncestors","getFolderAndItsAncestors","getFolderWithAncestors","listFolderLevelPermissionsTargets","adminUsers","teams","teamTargets","team","name","meta","adminUserTargets","user","displayName","firstName","lastName","Boolean","join","email","validation","validateSync","image","avatar","src","results","exports"],"sources":["folder.crud.ts"],"sourcesContent":["import { createTopic } from \"@webiny/pubsub\";\nimport { validation } from \"@webiny/validation\";\nimport { CreateAcoParams, Folder } from \"~/types\";\nimport {\n AcoFolderCrud,\n OnFolderAfterCreateTopicParams,\n OnFolderAfterDeleteTopicParams,\n OnFolderAfterUpdateTopicParams,\n OnFolderBeforeCreateTopicParams,\n OnFolderBeforeDeleteTopicParams,\n OnFolderBeforeUpdateTopicParams\n} from \"./folder.types\";\n\nimport { getFolderAndItsAncestors } from \"~/utils/getFolderAndItsAncestors\";\nimport NotAuthorizedError from \"@webiny/api-security/NotAuthorizedError\";\nimport { AdminUser } from \"@webiny/api-admin-users/types\";\nimport { Team } from \"@webiny/api-security/types\";\nimport WError from \"@webiny/error\";\n\nconst FIXED_FOLDER_LISTING_LIMIT = 10_000;\n\ninterface CreateFolderCrudMethodsParams extends CreateAcoParams {\n listAdminUsers: () => Promise<AdminUser[]>;\n listTeams: () => Promise<Team[]>;\n}\n\nexport const createFolderCrudMethods = ({\n storageOperations,\n folderLevelPermissions,\n listAdminUsers,\n listTeams\n}: CreateFolderCrudMethodsParams): AcoFolderCrud => {\n // create\n const onFolderBeforeCreate = createTopic<OnFolderBeforeCreateTopicParams>(\n \"aco.onFolderBeforeCreate\"\n );\n const onFolderAfterCreate =\n createTopic<OnFolderAfterCreateTopicParams>(\"aco.onFolderAfterCreate\");\n // update\n const onFolderBeforeUpdate = createTopic<OnFolderBeforeUpdateTopicParams>(\n \"aco.onFolderBeforeUpdate\"\n );\n const onFolderAfterUpdate =\n createTopic<OnFolderAfterUpdateTopicParams>(\"aco.onFolderAfterUpdate\");\n // delete\n const onFolderBeforeDelete = createTopic<OnFolderBeforeDeleteTopicParams>(\n \"aco.onFolderBeforeDelete\"\n );\n const onFolderAfterDelete =\n createTopic<OnFolderAfterDeleteTopicParams>(\"aco.onFolderAfterDelete\");\n\n return {\n /**\n * Lifecycle events\n */\n onFolderBeforeCreate,\n onFolderAfterCreate,\n onFolderBeforeUpdate,\n onFolderAfterUpdate,\n onFolderBeforeDelete,\n onFolderAfterDelete,\n\n async get(id) {\n const folder = await storageOperations.getFolder({ id });\n\n await folderLevelPermissions.ensureCanAccessFolder({\n folder,\n rwd: \"r\"\n });\n\n await folderLevelPermissions.assignFolderPermissions(folder);\n return folder;\n },\n async list(params) {\n // No matter what was the limit set in the params, initially, we always retrieve\n // all folders. The limit is then applied with the filtered folders list below.\n const filteredFolders = await folderLevelPermissions\n .listAllFoldersWithPermissions(params.where.type)\n .then(filteredFolders => {\n // If `parentId` was included in the `where` clause, we need to filter the folders.\n // TODO: we might want to incorporate this into the `listAllFoldersWithPermissions` method.\n if (params.where.parentId) {\n // Filter by parent ID.\n return filteredFolders.filter(\n folder => folder.parentId === params.where.parentId\n );\n }\n return filteredFolders;\n });\n\n const totalCount = filteredFolders.length;\n let hasMoreItems = false;\n let cursor: string | null = null;\n\n // Apply cursor/limit params.\n if (params.after) {\n const afterListItemIndex = filteredFolders.findIndex(\n folder => folder.id === params.after\n );\n if (afterListItemIndex >= 0) {\n // Remove all items below the \"after\" item.\n filteredFolders.splice(0, afterListItemIndex + 1);\n }\n }\n\n hasMoreItems = !!params.limit && filteredFolders.length > params.limit;\n\n if (hasMoreItems) {\n cursor = filteredFolders[params.limit! - 1]?.id || null;\n filteredFolders.splice(params.limit!);\n }\n\n return [filteredFolders, { totalCount, hasMoreItems, cursor }];\n },\n\n async listAll(params) {\n return this.list({ ...params, limit: FIXED_FOLDER_LISTING_LIMIT });\n },\n\n async create(data) {\n let canCreateFolder = false;\n if (data.parentId) {\n const parentFolder = await storageOperations.getFolder({ id: data.parentId });\n canCreateFolder = await folderLevelPermissions.canAccessFolder({\n folder: parentFolder,\n rwd: \"w\"\n });\n } else {\n canCreateFolder = await folderLevelPermissions.canCreateFolderInRoot();\n }\n\n if (!canCreateFolder) {\n throw new NotAuthorizedError();\n }\n\n await onFolderBeforeCreate.publish({ input: data });\n const folder = await storageOperations.createFolder({ data });\n\n folderLevelPermissions.invalidateCache();\n await folderLevelPermissions.assignFolderPermissions(folder);\n\n await onFolderAfterCreate.publish({ folder });\n\n return folder;\n },\n\n async update(id, data) {\n const original = await storageOperations.getFolder({ id });\n\n const canUpdateFolder = await folderLevelPermissions.canAccessFolder({\n folder: original,\n rwd: \"w\"\n });\n\n if (!canUpdateFolder) {\n throw new NotAuthorizedError();\n }\n\n // Validate data.\n if (Array.isArray(data.permissions)) {\n data.permissions.forEach(permission => {\n const targetIsValid =\n permission.target.startsWith(\"admin:\") ||\n permission.target.startsWith(\"team:\");\n if (!targetIsValid) {\n throw new Error(`Permission target \"${permission.target}\" is not valid.`);\n }\n\n if (permission.inheritedFrom) {\n throw new Error(`Permission \"inheritedFrom\" cannot be set manually.`);\n }\n });\n }\n\n // Parent change is not allowed if the user doesn't have access to the new parent.\n if (data.parentId && data.parentId !== original.parentId) {\n try {\n // Getting the parent folder will throw an error if the user doesn't have access.\n await this.get(data.parentId);\n } catch (e) {\n if (e instanceof NotAuthorizedError) {\n throw new WError(\n `Cannot move folder to a new parent because you don't have access to the new parent.`,\n \"CANNOT_MOVE_FOLDER_TO_NEW_PARENT\"\n );\n }\n\n // If we didn't receive the expected error, we still want to throw it.\n throw e;\n }\n }\n\n // Let's prepare a custom folder permissions list, where the folder contains the updated data.\n const customFoldersList = await folderLevelPermissions\n .listAllFolders(original.type)\n .then(folders => {\n const foldersClone = structuredClone<Folder[]>(folders);\n return foldersClone.map(folder => {\n if (folder.id === id) {\n Object.assign(folder, data);\n }\n return folder;\n });\n });\n\n const stillHasAccess = await folderLevelPermissions.canAccessFolder({\n folder: { id, type: original.type },\n rwd: \"w\",\n foldersList: customFoldersList\n });\n\n if (!stillHasAccess) {\n throw new WError(\n `Cannot continue because you would loose access to this folder.`,\n \"CANNOT_LOOSE_FOLDER_ACCESS\"\n );\n }\n\n await onFolderBeforeUpdate.publish({ original, input: { id, data } });\n const folder = await storageOperations.updateFolder({ id, data });\n await onFolderAfterUpdate.publish({ original, input: { id, data }, folder });\n\n folderLevelPermissions.invalidateCache();\n await folderLevelPermissions.assignFolderPermissions(folder);\n return folder;\n },\n\n async delete(id: string) {\n const folder = await storageOperations.getFolder({ id });\n\n await folderLevelPermissions.ensureCanAccessFolder({\n folder,\n rwd: \"d\"\n });\n\n await onFolderBeforeDelete.publish({ folder });\n await storageOperations.deleteFolder({ id });\n await onFolderAfterDelete.publish({ folder });\n return true;\n },\n\n async getAncestors(folder: Folder) {\n const [folders] = await this.listAll({ where: { type: folder.type } });\n return getFolderAndItsAncestors({ folder, folders });\n },\n\n /**\n * @deprecated use `getAncestors` instead\n */\n async getFolderWithAncestors(id: string) {\n const folder = await this.get(id);\n return this.getAncestors(folder);\n },\n\n async listFolderLevelPermissionsTargets() {\n const adminUsers = await listAdminUsers();\n const teams = await listTeams();\n\n const teamTargets = teams.map(team => ({\n id: team.id,\n type: \"team\",\n target: `team:${team.id}`,\n name: team.name || \"\",\n meta: {}\n }));\n\n const adminUserTargets = adminUsers.map(user => {\n let name = user.displayName;\n if (!name) {\n // For backwards compatibility, we also want to try concatenating first and last name.\n name = [user.firstName, user.lastName].filter(Boolean).join(\" \");\n }\n\n // We're doing the validation because, with non-Cognito IdPs (Okta, Auth0), the email\n // field might actually contain a non-email value: `id:${IdP_Identity_ID}`. In that case,\n // let's not assign anything to the `email` field.\n let email: string | null = user.email;\n try {\n validation.validateSync(email, \"email\");\n } catch {\n email = null;\n }\n\n const image = user.avatar?.src || null;\n\n return {\n id: user.id,\n type: \"admin\",\n target: `admin:${user.id}`,\n name,\n meta: {\n email,\n image\n }\n };\n });\n\n const results = [...teamTargets, ...adminUserTargets];\n const meta = { totalCount: results.length };\n\n return [results, meta];\n }\n };\n};\n"],"mappings":"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"}
@@ -6,23 +6,54 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.folderSchema = void 0;
7
7
  var _responses = require("@webiny/handler-graphql/responses");
8
8
  var _GraphQLSchemaPlugin = require("@webiny/handler-graphql/plugins/GraphQLSchemaPlugin");
9
+ var _ensureAuthentication = require("../utils/ensureAuthentication");
9
10
  var _resolve = require("../utils/resolve");
10
11
  const folderSchema = new _GraphQLSchemaPlugin.GraphQLSchemaPlugin({
11
12
  typeDefs: /* GraphQL */`
13
+ type FolderPermission {
14
+ target: String!
15
+ level: String!
16
+ inheritedFrom: ID
17
+ }
18
+
19
+ input FolderPermissionInput {
20
+ target: String!
21
+ level: String!
22
+ inheritedFrom: ID
23
+ }
24
+
12
25
  type Folder {
13
26
  id: ID!
14
27
  title: String!
15
28
  slug: String!
29
+ permissions: [FolderPermission]
30
+
31
+ # Tells us if the current user can manage folder structure.
32
+ canManageStructure: Boolean
33
+
34
+ # Tells us if the current user can manage folder permissions.
35
+ canManagePermissions: Boolean
36
+
37
+ # Tells us if the current user can manage folder content.
38
+ canManageContent: Boolean
39
+
40
+ # Tells us if the folder contains non-inherited permissions.
41
+ hasNonInheritedPermissions: Boolean
42
+
16
43
  type: String!
17
44
  parentId: ID
18
- savedOn: DateTime
19
45
  createdOn: DateTime
46
+ modifiedOn: DateTime
47
+ savedOn: DateTime
20
48
  createdBy: AcoUser
49
+ modifiedBy: AcoUser
50
+ savedBy: AcoUser
21
51
  }
22
52
 
23
53
  input FolderCreateInput {
24
54
  title: String!
25
55
  slug: String!
56
+ permissions: [FolderPermissionInput]
26
57
  type: String!
27
58
  parentId: ID
28
59
  }
@@ -30,12 +61,14 @@ const folderSchema = new _GraphQLSchemaPlugin.GraphQLSchemaPlugin({
30
61
  input FolderUpdateInput {
31
62
  title: String
32
63
  slug: String
64
+ permissions: [FolderPermissionInput]
33
65
  parentId: ID
34
66
  }
35
67
 
36
68
  input FoldersListWhereInput {
37
69
  type: String!
38
70
  parentId: String
71
+ createdBy: ID
39
72
  }
40
73
 
41
74
  type FolderResponse {
@@ -46,6 +79,25 @@ const folderSchema = new _GraphQLSchemaPlugin.GraphQLSchemaPlugin({
46
79
  type FoldersListResponse {
47
80
  data: [Folder]
48
81
  error: AcoError
82
+ meta: AcoMeta
83
+ }
84
+
85
+ type FolderLevelPermissionsTarget {
86
+ id: ID!
87
+ type: String!
88
+ target: ID!
89
+ name: String!
90
+ meta: JSON
91
+ }
92
+
93
+ type FolderLevelPermissionsTargetsListMeta {
94
+ totalCount: Int!
95
+ }
96
+
97
+ type FolderLevelPermissionsTargetsListResponse {
98
+ data: [FolderLevelPermissionsTarget]
99
+ meta: FolderLevelPermissionsTargetsListMeta
100
+ error: AcoError
49
101
  }
50
102
 
51
103
  extend type AcoQuery {
@@ -56,6 +108,8 @@ const folderSchema = new _GraphQLSchemaPlugin.GraphQLSchemaPlugin({
56
108
  after: String
57
109
  sort: AcoSort
58
110
  ): FoldersListResponse
111
+
112
+ listFolderLevelPermissionsTargets: FolderLevelPermissionsTargetsListResponse
59
113
  }
60
114
 
61
115
  extend type AcoMutation {
@@ -65,39 +119,77 @@ const folderSchema = new _GraphQLSchemaPlugin.GraphQLSchemaPlugin({
65
119
  }
66
120
  `,
67
121
  resolvers: {
122
+ Folder: {
123
+ hasNonInheritedPermissions: (folder, _, context) => {
124
+ return context.aco.folderLevelPermissions.permissionsIncludeNonInheritedPermissions(folder.permissions);
125
+ },
126
+ canManageStructure: (folder, _, context) => {
127
+ return context.aco.folderLevelPermissions.canManageFolderStructure(folder);
128
+ },
129
+ canManagePermissions: (folder, _, context) => {
130
+ return context.aco.folderLevelPermissions.canManageFolderPermissions(folder);
131
+ },
132
+ canManageContent: (folder, _, context) => {
133
+ return context.aco.folderLevelPermissions.canManageFolderContent(folder);
134
+ }
135
+ },
68
136
  AcoQuery: {
69
137
  getFolder: async (_, {
70
138
  id
71
139
  }, context) => {
72
- return (0, _resolve.resolve)(() => context.aco.folder.get(id));
140
+ return (0, _resolve.resolve)(() => {
141
+ (0, _ensureAuthentication.ensureAuthentication)(context);
142
+ return context.aco.folder.get(id);
143
+ });
73
144
  },
74
145
  listFolders: async (_, args, context) => {
75
146
  try {
147
+ (0, _ensureAuthentication.ensureAuthentication)(context);
76
148
  const [entries, meta] = await context.aco.folder.list(args);
77
149
  return new _responses.ListResponse(entries, meta);
78
150
  } catch (e) {
79
151
  return new _responses.ErrorResponse(e);
80
152
  }
153
+ },
154
+ listFolderLevelPermissionsTargets: async (_, args, context) => {
155
+ try {
156
+ (0, _ensureAuthentication.ensureAuthentication)(context);
157
+ const [entries, meta] = await context.aco.folder.listFolderLevelPermissionsTargets();
158
+ return new _responses.ListResponse(entries, meta);
159
+ } catch (e) {
160
+ return new _responses.ErrorResponse(e);
161
+ }
81
162
  }
82
163
  },
83
164
  AcoMutation: {
84
165
  createFolder: async (_, {
85
166
  data
86
167
  }, context) => {
87
- return (0, _resolve.resolve)(() => context.aco.folder.create(data));
168
+ return (0, _resolve.resolve)(() => {
169
+ (0, _ensureAuthentication.ensureAuthentication)(context);
170
+ return context.aco.folder.create(data);
171
+ });
88
172
  },
89
173
  updateFolder: async (_, {
90
174
  id,
91
175
  data
92
176
  }, context) => {
93
- return (0, _resolve.resolve)(() => context.aco.folder.update(id, data));
177
+ return (0, _resolve.resolve)(() => {
178
+ (0, _ensureAuthentication.ensureAuthentication)(context);
179
+ return context.aco.folder.update(id, data);
180
+ });
94
181
  },
95
182
  deleteFolder: async (_, {
96
183
  id
97
184
  }, context) => {
98
- return (0, _resolve.resolve)(() => context.aco.folder.delete(id));
185
+ return (0, _resolve.resolve)(() => {
186
+ (0, _ensureAuthentication.ensureAuthentication)(context);
187
+ return context.aco.folder.delete(id);
188
+ });
99
189
  }
100
190
  }
101
191
  }
102
192
  });
103
- exports.folderSchema = folderSchema;
193
+ exports.folderSchema = folderSchema;
194
+
195
+ //# sourceMappingURL=folder.gql.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["folderSchema","GraphQLSchemaPlugin","typeDefs","resolvers","AcoQuery","getFolder","_","id","context","resolve","aco","folder","get","listFolders","args","entries","meta","list","ListResponse","e","ErrorResponse","AcoMutation","createFolder","data","create","updateFolder","update","deleteFolder","delete"],"sources":["folder.gql.ts"],"sourcesContent":["import { ErrorResponse, ListResponse } from \"@webiny/handler-graphql/responses\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/plugins/GraphQLSchemaPlugin\";\n\nimport { resolve } from \"~/utils/resolve\";\n\nimport { AcoContext } from \"~/types\";\n\nexport const folderSchema = new GraphQLSchemaPlugin<AcoContext>({\n typeDefs: /* GraphQL */ `\n type Folder {\n id: ID!\n title: String!\n slug: String!\n type: String!\n parentId: ID\n savedOn: DateTime\n createdOn: DateTime\n createdBy: AcoUser\n }\n\n input FolderCreateInput {\n title: String!\n slug: String!\n type: String!\n parentId: ID\n }\n\n input FolderUpdateInput {\n title: String\n slug: String\n parentId: ID\n }\n\n input FoldersListWhereInput {\n type: String!\n parentId: String\n }\n\n type FolderResponse {\n data: Folder\n error: AcoError\n }\n\n type FoldersListResponse {\n data: [Folder]\n error: AcoError\n }\n\n extend type AcoQuery {\n getFolder(id: ID!): FolderResponse\n listFolders(\n where: FoldersListWhereInput!\n limit: Int\n after: String\n sort: AcoSort\n ): FoldersListResponse\n }\n\n extend type AcoMutation {\n createFolder(data: FolderCreateInput!): FolderResponse\n updateFolder(id: ID!, data: FolderUpdateInput!): FolderResponse\n deleteFolder(id: ID!): AcoBooleanResponse\n }\n `,\n resolvers: {\n AcoQuery: {\n getFolder: async (_, { id }, context) => {\n return resolve(() => context.aco.folder.get(id));\n },\n listFolders: async (_, args: any, context) => {\n try {\n const [entries, meta] = await context.aco.folder.list(args);\n return new ListResponse(entries, meta);\n } catch (e) {\n return new ErrorResponse(e);\n }\n }\n },\n AcoMutation: {\n createFolder: async (_, { data }, context) => {\n return resolve(() => context.aco.folder.create(data));\n },\n updateFolder: async (_, { id, data }, context) => {\n return resolve(() => context.aco.folder.update(id, data));\n },\n deleteFolder: async (_, { id }, context) => {\n return resolve(() => context.aco.folder.delete(id));\n }\n }\n }\n});\n"],"mappings":";;;;;;AAAA;AACA;AAEA;AAIO,MAAMA,YAAY,GAAG,IAAIC,wCAAmB,CAAa;EAC5DC,QAAQ,EAAE,aAAe;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;EACDC,SAAS,EAAE;IACPC,QAAQ,EAAE;MACNC,SAAS,EAAE,OAAOC,CAAC,EAAE;QAAEC;MAAG,CAAC,EAAEC,OAAO,KAAK;QACrC,OAAO,IAAAC,gBAAO,EAAC,MAAMD,OAAO,CAACE,GAAG,CAACC,MAAM,CAACC,GAAG,CAACL,EAAE,CAAC,CAAC;MACpD,CAAC;MACDM,WAAW,EAAE,OAAOP,CAAC,EAAEQ,IAAS,EAAEN,OAAO,KAAK;QAC1C,IAAI;UACA,MAAM,CAACO,OAAO,EAAEC,IAAI,CAAC,GAAG,MAAMR,OAAO,CAACE,GAAG,CAACC,MAAM,CAACM,IAAI,CAACH,IAAI,CAAC;UAC3D,OAAO,IAAII,uBAAY,CAACH,OAAO,EAAEC,IAAI,CAAC;QAC1C,CAAC,CAAC,OAAOG,CAAC,EAAE;UACR,OAAO,IAAIC,wBAAa,CAACD,CAAC,CAAC;QAC/B;MACJ;IACJ,CAAC;IACDE,WAAW,EAAE;MACTC,YAAY,EAAE,OAAOhB,CAAC,EAAE;QAAEiB;MAAK,CAAC,EAAEf,OAAO,KAAK;QAC1C,OAAO,IAAAC,gBAAO,EAAC,MAAMD,OAAO,CAACE,GAAG,CAACC,MAAM,CAACa,MAAM,CAACD,IAAI,CAAC,CAAC;MACzD,CAAC;MACDE,YAAY,EAAE,OAAOnB,CAAC,EAAE;QAAEC,EAAE;QAAEgB;MAAK,CAAC,EAAEf,OAAO,KAAK;QAC9C,OAAO,IAAAC,gBAAO,EAAC,MAAMD,OAAO,CAACE,GAAG,CAACC,MAAM,CAACe,MAAM,CAACnB,EAAE,EAAEgB,IAAI,CAAC,CAAC;MAC7D,CAAC;MACDI,YAAY,EAAE,OAAOrB,CAAC,EAAE;QAAEC;MAAG,CAAC,EAAEC,OAAO,KAAK;QACxC,OAAO,IAAAC,gBAAO,EAAC,MAAMD,OAAO,CAACE,GAAG,CAACC,MAAM,CAACiB,MAAM,CAACrB,EAAE,CAAC,CAAC;MACvD;IACJ;EACJ;AACJ,CAAC,CAAC;AAAC"}
1
+ {"version":3,"names":["_responses","require","_GraphQLSchemaPlugin","_ensureAuthentication","_resolve","folderSchema","GraphQLSchemaPlugin","typeDefs","resolvers","Folder","hasNonInheritedPermissions","folder","_","context","aco","folderLevelPermissions","permissionsIncludeNonInheritedPermissions","permissions","canManageStructure","canManageFolderStructure","canManagePermissions","canManageFolderPermissions","canManageContent","canManageFolderContent","AcoQuery","getFolder","id","resolve","ensureAuthentication","get","listFolders","args","entries","meta","list","ListResponse","e","ErrorResponse","listFolderLevelPermissionsTargets","AcoMutation","createFolder","data","create","updateFolder","update","deleteFolder","delete","exports"],"sources":["folder.gql.ts"],"sourcesContent":["import { ErrorResponse, ListResponse } from \"@webiny/handler-graphql/responses\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/plugins/GraphQLSchemaPlugin\";\n\nimport { ensureAuthentication } from \"~/utils/ensureAuthentication\";\nimport { resolve } from \"~/utils/resolve\";\n\nimport { AcoContext, Folder } from \"~/types\";\n\nexport const folderSchema = new GraphQLSchemaPlugin<AcoContext>({\n typeDefs: /* GraphQL */ `\n type FolderPermission {\n target: String!\n level: String!\n inheritedFrom: ID\n }\n\n input FolderPermissionInput {\n target: String!\n level: String!\n inheritedFrom: ID\n }\n\n type Folder {\n id: ID!\n title: String!\n slug: String!\n permissions: [FolderPermission]\n\n # Tells us if the current user can manage folder structure.\n canManageStructure: Boolean\n\n # Tells us if the current user can manage folder permissions.\n canManagePermissions: Boolean\n\n # Tells us if the current user can manage folder content.\n canManageContent: Boolean\n\n # Tells us if the folder contains non-inherited permissions.\n hasNonInheritedPermissions: Boolean\n\n type: String!\n parentId: ID\n createdOn: DateTime\n modifiedOn: DateTime\n savedOn: DateTime\n createdBy: AcoUser\n modifiedBy: AcoUser\n savedBy: AcoUser\n }\n\n input FolderCreateInput {\n title: String!\n slug: String!\n permissions: [FolderPermissionInput]\n type: String!\n parentId: ID\n }\n\n input FolderUpdateInput {\n title: String\n slug: String\n permissions: [FolderPermissionInput]\n parentId: ID\n }\n\n input FoldersListWhereInput {\n type: String!\n parentId: String\n createdBy: ID\n }\n\n type FolderResponse {\n data: Folder\n error: AcoError\n }\n\n type FoldersListResponse {\n data: [Folder]\n error: AcoError\n meta: AcoMeta\n }\n\n type FolderLevelPermissionsTarget {\n id: ID!\n type: String!\n target: ID!\n name: String!\n meta: JSON\n }\n\n type FolderLevelPermissionsTargetsListMeta {\n totalCount: Int!\n }\n\n type FolderLevelPermissionsTargetsListResponse {\n data: [FolderLevelPermissionsTarget]\n meta: FolderLevelPermissionsTargetsListMeta\n error: AcoError\n }\n\n extend type AcoQuery {\n getFolder(id: ID!): FolderResponse\n listFolders(\n where: FoldersListWhereInput!\n limit: Int\n after: String\n sort: AcoSort\n ): FoldersListResponse\n\n listFolderLevelPermissionsTargets: FolderLevelPermissionsTargetsListResponse\n }\n\n extend type AcoMutation {\n createFolder(data: FolderCreateInput!): FolderResponse\n updateFolder(id: ID!, data: FolderUpdateInput!): FolderResponse\n deleteFolder(id: ID!): AcoBooleanResponse\n }\n `,\n resolvers: {\n Folder: {\n hasNonInheritedPermissions: (folder: Folder, _, context) => {\n return context.aco.folderLevelPermissions.permissionsIncludeNonInheritedPermissions(\n folder.permissions\n );\n },\n canManageStructure: (folder, _, context) => {\n return context.aco.folderLevelPermissions.canManageFolderStructure(folder);\n },\n canManagePermissions: (folder, _, context) => {\n return context.aco.folderLevelPermissions.canManageFolderPermissions(folder);\n },\n canManageContent: (folder, _, context) => {\n return context.aco.folderLevelPermissions.canManageFolderContent(folder);\n }\n },\n AcoQuery: {\n getFolder: async (_, { id }, context) => {\n return resolve(() => {\n ensureAuthentication(context);\n return context.aco.folder.get(id);\n });\n },\n listFolders: async (_, args: any, context) => {\n try {\n ensureAuthentication(context);\n const [entries, meta] = await context.aco.folder.list(args);\n return new ListResponse(entries, meta);\n } catch (e) {\n return new ErrorResponse(e);\n }\n },\n listFolderLevelPermissionsTargets: async (_, args: any, context) => {\n try {\n ensureAuthentication(context);\n const [entries, meta] =\n await context.aco.folder.listFolderLevelPermissionsTargets();\n return new ListResponse(entries, meta);\n } catch (e) {\n return new ErrorResponse(e);\n }\n }\n },\n AcoMutation: {\n createFolder: async (_, { data }, context) => {\n return resolve(() => {\n ensureAuthentication(context);\n return context.aco.folder.create(data);\n });\n },\n updateFolder: async (_, { id, data }, context) => {\n return resolve(() => {\n ensureAuthentication(context);\n return context.aco.folder.update(id, data);\n });\n },\n deleteFolder: async (_, { id }, context) => {\n return resolve(() => {\n ensureAuthentication(context);\n return context.aco.folder.delete(id);\n });\n }\n }\n }\n});\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,oBAAA,GAAAD,OAAA;AAEA,IAAAE,qBAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AAIO,MAAMI,YAAY,GAAG,IAAIC,wCAAmB,CAAa;EAC5DC,QAAQ,EAAE,aAAe;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;EACDC,SAAS,EAAE;IACPC,MAAM,EAAE;MACJC,0BAA0B,EAAEA,CAACC,MAAc,EAAEC,CAAC,EAAEC,OAAO,KAAK;QACxD,OAAOA,OAAO,CAACC,GAAG,CAACC,sBAAsB,CAACC,yCAAyC,CAC/EL,MAAM,CAACM,WACX,CAAC;MACL,CAAC;MACDC,kBAAkB,EAAEA,CAACP,MAAM,EAAEC,CAAC,EAAEC,OAAO,KAAK;QACxC,OAAOA,OAAO,CAACC,GAAG,CAACC,sBAAsB,CAACI,wBAAwB,CAACR,MAAM,CAAC;MAC9E,CAAC;MACDS,oBAAoB,EAAEA,CAACT,MAAM,EAAEC,CAAC,EAAEC,OAAO,KAAK;QAC1C,OAAOA,OAAO,CAACC,GAAG,CAACC,sBAAsB,CAACM,0BAA0B,CAACV,MAAM,CAAC;MAChF,CAAC;MACDW,gBAAgB,EAAEA,CAACX,MAAM,EAAEC,CAAC,EAAEC,OAAO,KAAK;QACtC,OAAOA,OAAO,CAACC,GAAG,CAACC,sBAAsB,CAACQ,sBAAsB,CAACZ,MAAM,CAAC;MAC5E;IACJ,CAAC;IACDa,QAAQ,EAAE;MACNC,SAAS,EAAE,MAAAA,CAAOb,CAAC,EAAE;QAAEc;MAAG,CAAC,EAAEb,OAAO,KAAK;QACrC,OAAO,IAAAc,gBAAO,EAAC,MAAM;UACjB,IAAAC,0CAAoB,EAACf,OAAO,CAAC;UAC7B,OAAOA,OAAO,CAACC,GAAG,CAACH,MAAM,CAACkB,GAAG,CAACH,EAAE,CAAC;QACrC,CAAC,CAAC;MACN,CAAC;MACDI,WAAW,EAAE,MAAAA,CAAOlB,CAAC,EAAEmB,IAAS,EAAElB,OAAO,KAAK;QAC1C,IAAI;UACA,IAAAe,0CAAoB,EAACf,OAAO,CAAC;UAC7B,MAAM,CAACmB,OAAO,EAAEC,IAAI,CAAC,GAAG,MAAMpB,OAAO,CAACC,GAAG,CAACH,MAAM,CAACuB,IAAI,CAACH,IAAI,CAAC;UAC3D,OAAO,IAAII,uBAAY,CAACH,OAAO,EAAEC,IAAI,CAAC;QAC1C,CAAC,CAAC,OAAOG,CAAC,EAAE;UACR,OAAO,IAAIC,wBAAa,CAACD,CAAC,CAAC;QAC/B;MACJ,CAAC;MACDE,iCAAiC,EAAE,MAAAA,CAAO1B,CAAC,EAAEmB,IAAS,EAAElB,OAAO,KAAK;QAChE,IAAI;UACA,IAAAe,0CAAoB,EAACf,OAAO,CAAC;UAC7B,MAAM,CAACmB,OAAO,EAAEC,IAAI,CAAC,GACjB,MAAMpB,OAAO,CAACC,GAAG,CAACH,MAAM,CAAC2B,iCAAiC,CAAC,CAAC;UAChE,OAAO,IAAIH,uBAAY,CAACH,OAAO,EAAEC,IAAI,CAAC;QAC1C,CAAC,CAAC,OAAOG,CAAC,EAAE;UACR,OAAO,IAAIC,wBAAa,CAACD,CAAC,CAAC;QAC/B;MACJ;IACJ,CAAC;IACDG,WAAW,EAAE;MACTC,YAAY,EAAE,MAAAA,CAAO5B,CAAC,EAAE;QAAE6B;MAAK,CAAC,EAAE5B,OAAO,KAAK;QAC1C,OAAO,IAAAc,gBAAO,EAAC,MAAM;UACjB,IAAAC,0CAAoB,EAACf,OAAO,CAAC;UAC7B,OAAOA,OAAO,CAACC,GAAG,CAACH,MAAM,CAAC+B,MAAM,CAACD,IAAI,CAAC;QAC1C,CAAC,CAAC;MACN,CAAC;MACDE,YAAY,EAAE,MAAAA,CAAO/B,CAAC,EAAE;QAAEc,EAAE;QAAEe;MAAK,CAAC,EAAE5B,OAAO,KAAK;QAC9C,OAAO,IAAAc,gBAAO,EAAC,MAAM;UACjB,IAAAC,0CAAoB,EAACf,OAAO,CAAC;UAC7B,OAAOA,OAAO,CAACC,GAAG,CAACH,MAAM,CAACiC,MAAM,CAAClB,EAAE,EAAEe,IAAI,CAAC;QAC9C,CAAC,CAAC;MACN,CAAC;MACDI,YAAY,EAAE,MAAAA,CAAOjC,CAAC,EAAE;QAAEc;MAAG,CAAC,EAAEb,OAAO,KAAK;QACxC,OAAO,IAAAc,gBAAO,EAAC,MAAM;UACjB,IAAAC,0CAAoB,EAACf,OAAO,CAAC;UAC7B,OAAOA,OAAO,CAACC,GAAG,CAACH,MAAM,CAACmC,MAAM,CAACpB,EAAE,CAAC;QACxC,CAAC,CAAC;MACN;IACJ;EACJ;AACJ,CAAC,CAAC;AAACqB,OAAA,CAAA1C,YAAA,GAAAA,YAAA"}
@@ -1,4 +1,2 @@
1
- import { CmsPrivateModelFull } from "@webiny/api-headless-cms";
2
- export declare type FolderModelDefinition = Omit<CmsPrivateModelFull, "noValidate" | "group">;
3
1
  export declare const FOLDER_MODEL_ID = "acoFolder";
4
- export declare const createFolderModelDefinition: () => FolderModelDefinition;
2
+ export declare const createFolderModelDefinition: () => import("@webiny/api-headless-cms").CmsPrivateModelFull;
@@ -5,18 +5,13 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.createFolderModelDefinition = exports.FOLDER_MODEL_ID = void 0;
7
7
  var _createModelField = require("../utils/createModelField");
8
+ var _apiHeadlessCms = require("@webiny/api-headless-cms");
8
9
  const titleField = () => (0, _createModelField.createModelField)({
9
10
  label: "Title",
10
11
  type: "text",
11
12
  validation: [{
12
13
  name: "required",
13
14
  message: "Value is required."
14
- }, {
15
- name: "minLength",
16
- settings: {
17
- value: "3"
18
- },
19
- message: "Value is too short."
20
15
  }]
21
16
  });
22
17
  const slugField = () => (0, _createModelField.createModelField)({
@@ -25,18 +20,6 @@ const slugField = () => (0, _createModelField.createModelField)({
25
20
  validation: [{
26
21
  name: "required",
27
22
  message: "Value is required."
28
- }, {
29
- name: "minLength",
30
- settings: {
31
- value: "3"
32
- },
33
- message: "Value is too short."
34
- }, {
35
- name: "maxLength",
36
- settings: {
37
- value: "100"
38
- },
39
- message: "Value is too long."
40
23
  }, {
41
24
  name: "pattern",
42
25
  settings: {
@@ -59,17 +42,63 @@ const parentIdField = () => (0, _createModelField.createModelField)({
59
42
  label: "Parent Id",
60
43
  type: "text"
61
44
  });
45
+ const permissionsField = () => (0, _createModelField.createModelField)({
46
+ label: "Permissions",
47
+ fieldId: "permissions",
48
+ type: "object",
49
+ multipleValues: true,
50
+ listValidation: [],
51
+ settings: {
52
+ fields: [{
53
+ id: "target",
54
+ type: "text",
55
+ storageId: "text@target",
56
+ fieldId: "target",
57
+ label: "Target",
58
+ validation: [{
59
+ name: "required",
60
+ message: "Value is required."
61
+ }]
62
+ }, {
63
+ id: "level",
64
+ type: "text",
65
+ storageId: "text@level",
66
+ fieldId: "level",
67
+ label: "Level",
68
+ validation: [{
69
+ name: "required",
70
+ message: "Value is required."
71
+ }],
72
+ predefinedValues: {
73
+ enabled: true,
74
+ values: [{
75
+ label: "Viewer",
76
+ value: "viewer"
77
+ }, {
78
+ label: "Editor",
79
+ value: "editor"
80
+ }, {
81
+ label: "Owner",
82
+ value: "owner"
83
+ }, {
84
+ label: "Public",
85
+ value: "public"
86
+ }]
87
+ }
88
+ }],
89
+ layout: [["target"], ["level"]]
90
+ }
91
+ });
62
92
  const FOLDER_MODEL_ID = "acoFolder";
63
93
  exports.FOLDER_MODEL_ID = FOLDER_MODEL_ID;
64
94
  const createFolderModelDefinition = () => {
65
- return {
95
+ return (0, _apiHeadlessCms.createPrivateModelDefinition)({
66
96
  name: "ACO - Folder",
67
97
  modelId: FOLDER_MODEL_ID,
68
98
  titleFieldId: "title",
69
- layout: [["title"], ["slug"], ["type"], ["parentId"]],
70
- fields: [titleField(), slugField(), typeField(), parentIdField()],
71
- description: "ACO - Folder content model",
72
- isPrivate: true
73
- };
99
+ fields: [titleField(), slugField(), typeField(), parentIdField(), permissionsField()]
100
+ });
74
101
  };
75
- exports.createFolderModelDefinition = createFolderModelDefinition;
102
+ exports.createFolderModelDefinition = createFolderModelDefinition;
103
+
104
+ //# sourceMappingURL=folder.model.js.map