@webiny/api-aco 0.0.0-unstable.a4f3e4ea8b → 0.0.0-unstable.a85ef555b2

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 (217) hide show
  1. package/AcoFeature.d.ts +5 -0
  2. package/AcoFeature.js +134 -0
  3. package/AcoFeature.js.map +1 -0
  4. package/AcoFolderSchemaFactory.d.ts +32 -0
  5. package/AcoFolderSchemaFactory.js +82 -0
  6. package/AcoFolderSchemaFactory.js.map +1 -0
  7. package/createAcoGraphQL.d.ts +8 -4
  8. package/createAcoGraphQL.js +56 -96
  9. package/createAcoGraphQL.js.map +1 -1
  10. package/domain/folder/abstractions.d.ts +12 -5
  11. package/domain/folder/abstractions.js +2 -2
  12. package/domain/folder/abstractions.js.map +1 -1
  13. package/domain/folder/folder.model.js +2 -1
  14. package/domain/folder/folder.model.js.map +1 -1
  15. package/exports/api/aco/flp.d.ts +1 -0
  16. package/exports/api/aco/flp.js +1 -0
  17. package/features/ai/CreateFolderTool.d.ts +49 -0
  18. package/features/ai/CreateFolderTool.js +58 -0
  19. package/features/ai/CreateFolderTool.js.map +1 -0
  20. package/features/ai/CreateTeamTool.d.ts +48 -0
  21. package/features/ai/CreateTeamTool.js +56 -0
  22. package/features/ai/CreateTeamTool.js.map +1 -0
  23. package/features/ai/DeleteFolderTool.d.ts +48 -0
  24. package/features/ai/DeleteFolderTool.js +55 -0
  25. package/features/ai/DeleteFolderTool.js.map +1 -0
  26. package/features/ai/GrantFolderAccessTool.d.ts +77 -0
  27. package/features/ai/GrantFolderAccessTool.js +80 -0
  28. package/features/ai/GrantFolderAccessTool.js.map +1 -0
  29. package/features/ai/ListFoldersTool.d.ts +47 -0
  30. package/features/ai/ListFoldersTool.js +57 -0
  31. package/features/ai/ListFoldersTool.js.map +1 -0
  32. package/features/ai/ListRolesTool.d.ts +39 -0
  33. package/features/ai/ListRolesTool.js +48 -0
  34. package/features/ai/ListRolesTool.js.map +1 -0
  35. package/features/ai/ListTeamsTool.d.ts +39 -0
  36. package/features/ai/ListTeamsTool.js +48 -0
  37. package/features/ai/ListTeamsTool.js.map +1 -0
  38. package/features/ai/RevokeFolderAccessTool.d.ts +63 -0
  39. package/features/ai/RevokeFolderAccessTool.js +69 -0
  40. package/features/ai/RevokeFolderAccessTool.js.map +1 -0
  41. package/features/ai/assertTargetIsUsable.d.ts +10 -0
  42. package/features/ai/assertTargetIsUsable.js +14 -0
  43. package/features/ai/assertTargetIsUsable.js.map +1 -0
  44. package/features/ai/feature.d.ts +12 -0
  45. package/features/ai/feature.js +25 -0
  46. package/features/ai/feature.js.map +1 -0
  47. package/features/ai/index.d.ts +9 -0
  48. package/features/ai/index.js +9 -0
  49. package/features/ai/loadFolderPermissions.d.ts +16 -0
  50. package/features/ai/loadFolderPermissions.js +14 -0
  51. package/features/ai/loadFolderPermissions.js.map +1 -0
  52. package/features/flp/CreateFlp/CreateFlpUseCase.d.ts +3 -3
  53. package/features/flp/CreateFlp/CreateFlpUseCase.js +4 -4
  54. package/features/flp/CreateFlp/CreateFlpUseCase.js.map +1 -1
  55. package/features/flp/CreateFlp/feature.d.ts +1 -6
  56. package/features/flp/CreateFlp/feature.js +3 -2
  57. package/features/flp/CreateFlp/feature.js.map +1 -1
  58. package/features/flp/CreateFlpOnFolderCreated/CreateFlpOnFolderCreatedHandler.d.ts +8 -5
  59. package/features/flp/CreateFlpOnFolderCreated/CreateFlpOnFolderCreatedHandler.js +21 -14
  60. package/features/flp/CreateFlpOnFolderCreated/CreateFlpOnFolderCreatedHandler.js.map +1 -1
  61. package/features/flp/DeleteFlp/DeleteFlpUseCase.d.ts +3 -3
  62. package/features/flp/DeleteFlp/DeleteFlpUseCase.js +3 -3
  63. package/features/flp/DeleteFlp/DeleteFlpUseCase.js.map +1 -1
  64. package/features/flp/DeleteFlp/feature.d.ts +1 -6
  65. package/features/flp/DeleteFlp/feature.js +3 -2
  66. package/features/flp/DeleteFlp/feature.js.map +1 -1
  67. package/features/flp/DeleteFlpOnFolderDeleted/DeleteFlpOnFolderDeletedHandler.d.ts +6 -5
  68. package/features/flp/DeleteFlpOnFolderDeleted/DeleteFlpOnFolderDeletedHandler.js +16 -13
  69. package/features/flp/DeleteFlpOnFolderDeleted/DeleteFlpOnFolderDeletedHandler.js.map +1 -1
  70. package/features/flp/FolderLevelPermissions/FolderLevelPermissions.d.ts +4 -3
  71. package/features/flp/FolderLevelPermissions/FolderLevelPermissions.js +14 -13
  72. package/features/flp/FolderLevelPermissions/FolderLevelPermissions.js.map +1 -1
  73. package/features/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/GetDefaultPermissionsWithTeams.d.ts +6 -0
  74. package/features/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/GetDefaultPermissionsWithTeams.js +6 -2
  75. package/features/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/GetDefaultPermissionsWithTeams.js.map +1 -1
  76. package/features/flp/GetFlp/decorators/GetFlpWithCodeFlps.d.ts +13 -0
  77. package/features/flp/GetFlp/decorators/GetFlpWithCodeFlps.js +26 -0
  78. package/features/flp/GetFlp/decorators/GetFlpWithCodeFlps.js.map +1 -0
  79. package/features/flp/GetFlp/feature.d.ts +1 -1
  80. package/features/flp/GetFlp/feature.js +3 -2
  81. package/features/flp/GetFlp/feature.js.map +1 -1
  82. package/features/flp/ListFlps/decorators/ListFlpsWithCodeFlps.d.ts +13 -0
  83. package/features/flp/ListFlps/decorators/ListFlpsWithCodeFlps.js +27 -0
  84. package/features/flp/ListFlps/decorators/ListFlpsWithCodeFlps.js.map +1 -0
  85. package/features/flp/ListFlps/feature.d.ts +1 -1
  86. package/features/flp/ListFlps/feature.js +3 -2
  87. package/features/flp/ListFlps/feature.js.map +1 -1
  88. package/features/flp/UpdateFlp/UpdateFlpUseCase.d.ts +15 -8
  89. package/features/flp/UpdateFlp/UpdateFlpUseCase.js +37 -42
  90. package/features/flp/UpdateFlp/UpdateFlpUseCase.js.map +1 -1
  91. package/features/flp/UpdateFlp/abstractions.d.ts +6 -2
  92. package/features/flp/UpdateFlp/abstractions.js.map +1 -1
  93. package/features/flp/UpdateFlp/feature.d.ts +1 -6
  94. package/features/flp/UpdateFlp/feature.js +7 -2
  95. package/features/flp/UpdateFlp/feature.js.map +1 -1
  96. package/features/flp/UpdateFlpOnFolderUpdated/UpdateFlpOnFolderUpdatedHandler.d.ts +8 -5
  97. package/features/flp/UpdateFlpOnFolderUpdated/UpdateFlpOnFolderUpdatedHandler.js +21 -16
  98. package/features/flp/UpdateFlpOnFolderUpdated/UpdateFlpOnFolderUpdatedHandler.js.map +1 -1
  99. package/features/flp/shared/CodeFlpMerger.d.ts +26 -0
  100. package/features/flp/shared/CodeFlpMerger.js +20 -0
  101. package/features/flp/shared/CodeFlpMerger.js.map +1 -0
  102. package/features/flp/shared/CodeFlpPath.d.ts +15 -0
  103. package/features/flp/shared/CodeFlpPath.js +29 -0
  104. package/features/flp/shared/CodeFlpPath.js.map +1 -0
  105. package/features/flp/shared/CodeFlpTarget.d.ts +10 -0
  106. package/features/flp/shared/CodeFlpTarget.js +26 -0
  107. package/features/flp/shared/CodeFlpTarget.js.map +1 -0
  108. package/features/flp/shared/CodeFlpsProvider.d.ts +14 -0
  109. package/features/flp/shared/CodeFlpsProvider.js +33 -0
  110. package/features/flp/shared/CodeFlpsProvider.js.map +1 -0
  111. package/features/flp/shared/abstractions.d.ts +77 -0
  112. package/features/flp/shared/abstractions.js +19 -0
  113. package/features/flp/shared/abstractions.js.map +1 -0
  114. package/features/flp/shared/feature.d.ts +5 -0
  115. package/features/flp/shared/feature.js +17 -0
  116. package/features/flp/shared/feature.js.map +1 -0
  117. package/features/flp/shared/index.d.ts +4 -0
  118. package/features/flp/shared/index.js +4 -0
  119. package/features/folder/CreateFolder/CreateFolderRepository.d.ts +3 -3
  120. package/features/folder/CreateFolder/CreateFolderRepository.js +10 -7
  121. package/features/folder/CreateFolder/CreateFolderRepository.js.map +1 -1
  122. package/features/folder/CreateFolder/decorators/CreateFolderWithFolderLevelPermissions.d.ts +9 -1
  123. package/features/folder/CreateFolder/decorators/CreateFolderWithFolderLevelPermissions.js +20 -3
  124. package/features/folder/CreateFolder/decorators/CreateFolderWithFolderLevelPermissions.js.map +1 -1
  125. package/features/folder/DeleteFolder/DeleteFolderRepository.d.ts +3 -3
  126. package/features/folder/DeleteFolder/DeleteFolderRepository.js +6 -5
  127. package/features/folder/DeleteFolder/DeleteFolderRepository.js.map +1 -1
  128. package/features/folder/EnsureFolderIsEmpty/EnsureFolderIsEmpty.d.ts +1 -3
  129. package/features/folder/EnsureFolderIsEmpty/EnsureFolderIsEmpty.js +3 -6
  130. package/features/folder/EnsureFolderIsEmpty/EnsureFolderIsEmpty.js.map +1 -1
  131. package/features/folder/FolderModelProvider.d.ts +26 -0
  132. package/features/folder/FolderModelProvider.js +22 -0
  133. package/features/folder/FolderModelProvider.js.map +1 -0
  134. package/features/folder/GetAncestors/GetAncestorsRepository.d.ts +3 -3
  135. package/features/folder/GetAncestors/GetAncestorsRepository.js +6 -5
  136. package/features/folder/GetAncestors/GetAncestorsRepository.js.map +1 -1
  137. package/features/folder/GetFolder/GetFolderRepository.d.ts +3 -3
  138. package/features/folder/GetFolder/GetFolderRepository.js +6 -5
  139. package/features/folder/GetFolder/GetFolderRepository.js.map +1 -1
  140. package/features/folder/GetFolderHierarchy/GetFolderHierarchyRepository.d.ts +3 -3
  141. package/features/folder/GetFolderHierarchy/GetFolderHierarchyRepository.js +10 -8
  142. package/features/folder/GetFolderHierarchy/GetFolderHierarchyRepository.js.map +1 -1
  143. package/features/folder/ListFolders/ListFoldersRepository.d.ts +3 -3
  144. package/features/folder/ListFolders/ListFoldersRepository.js +8 -7
  145. package/features/folder/ListFolders/ListFoldersRepository.js.map +1 -1
  146. package/features/folder/NotifyFolderChange/NotifyFolderChangeUseCase.d.ts +11 -0
  147. package/features/folder/NotifyFolderChange/NotifyFolderChangeUseCase.js +38 -0
  148. package/features/folder/NotifyFolderChange/NotifyFolderChangeUseCase.js.map +1 -0
  149. package/features/folder/NotifyFolderChange/NotifyOnFolderDeletedHandler.d.ts +12 -0
  150. package/features/folder/NotifyFolderChange/NotifyOnFolderDeletedHandler.js +24 -0
  151. package/features/folder/NotifyFolderChange/NotifyOnFolderDeletedHandler.js.map +1 -0
  152. package/features/folder/NotifyFolderChange/abstractions.d.ts +28 -0
  153. package/features/folder/NotifyFolderChange/abstractions.js +8 -0
  154. package/features/folder/NotifyFolderChange/abstractions.js.map +1 -0
  155. package/features/folder/NotifyFolderChange/feature.d.ts +9 -0
  156. package/features/folder/NotifyFolderChange/feature.js +13 -0
  157. package/features/folder/NotifyFolderChange/feature.js.map +1 -0
  158. package/features/folder/NotifyFolderChange/index.d.ts +2 -0
  159. package/features/folder/NotifyFolderChange/index.js +2 -0
  160. package/features/folder/UpdateFolder/UpdateFolderRepository.d.ts +3 -3
  161. package/features/folder/UpdateFolder/UpdateFolderRepository.js +11 -8
  162. package/features/folder/UpdateFolder/UpdateFolderRepository.js.map +1 -1
  163. package/features/folder/UpdateFolder/decorators/UpdateFolderWithFolderLevelPermissions.d.ts +14 -1
  164. package/features/folder/UpdateFolder/decorators/UpdateFolderWithFolderLevelPermissions.js +52 -4
  165. package/features/folder/UpdateFolder/decorators/UpdateFolderWithFolderLevelPermissions.js.map +1 -1
  166. package/features/folder/shared/abstractions.d.ts +10 -0
  167. package/features/folder/shared/abstractions.js +3 -1
  168. package/features/folder/shared/abstractions.js.map +1 -1
  169. package/filter/filter.gql.d.ts +2 -3
  170. package/filter/filter.gql.js +61 -27
  171. package/filter/filter.gql.js.map +1 -1
  172. package/filter/filter.model.js +2 -1
  173. package/filter/filter.model.js.map +1 -1
  174. package/filter/filter.so.d.ts +2 -4
  175. package/filter/filter.so.js +21 -9
  176. package/filter/filter.so.js.map +1 -1
  177. package/flp/flp.types.d.ts +6 -1
  178. package/flp/tasks/createFlp.task.d.ts +11 -4
  179. package/flp/tasks/createFlp.task.js +32 -15
  180. package/flp/tasks/createFlp.task.js.map +1 -1
  181. package/flp/tasks/deleteFlp.task.d.ts +9 -4
  182. package/flp/tasks/deleteFlp.task.js +22 -13
  183. package/flp/tasks/deleteFlp.task.js.map +1 -1
  184. package/flp/tasks/index.d.ts +0 -1
  185. package/flp/tasks/index.js +1 -14
  186. package/flp/tasks/index.js.map +1 -1
  187. package/flp/tasks/syncFlp.task.d.ts +9 -4
  188. package/flp/tasks/syncFlp.task.js +22 -13
  189. package/flp/tasks/syncFlp.task.js.map +1 -1
  190. package/flp/tasks/updateFlp.task.d.ts +11 -4
  191. package/flp/tasks/updateFlp.task.js +40 -19
  192. package/flp/tasks/updateFlp.task.js.map +1 -1
  193. package/folder/createFolderTypeDefs.js +4 -1
  194. package/folder/createFolderTypeDefs.js.map +1 -1
  195. package/folder/folder.gql.d.ts +1 -1
  196. package/folder/folder.gql.js +4 -4
  197. package/folder/folder.gql.js.map +1 -1
  198. package/index.d.ts +1 -1
  199. package/index.js +1 -11
  200. package/package.json +23 -21
  201. package/types.d.ts +1 -2
  202. package/types.js.map +1 -1
  203. package/utils/createOperationsWrapper.d.ts +4 -4
  204. package/utils/createOperationsWrapper.js +5 -5
  205. package/utils/createOperationsWrapper.js.map +1 -1
  206. package/utils/decorators/CmsEntriesCrudDecorators.js +9 -5
  207. package/utils/decorators/CmsEntriesCrudDecorators.js.map +1 -1
  208. package/utils/resolve.d.ts +1 -1
  209. package/utils/resolve.js +1 -1
  210. package/utils/resolve.js.map +1 -1
  211. package/createAcoContext.d.ts +0 -3
  212. package/createAcoContext.js +0 -112
  213. package/createAcoContext.js.map +0 -1
  214. package/createAcoTasks.d.ts +0 -1
  215. package/createAcoTasks.js +0 -14
  216. package/createAcoTasks.js.map +0 -1
  217. package/index.js.map +0 -1
@@ -0,0 +1,13 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { NotifyFolderChangeUseCase } from "./NotifyFolderChangeUseCase.js";
3
+ import { NotifyOnFolderDeletedHandler } from "./NotifyOnFolderDeletedHandler.js";
4
+ const NotifyFolderChangeFeature = createFeature({
5
+ name: "NotifyFolderChange",
6
+ register (container) {
7
+ container.register(NotifyFolderChangeUseCase);
8
+ container.register(NotifyOnFolderDeletedHandler);
9
+ }
10
+ });
11
+ export { NotifyFolderChangeFeature };
12
+
13
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/folder/NotifyFolderChange/feature.js","sources":["../../../../src/features/folder/NotifyFolderChange/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { NotifyFolderChangeUseCase } from \"./NotifyFolderChangeUseCase.js\";\nimport { NotifyOnFolderDeletedHandler } from \"./NotifyOnFolderDeletedHandler.js\";\n\n/**\n * Tells the user's open admin tabs when a folder is created, updated or deleted. The FLP tasks send\n * created and updated (see `CreateFlpOnFolderCreated` and `UpdateFlpOnFolderUpdated`); deleted goes\n * out from here.\n */\nexport const NotifyFolderChangeFeature = createFeature({\n name: \"NotifyFolderChange\",\n register(container) {\n container.register(NotifyFolderChangeUseCase);\n container.register(NotifyOnFolderDeletedHandler);\n }\n});\n"],"names":["NotifyFolderChangeFeature","createFeature","container","NotifyFolderChangeUseCase","NotifyOnFolderDeletedHandler"],"mappings":";;;AASO,MAAMA,4BAA4BC,cAAc;IACnD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;IACvB;AACJ"}
@@ -0,0 +1,2 @@
1
+ export { NotifyFolderChangeFeature } from "./feature.js";
2
+ export { NotifyFolderChangeUseCase, FOLDER_CREATED_WEBSOCKET_ACTION, FOLDER_UPDATED_WEBSOCKET_ACTION, FOLDER_DELETED_WEBSOCKET_ACTION } from "./abstractions.js";
@@ -0,0 +1,2 @@
1
+ export { NotifyFolderChangeFeature } from "./feature.js";
2
+ export { FOLDER_CREATED_WEBSOCKET_ACTION, FOLDER_DELETED_WEBSOCKET_ACTION, FOLDER_UPDATED_WEBSOCKET_ACTION, NotifyFolderChangeUseCase } from "./abstractions.js";
@@ -3,14 +3,14 @@ import { type IUpdateFolderRepository, UpdateFolderRepository as RepositoryAbstr
3
3
  import { UpdateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntry";
4
4
  import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById";
5
5
  import { ListLatestEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries";
6
- import { FolderModel } from "../../../domain/folder/abstractions.js";
6
+ import { FolderModelProvider } from "../../../domain/folder/abstractions.js";
7
7
  import type { Folder, UpdateFolderParams } from "../../../folder/folder.types.js";
8
8
  declare class UpdateFolderRepositoryImpl implements IUpdateFolderRepository {
9
9
  private updateEntry;
10
10
  private getEntryById;
11
11
  private listLatestEntries;
12
- private folderModel;
13
- constructor(updateEntry: UpdateEntryUseCase.Interface, getEntryById: GetEntryByIdUseCase.Interface, listLatestEntries: ListLatestEntriesUseCase.Interface, folderModel: FolderModel.Interface);
12
+ private folderModelProvider;
13
+ constructor(updateEntry: UpdateEntryUseCase.Interface, getEntryById: GetEntryByIdUseCase.Interface, listLatestEntries: ListLatestEntriesUseCase.Interface, folderModelProvider: FolderModelProvider.Interface);
14
14
  execute(id: string, data: UpdateFolderParams): Promise<Result<Folder, RepositoryAbstraction.Error>>;
15
15
  private checkExistingFolder;
16
16
  private createFolderPath;
@@ -3,21 +3,22 @@ import { UpdateFolderRepository } from "./abstractions.js";
3
3
  import { UpdateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntry";
4
4
  import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById";
5
5
  import { ListLatestEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries";
6
- import { FolderModel } from "../../../domain/folder/abstractions.js";
6
+ import { FolderModelProvider } from "../../../domain/folder/abstractions.js";
7
7
  import { EntryToFolderMapper } from "../shared/EntryToFolderMapper.js";
8
8
  import { FolderPersistenceError, FolderValidationError } from "../../../domain/folder/errors.js";
9
9
  import { Path } from "../../../utils/Path.js";
10
10
  import { EntryId } from "@webiny/api-headless-cms/exports/api/cms/entry.js";
11
11
  class UpdateFolderRepositoryImpl {
12
- constructor(updateEntry, getEntryById, listLatestEntries, folderModel){
12
+ constructor(updateEntry, getEntryById, listLatestEntries, folderModelProvider){
13
13
  this.updateEntry = updateEntry;
14
14
  this.getEntryById = getEntryById;
15
15
  this.listLatestEntries = listLatestEntries;
16
- this.folderModel = folderModel;
16
+ this.folderModelProvider = folderModelProvider;
17
17
  }
18
18
  async execute(id, data) {
19
+ const folderModel = await this.folderModelProvider.get();
19
20
  const entryId = EntryId.from(id);
20
- const originalResult = await this.getEntryById.execute(this.folderModel, entryId.toString());
21
+ const originalResult = await this.getEntryById.execute(folderModel, entryId.toString());
21
22
  if (originalResult.isFail()) return Result.fail(new FolderPersistenceError(originalResult.error));
22
23
  const original = EntryToFolderMapper.toFolder(originalResult.value);
23
24
  const checkResult = await this.checkExistingFolder({
@@ -32,7 +33,7 @@ class UpdateFolderRepositoryImpl {
32
33
  parentId: void 0 !== data.parentId ? data.parentId : original.parentId
33
34
  });
34
35
  if (pathResult.isFail()) return Result.fail(pathResult.error);
35
- const result = await this.updateEntry.execute(this.folderModel, entryId.toString(), {
36
+ const result = await this.updateEntry.execute(folderModel, entryId.toString(), {
36
37
  values: {
37
38
  ...data,
38
39
  path: pathResult.value
@@ -43,8 +44,9 @@ class UpdateFolderRepositoryImpl {
43
44
  return Result.ok(updatedFolder);
44
45
  }
45
46
  async checkExistingFolder(params) {
47
+ const folderModel = await this.folderModelProvider.get();
46
48
  const { id, type, slug, parentId } = params;
47
- const result = await this.listLatestEntries.execute(this.folderModel, {
49
+ const result = await this.listLatestEntries.execute(folderModel, {
48
50
  where: {
49
51
  latest: true,
50
52
  entryId_not: id,
@@ -62,9 +64,10 @@ class UpdateFolderRepositoryImpl {
62
64
  return Result.ok();
63
65
  }
64
66
  async createFolderPath(params) {
67
+ const folderModel = await this.folderModelProvider.get();
65
68
  const { slug, parentId } = params;
66
69
  if (!parentId) return Result.ok(Path.create(slug));
67
- const parentResult = await this.getEntryById.execute(this.folderModel, EntryId.from(parentId).toString());
70
+ const parentResult = await this.getEntryById.execute(folderModel, EntryId.from(parentId).toString());
68
71
  if (parentResult.isFail()) return Result.fail(new FolderPersistenceError(new Error("Parent folder not found. Unable to create the folder path")));
69
72
  const parentFolder = EntryToFolderMapper.toFolder(parentResult.value);
70
73
  return Result.ok(Path.create(slug, parentFolder.path));
@@ -76,7 +79,7 @@ const UpdateFolderRepository_UpdateFolderRepository = UpdateFolderRepository.cre
76
79
  UpdateEntryUseCase,
77
80
  GetEntryByIdUseCase,
78
81
  ListLatestEntriesUseCase,
79
- FolderModel
82
+ FolderModelProvider
80
83
  ]
81
84
  });
82
85
  export { UpdateFolderRepository_UpdateFolderRepository as UpdateFolderRepository };
@@ -1 +1 @@
1
- {"version":3,"file":"features/folder/UpdateFolder/UpdateFolderRepository.js","sources":["../../../../src/features/folder/UpdateFolder/UpdateFolderRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n type IUpdateFolderRepository,\n UpdateFolderRepository as RepositoryAbstraction\n} from \"./abstractions.js\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries\";\nimport { FolderModel } from \"~/domain/folder/abstractions.js\";\nimport type { CmsEntryFolder, Folder, UpdateFolderParams } from \"~/folder/folder.types.js\";\nimport { EntryToFolderMapper } from \"../shared/EntryToFolderMapper.js\";\nimport { FolderPersistenceError, FolderValidationError } from \"~/domain/folder/errors.js\";\nimport { Path } from \"~/utils/Path.js\";\nimport { EntryId } from \"@webiny/api-headless-cms/exports/api/cms/entry.js\";\n\nclass UpdateFolderRepositoryImpl implements IUpdateFolderRepository {\n constructor(\n private updateEntry: UpdateEntryUseCase.Interface,\n private getEntryById: GetEntryByIdUseCase.Interface,\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private folderModel: FolderModel.Interface\n ) {}\n\n async execute(\n id: string,\n data: UpdateFolderParams\n ): Promise<Result<Folder, RepositoryAbstraction.Error>> {\n const entryId = EntryId.from(id);\n\n // Get the original folder\n const originalResult = await this.getEntryById.execute<CmsEntryFolder>(\n this.folderModel,\n entryId.toString()\n );\n\n if (originalResult.isFail()) {\n return Result.fail(new FolderPersistenceError(originalResult.error));\n }\n\n const original = EntryToFolderMapper.toFolder(originalResult.value);\n\n // Check if folder with new slug already exists\n const checkResult = await this.checkExistingFolder({\n id,\n type: original.type,\n slug: data.slug || original.slug,\n parentId: data.parentId !== undefined ? data.parentId : original.parentId\n });\n\n if (checkResult.isFail()) {\n return Result.fail(checkResult.error);\n }\n\n // Create new path if slug or parentId changed\n const pathResult = await this.createFolderPath({\n slug: data.slug || original.slug,\n parentId: data.parentId !== undefined ? data.parentId : original.parentId\n });\n\n if (pathResult.isFail()) {\n return Result.fail(pathResult.error);\n }\n\n const result = await this.updateEntry.execute<CmsEntryFolder>(\n this.folderModel,\n entryId.toString(),\n {\n values: {\n ...data,\n path: pathResult.value\n }\n }\n );\n\n if (result.isFail()) {\n return Result.fail(new FolderPersistenceError(result.error));\n }\n\n const updatedFolder = EntryToFolderMapper.toFolder(result.value);\n return Result.ok(updatedFolder);\n }\n\n private async checkExistingFolder(params: {\n id: string;\n type: string;\n slug: string;\n parentId?: string | null;\n }): Promise<Result<void, RepositoryAbstraction.Error>> {\n const { id, type, slug, parentId } = params;\n\n const result = await this.listLatestEntries.execute<CmsEntryFolder>(this.folderModel, {\n where: {\n latest: true,\n entryId_not: id,\n values: {\n type,\n slug,\n parentId\n }\n },\n limit: 1\n });\n\n if (result.isFail()) {\n return Result.fail(new FolderPersistenceError(result.error));\n }\n\n const { entries } = result.value;\n\n if (entries.length > 0) {\n return Result.fail(\n new FolderValidationError(\n `Folder with slug \"${slug}\" already exists at this level.`\n )\n );\n }\n\n return Result.ok();\n }\n\n private async createFolderPath(params: {\n slug: string;\n parentId?: string | null;\n }): Promise<Result<string, RepositoryAbstraction.Error>> {\n const { slug, parentId } = params;\n\n if (!parentId) {\n return Result.ok(Path.create(slug));\n }\n\n const parentResult = await this.getEntryById.execute<CmsEntryFolder>(\n this.folderModel,\n EntryId.from(parentId).toString()\n );\n\n if (parentResult.isFail()) {\n return Result.fail(\n new FolderPersistenceError(\n new Error(\"Parent folder not found. Unable to create the folder path\")\n )\n );\n }\n\n const parentFolder = EntryToFolderMapper.toFolder(parentResult.value);\n return Result.ok(Path.create(slug, parentFolder.path));\n }\n}\n\nexport const UpdateFolderRepository = RepositoryAbstraction.createImplementation({\n implementation: UpdateFolderRepositoryImpl,\n dependencies: [UpdateEntryUseCase, GetEntryByIdUseCase, ListLatestEntriesUseCase, FolderModel]\n});\n"],"names":["UpdateFolderRepositoryImpl","updateEntry","getEntryById","listLatestEntries","folderModel","id","data","entryId","EntryId","originalResult","Result","FolderPersistenceError","original","EntryToFolderMapper","checkResult","undefined","pathResult","result","updatedFolder","params","type","slug","parentId","entries","FolderValidationError","Path","parentResult","Error","parentFolder","UpdateFolderRepository","RepositoryAbstraction","UpdateEntryUseCase","GetEntryByIdUseCase","ListLatestEntriesUseCase","FolderModel"],"mappings":"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"}
1
+ {"version":3,"file":"features/folder/UpdateFolder/UpdateFolderRepository.js","sources":["../../../../src/features/folder/UpdateFolder/UpdateFolderRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n type IUpdateFolderRepository,\n UpdateFolderRepository as RepositoryAbstraction\n} from \"./abstractions.js\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries\";\nimport { FolderModelProvider } from \"~/domain/folder/abstractions.js\";\nimport type { CmsEntryFolder, Folder, UpdateFolderParams } from \"~/folder/folder.types.js\";\nimport { EntryToFolderMapper } from \"../shared/EntryToFolderMapper.js\";\nimport { FolderPersistenceError, FolderValidationError } from \"~/domain/folder/errors.js\";\nimport { Path } from \"~/utils/Path.js\";\nimport { EntryId } from \"@webiny/api-headless-cms/exports/api/cms/entry.js\";\n\nclass UpdateFolderRepositoryImpl implements IUpdateFolderRepository {\n constructor(\n private updateEntry: UpdateEntryUseCase.Interface,\n private getEntryById: GetEntryByIdUseCase.Interface,\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private folderModelProvider: FolderModelProvider.Interface\n ) {}\n\n async execute(\n id: string,\n data: UpdateFolderParams\n ): Promise<Result<Folder, RepositoryAbstraction.Error>> {\n const folderModel = await this.folderModelProvider.get();\n const entryId = EntryId.from(id);\n\n // Get the original folder\n const originalResult = await this.getEntryById.execute<CmsEntryFolder>(\n folderModel,\n entryId.toString()\n );\n\n if (originalResult.isFail()) {\n return Result.fail(new FolderPersistenceError(originalResult.error));\n }\n\n const original = EntryToFolderMapper.toFolder(originalResult.value);\n\n // Check if folder with new slug already exists\n const checkResult = await this.checkExistingFolder({\n id,\n type: original.type,\n slug: data.slug || original.slug,\n parentId: data.parentId !== undefined ? data.parentId : original.parentId\n });\n\n if (checkResult.isFail()) {\n return Result.fail(checkResult.error);\n }\n\n // Create new path if slug or parentId changed\n const pathResult = await this.createFolderPath({\n slug: data.slug || original.slug,\n parentId: data.parentId !== undefined ? data.parentId : original.parentId\n });\n\n if (pathResult.isFail()) {\n return Result.fail(pathResult.error);\n }\n\n const result = await this.updateEntry.execute<CmsEntryFolder>(\n folderModel,\n entryId.toString(),\n {\n values: {\n ...data,\n path: pathResult.value\n }\n }\n );\n\n if (result.isFail()) {\n return Result.fail(new FolderPersistenceError(result.error));\n }\n\n const updatedFolder = EntryToFolderMapper.toFolder(result.value);\n return Result.ok(updatedFolder);\n }\n\n private async checkExistingFolder(params: {\n id: string;\n type: string;\n slug: string;\n parentId?: string | null;\n }): Promise<Result<void, RepositoryAbstraction.Error>> {\n const folderModel = await this.folderModelProvider.get();\n const { id, type, slug, parentId } = params;\n\n const result = await this.listLatestEntries.execute<CmsEntryFolder>(folderModel, {\n where: {\n latest: true,\n entryId_not: id,\n values: {\n type,\n slug,\n parentId\n }\n },\n limit: 1\n });\n\n if (result.isFail()) {\n return Result.fail(new FolderPersistenceError(result.error));\n }\n\n const { entries } = result.value;\n\n if (entries.length > 0) {\n return Result.fail(\n new FolderValidationError(\n `Folder with slug \"${slug}\" already exists at this level.`\n )\n );\n }\n\n return Result.ok();\n }\n\n private async createFolderPath(params: {\n slug: string;\n parentId?: string | null;\n }): Promise<Result<string, RepositoryAbstraction.Error>> {\n const folderModel = await this.folderModelProvider.get();\n const { slug, parentId } = params;\n\n if (!parentId) {\n return Result.ok(Path.create(slug));\n }\n\n const parentResult = await this.getEntryById.execute<CmsEntryFolder>(\n folderModel,\n EntryId.from(parentId).toString()\n );\n\n if (parentResult.isFail()) {\n return Result.fail(\n new FolderPersistenceError(\n new Error(\"Parent folder not found. Unable to create the folder path\")\n )\n );\n }\n\n const parentFolder = EntryToFolderMapper.toFolder(parentResult.value);\n return Result.ok(Path.create(slug, parentFolder.path));\n }\n}\n\nexport const UpdateFolderRepository = RepositoryAbstraction.createImplementation({\n implementation: UpdateFolderRepositoryImpl,\n dependencies: [\n UpdateEntryUseCase,\n GetEntryByIdUseCase,\n ListLatestEntriesUseCase,\n FolderModelProvider\n ]\n});\n"],"names":["UpdateFolderRepositoryImpl","updateEntry","getEntryById","listLatestEntries","folderModelProvider","id","data","folderModel","entryId","EntryId","originalResult","Result","FolderPersistenceError","original","EntryToFolderMapper","checkResult","undefined","pathResult","result","updatedFolder","params","type","slug","parentId","entries","FolderValidationError","Path","parentResult","Error","parentFolder","UpdateFolderRepository","RepositoryAbstraction","UpdateEntryUseCase","GetEntryByIdUseCase","ListLatestEntriesUseCase","FolderModelProvider"],"mappings":"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"}
@@ -2,12 +2,25 @@ import type { UpdateFolderParams } from "../../../../folder/folder.types.js";
2
2
  import { FolderLevelPermissions } from "../../../../features/flp/FolderLevelPermissions/index.js";
3
3
  import { UpdateFolderUseCase } from "../abstractions.js";
4
4
  import { GetFolderUseCase } from "../../../../features/folder/GetFolder/index.js";
5
+ import { CodeFlpsProvider } from "../../../../features/flp/shared/index.js";
5
6
  declare class UpdateFolderWithFolderLevelPermissionsImpl implements UpdateFolderUseCase.Interface {
6
7
  private getFolder;
7
8
  private folderLevelPermissions;
8
9
  private readonly decoretee;
9
- constructor(getFolder: GetFolderUseCase.Interface, folderLevelPermissions: FolderLevelPermissions.Interface, decoretee: UpdateFolderUseCase.Interface);
10
+ private readonly codeFlpsProvider?;
11
+ constructor(getFolder: GetFolderUseCase.Interface, folderLevelPermissions: FolderLevelPermissions.Interface, codeFlpsProvider: CodeFlpsProvider.Interface | undefined, decoretee: UpdateFolderUseCase.Interface);
10
12
  execute(id: string, params: UpdateFolderParams): UpdateFolderUseCase.Return;
13
+ /**
14
+ * The type and path the folder will have after this update, computed the same way
15
+ * `UpdateFolderRepository` computes them: the submitted slug and parent, falling back to the
16
+ * current ones.
17
+ */
18
+ private getTargetFolder;
19
+ /**
20
+ * Code-defined permissions are resolved from the folder's own type and path rather than the FLP
21
+ * catalog, so they apply even when the stored record is missing or not yet written.
22
+ */
23
+ private withCodePermissions;
11
24
  }
12
25
  export declare const UpdateFolderWithFolderLevelPermissions: typeof UpdateFolderWithFolderLevelPermissionsImpl;
13
26
  export {};
@@ -3,10 +3,13 @@ import { FolderLevelPermissions } from "../../../flp/FolderLevelPermissions/inde
3
3
  import { UpdateFolderUseCase } from "../abstractions.js";
4
4
  import { GetFolderUseCase } from "../../GetFolder/index.js";
5
5
  import { FolderCannotMoveToNewParent, FolderValidationError } from "../../../../domain/folder/errors.js";
6
+ import { CodeFlpMerger, CodeFlpsProvider } from "../../../flp/shared/index.js";
7
+ import { Path } from "../../../../utils/Path.js";
6
8
  class UpdateFolderWithFolderLevelPermissionsImpl {
7
- constructor(getFolder, folderLevelPermissions, decoretee){
9
+ constructor(getFolder, folderLevelPermissions, codeFlpsProvider, decoretee){
8
10
  this.getFolder = getFolder;
9
11
  this.folderLevelPermissions = folderLevelPermissions;
12
+ this.codeFlpsProvider = codeFlpsProvider;
10
13
  this.decoretee = decoretee;
11
14
  }
12
15
  async execute(id, params) {
@@ -18,7 +21,9 @@ class UpdateFolderWithFolderLevelPermissionsImpl {
18
21
  permissions: originalPermissions,
19
22
  rwd: "w"
20
23
  });
21
- const permissions = await this.folderLevelPermissions.getDefaultPermissions(params.permissions ?? []);
24
+ const targetFolder = await this.getTargetFolder(original, params);
25
+ const submittedPermissions = await this.withCodePermissions(targetFolder, params.permissions ?? []);
26
+ const permissions = await this.folderLevelPermissions.getDefaultPermissions(submittedPermissions);
22
27
  const stillHasAccess = await this.folderLevelPermissions.canAccessFolder({
23
28
  permissions,
24
29
  rwd: "w"
@@ -28,6 +33,7 @@ class UpdateFolderWithFolderLevelPermissionsImpl {
28
33
  const targetIsValid = permission.target.startsWith("admin:") || permission.target.startsWith("team:");
29
34
  if (!targetIsValid) return Result.fail(new FolderValidationError(`Permission target "${permission.target}" is not valid.`));
30
35
  if (permission.inheritedFrom) return Result.fail(new FolderValidationError('Permission "inheritedFrom" cannot be set manually.'));
36
+ if (permission.plugin) return Result.fail(new FolderValidationError('Permission "plugin" cannot be set manually. Code-defined permissions are managed via an "FlpFactory".'));
31
37
  }
32
38
  if (params.parentId && params.parentId !== original.parentId) {
33
39
  const parentPermissions = await this.folderLevelPermissions.getFolderLevelPermissions(params.parentId);
@@ -39,18 +45,60 @@ class UpdateFolderWithFolderLevelPermissionsImpl {
39
45
  }
40
46
  const result = await this.decoretee.execute(id, params);
41
47
  if (result.isFail()) return Result.fail(result.error);
48
+ const updatedPermissions = await this.withCodePermissions(result.value, params.permissions ?? []);
49
+ const updatedPermissionsWithDefaults = await this.folderLevelPermissions.getDefaultPermissions(updatedPermissions);
42
50
  return Result.ok({
43
51
  ...result.value,
44
- permissions
52
+ permissions: updatedPermissionsWithDefaults
45
53
  });
46
54
  }
55
+ async getTargetFolder(original, params) {
56
+ const slug = params.slug || original.slug;
57
+ const parentId = void 0 !== params.parentId ? params.parentId : original.parentId;
58
+ if (parentId === original.parentId) {
59
+ const parentPath = original.path.slice(0, -(original.slug.length + 1));
60
+ const path = Path.create(slug, parentPath);
61
+ return {
62
+ type: original.type,
63
+ path
64
+ };
65
+ }
66
+ if (!parentId) {
67
+ const path = Path.create(slug);
68
+ return {
69
+ type: original.type,
70
+ path
71
+ };
72
+ }
73
+ const parentResult = await this.getFolder.execute(parentId);
74
+ if (parentResult.isFail()) return original;
75
+ const path = Path.create(slug, parentResult.value.path);
76
+ return {
77
+ type: original.type,
78
+ path
79
+ };
80
+ }
81
+ async withCodePermissions(folder, permissions) {
82
+ if (!this.codeFlpsProvider) return permissions;
83
+ const codePermissions = await this.codeFlpsProvider.getPermissions({
84
+ type: folder.type,
85
+ path: folder.path
86
+ });
87
+ return CodeFlpMerger.mergePermissions(permissions, codePermissions);
88
+ }
47
89
  }
48
90
  const UpdateFolderWithFolderLevelPermissions = createDecorator({
49
91
  abstraction: UpdateFolderUseCase,
50
92
  decorator: UpdateFolderWithFolderLevelPermissionsImpl,
51
93
  dependencies: [
52
94
  GetFolderUseCase,
53
- FolderLevelPermissions
95
+ FolderLevelPermissions,
96
+ [
97
+ CodeFlpsProvider,
98
+ {
99
+ optional: true
100
+ }
101
+ ]
54
102
  ]
55
103
  });
56
104
  export { UpdateFolderWithFolderLevelPermissions };
@@ -1 +1 @@
1
- {"version":3,"file":"features/folder/UpdateFolder/decorators/UpdateFolderWithFolderLevelPermissions.js","sources":["../../../../../src/features/folder/UpdateFolder/decorators/UpdateFolderWithFolderLevelPermissions.ts"],"sourcesContent":["import { createDecorator, Result } from \"@webiny/feature/api\";\nimport type { UpdateFolderParams } from \"~/folder/folder.types.js\";\nimport { FolderLevelPermissions } from \"~/features/flp/FolderLevelPermissions/index.js\";\nimport { UpdateFolderUseCase } from \"../abstractions.js\";\nimport { GetFolderUseCase } from \"~/features/folder/GetFolder/index.js\";\nimport { FolderCannotMoveToNewParent, FolderValidationError } from \"~/domain/folder/errors.js\";\n\nclass UpdateFolderWithFolderLevelPermissionsImpl implements UpdateFolderUseCase.Interface {\n private folderLevelPermissions: FolderLevelPermissions.Interface;\n private readonly decoretee: UpdateFolderUseCase.Interface;\n\n constructor(\n private getFolder: GetFolderUseCase.Interface,\n folderLevelPermissions: FolderLevelPermissions.Interface,\n decoretee: UpdateFolderUseCase.Interface\n ) {\n this.folderLevelPermissions = folderLevelPermissions;\n this.decoretee = decoretee;\n }\n\n async execute(id: string, params: UpdateFolderParams): UpdateFolderUseCase.Return {\n const originalResult = await this.getFolder.execute(id);\n\n if (originalResult.isFail()) {\n return Result.fail(originalResult.error);\n }\n\n const original = originalResult.value;\n\n const originalPermissions = await this.folderLevelPermissions.getFolderLevelPermissions(id);\n\n // Let's ensure current identity's permission allows the update operation.\n await this.folderLevelPermissions.ensureCanAccessFolder({\n permissions: originalPermissions,\n rwd: \"w\"\n });\n\n const permissions = await this.folderLevelPermissions.getDefaultPermissions(\n params.permissions ?? []\n );\n\n // Check if the user still has access to the folder with the provided permissions.\n const stillHasAccess = await this.folderLevelPermissions.canAccessFolder({\n permissions,\n rwd: \"w\"\n });\n\n if (!stillHasAccess) {\n return Result.fail(\n new FolderValidationError(\n `Cannot continue because you would loose access to this folder.`\n )\n );\n }\n\n // Validate data.\n if (Array.isArray(params.permissions)) {\n for (const permission of params.permissions) {\n const targetIsValid =\n permission.target.startsWith(\"admin:\") || permission.target.startsWith(\"team:\");\n if (!targetIsValid) {\n return Result.fail(\n new FolderValidationError(\n `Permission target \"${permission.target}\" is not valid.`\n )\n );\n }\n\n if (permission.inheritedFrom) {\n return Result.fail(\n new FolderValidationError(\n `Permission \"inheritedFrom\" cannot be set manually.`\n )\n );\n }\n }\n }\n\n // Parent change is not allowed if the user doesn't have access to the new parent.\n if (params.parentId && params.parentId !== original.parentId) {\n // Getting the parent folder permissions will throw an error if the user doesn't have access.\n const parentPermissions = await this.folderLevelPermissions.getFolderLevelPermissions(\n params.parentId\n );\n\n const canAccessFolder = await this.folderLevelPermissions.canAccessFolder({\n permissions: parentPermissions,\n rwd: \"w\"\n });\n\n if (!canAccessFolder) {\n return Result.fail(new FolderCannotMoveToNewParent());\n }\n }\n\n const result = await this.decoretee.execute(id, params);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n return Result.ok({\n ...result.value,\n permissions\n });\n }\n}\n\nexport const UpdateFolderWithFolderLevelPermissions = createDecorator({\n abstraction: UpdateFolderUseCase,\n decorator: UpdateFolderWithFolderLevelPermissionsImpl,\n dependencies: [GetFolderUseCase, FolderLevelPermissions]\n});\n"],"names":["UpdateFolderWithFolderLevelPermissionsImpl","getFolder","folderLevelPermissions","decoretee","id","params","originalResult","Result","original","originalPermissions","permissions","stillHasAccess","FolderValidationError","Array","permission","targetIsValid","parentPermissions","canAccessFolder","FolderCannotMoveToNewParent","result","UpdateFolderWithFolderLevelPermissions","createDecorator","UpdateFolderUseCase","GetFolderUseCase","FolderLevelPermissions"],"mappings":";;;;;AAOA,MAAMA;IAIF,YACYC,SAAqC,EAC7CC,sBAAwD,EACxDC,SAAwC,CAC1C;aAHUF,SAAS,GAATA;QAIR,IAAI,CAAC,sBAAsB,GAAGC;QAC9B,IAAI,CAAC,SAAS,GAAGC;IACrB;IAEA,MAAM,QAAQC,EAAU,EAAEC,MAA0B,EAA8B;QAC9E,MAAMC,iBAAiB,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAACF;QAEpD,IAAIE,eAAe,MAAM,IACrB,OAAOC,OAAO,IAAI,CAACD,eAAe,KAAK;QAG3C,MAAME,WAAWF,eAAe,KAAK;QAErC,MAAMG,sBAAsB,MAAM,IAAI,CAAC,sBAAsB,CAAC,yBAAyB,CAACL;QAGxF,MAAM,IAAI,CAAC,sBAAsB,CAAC,qBAAqB,CAAC;YACpD,aAAaK;YACb,KAAK;QACT;QAEA,MAAMC,cAAc,MAAM,IAAI,CAAC,sBAAsB,CAAC,qBAAqB,CACvEL,OAAO,WAAW,IAAI,EAAE;QAI5B,MAAMM,iBAAiB,MAAM,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC;YACrED;YACA,KAAK;QACT;QAEA,IAAI,CAACC,gBACD,OAAOJ,OAAO,IAAI,CACd,IAAIK,sBACA;QAMZ,IAAIC,MAAM,OAAO,CAACR,OAAO,WAAW,GAChC,KAAK,MAAMS,cAAcT,OAAO,WAAW,CAAE;YACzC,MAAMU,gBACFD,WAAW,MAAM,CAAC,UAAU,CAAC,aAAaA,WAAW,MAAM,CAAC,UAAU,CAAC;YAC3E,IAAI,CAACC,eACD,OAAOR,OAAO,IAAI,CACd,IAAIK,sBACA,CAAC,mBAAmB,EAAEE,WAAW,MAAM,CAAC,eAAe,CAAC;YAKpE,IAAIA,WAAW,aAAa,EACxB,OAAOP,OAAO,IAAI,CACd,IAAIK,sBACA;QAIhB;QAIJ,IAAIP,OAAO,QAAQ,IAAIA,OAAO,QAAQ,KAAKG,SAAS,QAAQ,EAAE;YAE1D,MAAMQ,oBAAoB,MAAM,IAAI,CAAC,sBAAsB,CAAC,yBAAyB,CACjFX,OAAO,QAAQ;YAGnB,MAAMY,kBAAkB,MAAM,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC;gBACtE,aAAaD;gBACb,KAAK;YACT;YAEA,IAAI,CAACC,iBACD,OAAOV,OAAO,IAAI,CAAC,IAAIW;QAE/B;QAEA,MAAMC,SAAS,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAACf,IAAIC;QAEhD,IAAIc,OAAO,MAAM,IACb,OAAOZ,OAAO,IAAI,CAACY,OAAO,KAAK;QAGnC,OAAOZ,OAAO,EAAE,CAAC;YACb,GAAGY,OAAO,KAAK;YACfT;QACJ;IACJ;AACJ;AAEO,MAAMU,yCAAyCC,gBAAgB;IAClE,aAAaC;IACb,WAAWtB;IACX,cAAc;QAACuB;QAAkBC;KAAuB;AAC5D"}
1
+ {"version":3,"file":"features/folder/UpdateFolder/decorators/UpdateFolderWithFolderLevelPermissions.js","sources":["../../../../../src/features/folder/UpdateFolder/decorators/UpdateFolderWithFolderLevelPermissions.ts"],"sourcesContent":["import { createDecorator, Result } from \"@webiny/feature/api\";\nimport type { Folder } from \"~/folder/folder.types.js\";\nimport type { UpdateFolderParams } from \"~/folder/folder.types.js\";\nimport type { FolderPermission } from \"~/flp/flp.types.js\";\nimport { FolderLevelPermissions } from \"~/features/flp/FolderLevelPermissions/index.js\";\nimport { UpdateFolderUseCase } from \"../abstractions.js\";\nimport { GetFolderUseCase } from \"~/features/folder/GetFolder/index.js\";\nimport { FolderCannotMoveToNewParent, FolderValidationError } from \"~/domain/folder/errors.js\";\nimport { CodeFlpMerger } from \"~/features/flp/shared/index.js\";\nimport { CodeFlpsProvider } from \"~/features/flp/shared/index.js\";\nimport { Path } from \"~/utils/Path.js\";\n\nclass UpdateFolderWithFolderLevelPermissionsImpl implements UpdateFolderUseCase.Interface {\n private folderLevelPermissions: FolderLevelPermissions.Interface;\n private readonly decoretee: UpdateFolderUseCase.Interface;\n private readonly codeFlpsProvider?: CodeFlpsProvider.Interface;\n\n constructor(\n private getFolder: GetFolderUseCase.Interface,\n folderLevelPermissions: FolderLevelPermissions.Interface,\n codeFlpsProvider: CodeFlpsProvider.Interface | undefined,\n decoretee: UpdateFolderUseCase.Interface\n ) {\n this.folderLevelPermissions = folderLevelPermissions;\n this.codeFlpsProvider = codeFlpsProvider;\n this.decoretee = decoretee;\n }\n\n async execute(id: string, params: UpdateFolderParams): UpdateFolderUseCase.Return {\n const originalResult = await this.getFolder.execute(id);\n\n if (originalResult.isFail()) {\n return Result.fail(originalResult.error);\n }\n\n const original = originalResult.value;\n\n const originalPermissions = await this.folderLevelPermissions.getFolderLevelPermissions(id);\n\n // Let's ensure current identity's permission allows the update operation.\n await this.folderLevelPermissions.ensureCanAccessFolder({\n permissions: originalPermissions,\n rwd: \"w\"\n });\n\n // The guard below asks whether the user keeps access once the update is saved. A new slug or\n // a new parent changes the path, and code-defined rules match on the path, so resolve them\n // against where the folder is going rather than where it is now.\n const targetFolder = await this.getTargetFolder(original, params);\n\n const submittedPermissions = await this.withCodePermissions(\n targetFolder,\n params.permissions ?? []\n );\n\n const permissions =\n await this.folderLevelPermissions.getDefaultPermissions(submittedPermissions);\n\n // Check if the user still has access to the folder with the provided permissions.\n const stillHasAccess = await this.folderLevelPermissions.canAccessFolder({\n permissions,\n rwd: \"w\"\n });\n\n if (!stillHasAccess) {\n return Result.fail(\n new FolderValidationError(\n `Cannot continue because you would loose access to this folder.`\n )\n );\n }\n\n // Validate data.\n if (Array.isArray(params.permissions)) {\n for (const permission of params.permissions) {\n const targetIsValid =\n permission.target.startsWith(\"admin:\") || permission.target.startsWith(\"team:\");\n if (!targetIsValid) {\n return Result.fail(\n new FolderValidationError(\n `Permission target \"${permission.target}\" is not valid.`\n )\n );\n }\n\n if (permission.inheritedFrom) {\n return Result.fail(\n new FolderValidationError(\n `Permission \"inheritedFrom\" cannot be set manually.`\n )\n );\n }\n\n if (permission.plugin) {\n return Result.fail(\n new FolderValidationError(\n `Permission \"plugin\" cannot be set manually. Code-defined permissions are managed via an \"FlpFactory\".`\n )\n );\n }\n }\n }\n\n // Parent change is not allowed if the user doesn't have access to the new parent.\n if (params.parentId && params.parentId !== original.parentId) {\n // Getting the parent folder permissions will throw an error if the user doesn't have access.\n const parentPermissions = await this.folderLevelPermissions.getFolderLevelPermissions(\n params.parentId\n );\n\n const canAccessFolder = await this.folderLevelPermissions.canAccessFolder({\n permissions: parentPermissions,\n rwd: \"w\"\n });\n\n if (!canAccessFolder) {\n return Result.fail(new FolderCannotMoveToNewParent());\n }\n }\n\n const result = await this.decoretee.execute(id, params);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n // Resolved again against the updated folder: a rename or a move changes the path, and with\n // it which code-defined rules apply.\n const updatedPermissions = await this.withCodePermissions(\n result.value,\n params.permissions ?? []\n );\n\n const updatedPermissionsWithDefaults =\n await this.folderLevelPermissions.getDefaultPermissions(updatedPermissions);\n\n return Result.ok({\n ...result.value,\n permissions: updatedPermissionsWithDefaults\n });\n }\n\n /**\n * The type and path the folder will have after this update, computed the same way\n * `UpdateFolderRepository` computes them: the submitted slug and parent, falling back to the\n * current ones.\n */\n private async getTargetFolder(\n original: Folder,\n params: UpdateFolderParams\n ): Promise<Pick<Folder, \"type\" | \"path\">> {\n const slug = params.slug || original.slug;\n const parentId = params.parentId !== undefined ? params.parentId : original.parentId;\n\n // Same parent: only the last segment of the path can change, so it is derived from the\n // current path. This avoids reading the parent, which the user may not have access to.\n if (parentId === original.parentId) {\n const parentPath = original.path.slice(0, -(original.slug.length + 1));\n const path = Path.create(slug, parentPath);\n\n return { type: original.type, path };\n }\n\n if (!parentId) {\n const path = Path.create(slug);\n\n return { type: original.type, path };\n }\n\n // A move. If the destination cannot be read, keep the current path: the parent check further\n // down rejects the move with its own error.\n const parentResult = await this.getFolder.execute(parentId);\n if (parentResult.isFail()) {\n return original;\n }\n\n const path = Path.create(slug, parentResult.value.path);\n\n return { type: original.type, path };\n }\n\n /**\n * Code-defined permissions are resolved from the folder's own type and path rather than the FLP\n * catalog, so they apply even when the stored record is missing or not yet written.\n */\n private async withCodePermissions(\n folder: Pick<Folder, \"type\" | \"path\">,\n permissions: FolderPermission[]\n ): Promise<FolderPermission[]> {\n if (!this.codeFlpsProvider) {\n return permissions;\n }\n\n const codePermissions = await this.codeFlpsProvider.getPermissions({\n type: folder.type,\n path: folder.path\n });\n\n return CodeFlpMerger.mergePermissions(permissions, codePermissions);\n }\n}\n\nexport const UpdateFolderWithFolderLevelPermissions = createDecorator({\n abstraction: UpdateFolderUseCase,\n decorator: UpdateFolderWithFolderLevelPermissionsImpl,\n // `CodeFlpsProvider` is optional: `CodeFlpsFeature` does not register it unless the project has\n // the folder-level permissions entitlement.\n dependencies: [GetFolderUseCase, FolderLevelPermissions, [CodeFlpsProvider, { optional: true }]]\n});\n"],"names":["UpdateFolderWithFolderLevelPermissionsImpl","getFolder","folderLevelPermissions","codeFlpsProvider","decoretee","id","params","originalResult","Result","original","originalPermissions","targetFolder","submittedPermissions","permissions","stillHasAccess","FolderValidationError","Array","permission","targetIsValid","parentPermissions","canAccessFolder","FolderCannotMoveToNewParent","result","updatedPermissions","updatedPermissionsWithDefaults","slug","parentId","undefined","parentPath","path","Path","parentResult","folder","codePermissions","CodeFlpMerger","UpdateFolderWithFolderLevelPermissions","createDecorator","UpdateFolderUseCase","GetFolderUseCase","FolderLevelPermissions","CodeFlpsProvider"],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import type { AcoStorageOperations as IAcoStorageOperations } from "../../../types.js";
2
+ import type { AcoFilterCrud as IAcoFilterCrud } from "../../../filter/filter.types.js";
3
+ import type { AcoFolderLevelPermissionsCrud } from "../../../flp/flp.types.js";
2
4
  /** Storage operations for folder filtering. */
3
5
  export declare const FilterStorageOperations: import("@webiny/di").Abstraction<import("~/types.js").AcoFilterStorageOperations>;
4
6
  export declare namespace FilterStorageOperations {
@@ -8,3 +10,11 @@ export declare const FlpStorageOperations: import("@webiny/di").Abstraction<impo
8
10
  export declare namespace FlpStorageOperations {
9
11
  type Interface = IAcoStorageOperations["flp"];
10
12
  }
13
+ export declare const AcoFlpCrud: import("@webiny/di").Abstraction<AcoFolderLevelPermissionsCrud>;
14
+ export declare namespace AcoFlpCrud {
15
+ type Interface = AcoFolderLevelPermissionsCrud;
16
+ }
17
+ export declare const AcoFilterCrud: import("@webiny/di").Abstraction<IAcoFilterCrud>;
18
+ export declare namespace AcoFilterCrud {
19
+ type Interface = IAcoFilterCrud;
20
+ }
@@ -1,6 +1,8 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
2
  const FilterStorageOperations = createAbstraction("FilterStorageOperations");
3
3
  const FlpStorageOperations = createAbstraction("FlpStorageOperations");
4
- export { FilterStorageOperations, FlpStorageOperations };
4
+ const AcoFlpCrud = createAbstraction("AcoFlpCrud");
5
+ const AcoFilterCrud = createAbstraction("AcoFilterCrud");
6
+ export { AcoFilterCrud, AcoFlpCrud, FilterStorageOperations, FlpStorageOperations };
5
7
 
6
8
  //# sourceMappingURL=abstractions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"features/folder/shared/abstractions.js","sources":["../../../../src/features/folder/shared/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { AcoStorageOperations as IAcoStorageOperations } from \"~/types.js\";\n\n/** Storage operations for folder filtering. */\nexport const FilterStorageOperations =\n createAbstraction<IAcoStorageOperations[\"filter\"]>(\"FilterStorageOperations\");\n\nexport namespace FilterStorageOperations {\n export type Interface = IAcoStorageOperations[\"filter\"];\n}\n\nexport const FlpStorageOperations =\n createAbstraction<IAcoStorageOperations[\"flp\"]>(\"FlpStorageOperations\");\n\nexport namespace FlpStorageOperations {\n export type Interface = IAcoStorageOperations[\"flp\"];\n}\n"],"names":["FilterStorageOperations","createAbstraction","FlpStorageOperations"],"mappings":";AAIO,MAAMA,0BACTC,kBAAmD;AAMhD,MAAMC,uBACTD,kBAAgD"}
1
+ {"version":3,"file":"features/folder/shared/abstractions.js","sources":["../../../../src/features/folder/shared/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { AcoStorageOperations as IAcoStorageOperations } from \"~/types.js\";\nimport type { AcoFilterCrud as IAcoFilterCrud } from \"~/filter/filter.types.js\";\nimport type { AcoFolderLevelPermissionsCrud } from \"~/flp/flp.types.js\";\n\n/** Storage operations for folder filtering. */\nexport const FilterStorageOperations =\n createAbstraction<IAcoStorageOperations[\"filter\"]>(\"FilterStorageOperations\");\n\nexport namespace FilterStorageOperations {\n export type Interface = IAcoStorageOperations[\"filter\"];\n}\n\nexport const FlpStorageOperations =\n createAbstraction<IAcoStorageOperations[\"flp\"]>(\"FlpStorageOperations\");\n\nexport namespace FlpStorageOperations {\n export type Interface = IAcoStorageOperations[\"flp\"];\n}\n\nexport const AcoFlpCrud = createAbstraction<AcoFolderLevelPermissionsCrud>(\"AcoFlpCrud\");\n\nexport namespace AcoFlpCrud {\n export type Interface = AcoFolderLevelPermissionsCrud;\n}\n\nexport const AcoFilterCrud = createAbstraction<IAcoFilterCrud>(\"AcoFilterCrud\");\n\nexport namespace AcoFilterCrud {\n export type Interface = IAcoFilterCrud;\n}\n"],"names":["FilterStorageOperations","createAbstraction","FlpStorageOperations","AcoFlpCrud","AcoFilterCrud"],"mappings":";AAMO,MAAMA,0BACTC,kBAAmD;AAMhD,MAAMC,uBACTD,kBAAgD;AAM7C,MAAME,aAAaF,kBAAiD;AAMpE,MAAMG,gBAAgBH,kBAAkC"}
@@ -1,3 +1,2 @@
1
- import { GraphQLSchemaPlugin } from "@webiny/handler-graphql/plugins/GraphQLSchemaPlugin.js";
2
- import type { AcoContext } from "../types.js";
3
- export declare const filterSchema: GraphQLSchemaPlugin<AcoContext>;
1
+ import type { IGraphQLSchemaBuilder } from "@webiny/api-graphql/features/GraphQLSchemaBuilder/abstractions.js";
2
+ export declare const addFilterSchema: (builder: IGraphQLSchemaBuilder) => void;
@@ -1,9 +1,9 @@
1
- import { ErrorResponse, ListResponse } from "@webiny/handler-graphql/responses.js";
2
- import { GraphQLSchemaPlugin } from "@webiny/handler-graphql/plugins/GraphQLSchemaPlugin.js";
1
+ import { ErrorResponse, ListResponse } from "@webiny/api-graphql/responses.js";
3
2
  import { ensureAuthentication } from "../utils/ensureAuthentication.js";
4
3
  import { resolve } from "../utils/resolve.js";
5
- const filterSchema = new GraphQLSchemaPlugin({
6
- typeDefs: `
4
+ import { AcoFilterCrud } from "../features/folder/shared/abstractions.js";
5
+ const addFilterSchema = (builder)=>{
6
+ builder.addTypeDefs(`
7
7
  enum OperationEnum {
8
8
  AND
9
9
  OR
@@ -92,39 +92,73 @@ const filterSchema = new GraphQLSchemaPlugin({
92
92
  updateFilter(id: ID!, data: FilterUpdateInput!): FilterResponse
93
93
  deleteFilter(id: ID!): AcoBooleanResponse
94
94
  }
95
- `,
96
- resolvers: {
97
- AcoQuery: {
98
- getFilter: async (_, { id }, context)=>resolve(()=>{
95
+ `);
96
+ builder.addResolver({
97
+ path: "AcoQuery.getFilter",
98
+ dependencies: [
99
+ AcoFilterCrud
100
+ ],
101
+ resolver (filterCrud) {
102
+ return ({ args, context })=>resolve(()=>{
99
103
  ensureAuthentication(context);
100
- return context.aco.filter.get(id);
101
- }),
102
- listFilters: async (_, args, context)=>{
104
+ return filterCrud.get(args.id);
105
+ });
106
+ }
107
+ });
108
+ builder.addResolver({
109
+ path: "AcoQuery.listFilters",
110
+ dependencies: [
111
+ AcoFilterCrud
112
+ ],
113
+ resolver (filterCrud) {
114
+ return async ({ args, context })=>{
103
115
  try {
104
116
  ensureAuthentication(context);
105
- const [entries, meta] = await context.aco.filter.list(args);
117
+ const [entries, meta] = await filterCrud.list(args);
106
118
  return new ListResponse(entries, meta);
107
119
  } catch (e) {
108
120
  return new ErrorResponse(e);
109
121
  }
110
- }
111
- },
112
- AcoMutation: {
113
- createFilter: async (_, { data }, context)=>resolve(()=>{
122
+ };
123
+ }
124
+ });
125
+ builder.addResolver({
126
+ path: "AcoMutation.createFilter",
127
+ dependencies: [
128
+ AcoFilterCrud
129
+ ],
130
+ resolver (filterCrud) {
131
+ return ({ args, context })=>resolve(()=>{
114
132
  ensureAuthentication(context);
115
- return context.aco.filter.create(data);
116
- }),
117
- updateFilter: async (_, { id, data }, context)=>resolve(()=>{
133
+ return filterCrud.create(args.data);
134
+ });
135
+ }
136
+ });
137
+ builder.addResolver({
138
+ path: "AcoMutation.updateFilter",
139
+ dependencies: [
140
+ AcoFilterCrud
141
+ ],
142
+ resolver (filterCrud) {
143
+ return ({ args, context })=>resolve(()=>{
118
144
  ensureAuthentication(context);
119
- return context.aco.filter.update(id, data);
120
- }),
121
- deleteFilter: async (_, { id }, context)=>resolve(()=>{
145
+ return filterCrud.update(args.id, args.data);
146
+ });
147
+ }
148
+ });
149
+ builder.addResolver({
150
+ path: "AcoMutation.deleteFilter",
151
+ dependencies: [
152
+ AcoFilterCrud
153
+ ],
154
+ resolver (filterCrud) {
155
+ return ({ args, context })=>resolve(()=>{
122
156
  ensureAuthentication(context);
123
- return context.aco.filter.delete(id);
124
- })
157
+ return filterCrud.delete(args.id);
158
+ });
125
159
  }
126
- }
127
- });
128
- export { filterSchema };
160
+ });
161
+ };
162
+ export { addFilterSchema };
129
163
 
130
164
  //# sourceMappingURL=filter.gql.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filter/filter.gql.js","sources":["../../src/filter/filter.gql.ts"],"sourcesContent":["import { ErrorResponse, ListResponse } from \"@webiny/handler-graphql/responses.js\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/plugins/GraphQLSchemaPlugin.js\";\n\nimport { ensureAuthentication } from \"~/utils/ensureAuthentication.js\";\nimport { resolve } from \"~/utils/resolve.js\";\n\nimport type { AcoContext } from \"~/types.js\";\n\nexport const filterSchema = new GraphQLSchemaPlugin<AcoContext>({\n typeDefs: /* GraphQL */ `\n enum OperationEnum {\n AND\n OR\n }\n\n type GroupFilter {\n field: String!\n condition: String!\n value: String!\n }\n\n type Group {\n operation: OperationEnum!\n filters: [GroupFilter]!\n }\n\n type Filter {\n id: ID!\n name: String!\n description: String\n namespace: String!\n operation: OperationEnum!\n groups: [Group]!\n createdOn: DateTime\n modifiedOn: DateTime\n savedOn: DateTime\n createdBy: AcoUser\n modifiedBy: AcoUser\n savedBy: AcoUser\n }\n\n input GroupFilterInput {\n field: String!\n condition: String!\n value: String!\n }\n\n input GroupInput {\n operation: OperationEnum!\n filters: [GroupFilterInput]!\n }\n\n input FilterCreateInput {\n id: ID!\n name: String!\n description: String\n namespace: String!\n operation: OperationEnum!\n groups: [GroupInput]!\n }\n\n input FilterUpdateInput {\n name: String\n description: String\n namespace: String\n operation: OperationEnum\n groups: [GroupInput]\n }\n\n input FiltersListWhereInput {\n namespace: String\n }\n\n type FilterResponse {\n data: Filter\n error: AcoError\n }\n\n type FilterListResponse {\n data: [Filter]\n error: AcoError\n }\n\n extend type AcoQuery {\n getFilter(id: ID!): FilterResponse\n listFilters(\n where: FiltersListWhereInput!\n limit: Int\n after: String\n sort: AcoSort\n ): FilterListResponse\n }\n\n extend type AcoMutation {\n createFilter(data: FilterCreateInput!): FilterResponse\n updateFilter(id: ID!, data: FilterUpdateInput!): FilterResponse\n deleteFilter(id: ID!): AcoBooleanResponse\n }\n `,\n resolvers: {\n AcoQuery: {\n getFilter: async (_, { id }, context) => {\n return resolve(() => {\n ensureAuthentication(context);\n return context.aco.filter.get(id);\n });\n },\n listFilters: async (_, args: any, context) => {\n try {\n ensureAuthentication(context);\n const [entries, meta] = await context.aco.filter.list(args);\n return new ListResponse(entries, meta);\n } catch (e) {\n return new ErrorResponse(e);\n }\n }\n },\n AcoMutation: {\n createFilter: async (_, { data }, context) => {\n return resolve(() => {\n ensureAuthentication(context);\n return context.aco.filter.create(data);\n });\n },\n updateFilter: async (_, { id, data }, context) => {\n return resolve(() => {\n ensureAuthentication(context);\n return context.aco.filter.update(id, data);\n });\n },\n deleteFilter: async (_, { id }, context) => {\n return resolve(() => {\n ensureAuthentication(context);\n return context.aco.filter.delete(id);\n });\n }\n }\n }\n});\n"],"names":["filterSchema","GraphQLSchemaPlugin","_","id","context","resolve","ensureAuthentication","args","entries","meta","ListResponse","e","ErrorResponse","data"],"mappings":";;;;AAQO,MAAMA,eAAe,IAAIC,oBAAgC;IAC5D,UAAwB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAyFzB,CAAC;IACD,WAAW;QACP,UAAU;YACN,WAAW,OAAOC,GAAG,EAAEC,EAAE,EAAE,EAAEC,UAClBC,QAAQ;oBACXC,qBAAqBF;oBACrB,OAAOA,QAAQ,GAAG,CAAC,MAAM,CAAC,GAAG,CAACD;gBAClC;YAEJ,aAAa,OAAOD,GAAGK,MAAWH;gBAC9B,IAAI;oBACAE,qBAAqBF;oBACrB,MAAM,CAACI,SAASC,KAAK,GAAG,MAAML,QAAQ,GAAG,CAAC,MAAM,CAAC,IAAI,CAACG;oBACtD,OAAO,IAAIG,aAAaF,SAASC;gBACrC,EAAE,OAAOE,GAAG;oBACR,OAAO,IAAIC,cAAcD;gBAC7B;YACJ;QACJ;QACA,aAAa;YACT,cAAc,OAAOT,GAAG,EAAEW,IAAI,EAAE,EAAET,UACvBC,QAAQ;oBACXC,qBAAqBF;oBACrB,OAAOA,QAAQ,GAAG,CAAC,MAAM,CAAC,MAAM,CAACS;gBACrC;YAEJ,cAAc,OAAOX,GAAG,EAAEC,EAAE,EAAEU,IAAI,EAAE,EAAET,UAC3BC,QAAQ;oBACXC,qBAAqBF;oBACrB,OAAOA,QAAQ,GAAG,CAAC,MAAM,CAAC,MAAM,CAACD,IAAIU;gBACzC;YAEJ,cAAc,OAAOX,GAAG,EAAEC,EAAE,EAAE,EAAEC,UACrBC,QAAQ;oBACXC,qBAAqBF;oBACrB,OAAOA,QAAQ,GAAG,CAAC,MAAM,CAAC,MAAM,CAACD;gBACrC;QAER;IACJ;AACJ"}
1
+ {"version":3,"file":"filter/filter.gql.js","sources":["../../src/filter/filter.gql.ts"],"sourcesContent":["import { ErrorResponse, ListResponse } from \"@webiny/api-graphql/responses.js\";\nimport type { IGraphQLSchemaBuilder } from \"@webiny/api-graphql/features/GraphQLSchemaBuilder/abstractions.js\";\nimport { ensureAuthentication } from \"~/utils/ensureAuthentication.js\";\nimport { resolve } from \"~/utils/resolve.js\";\nimport { AcoFilterCrud } from \"~/features/folder/shared/abstractions.js\";\n\nexport const addFilterSchema = (builder: IGraphQLSchemaBuilder): void => {\n builder.addTypeDefs(/* GraphQL */ `\n enum OperationEnum {\n AND\n OR\n }\n\n type GroupFilter {\n field: String!\n condition: String!\n value: String!\n }\n\n type Group {\n operation: OperationEnum!\n filters: [GroupFilter]!\n }\n\n type Filter {\n id: ID!\n name: String!\n description: String\n namespace: String!\n operation: OperationEnum!\n groups: [Group]!\n createdOn: DateTime\n modifiedOn: DateTime\n savedOn: DateTime\n createdBy: AcoUser\n modifiedBy: AcoUser\n savedBy: AcoUser\n }\n\n input GroupFilterInput {\n field: String!\n condition: String!\n value: String!\n }\n\n input GroupInput {\n operation: OperationEnum!\n filters: [GroupFilterInput]!\n }\n\n input FilterCreateInput {\n id: ID!\n name: String!\n description: String\n namespace: String!\n operation: OperationEnum!\n groups: [GroupInput]!\n }\n\n input FilterUpdateInput {\n name: String\n description: String\n namespace: String\n operation: OperationEnum\n groups: [GroupInput]\n }\n\n input FiltersListWhereInput {\n namespace: String\n }\n\n type FilterResponse {\n data: Filter\n error: AcoError\n }\n\n type FilterListResponse {\n data: [Filter]\n error: AcoError\n }\n\n extend type AcoQuery {\n getFilter(id: ID!): FilterResponse\n listFilters(\n where: FiltersListWhereInput!\n limit: Int\n after: String\n sort: AcoSort\n ): FilterListResponse\n }\n\n extend type AcoMutation {\n createFilter(data: FilterCreateInput!): FilterResponse\n updateFilter(id: ID!, data: FilterUpdateInput!): FilterResponse\n deleteFilter(id: ID!): AcoBooleanResponse\n }\n `);\n\n builder.addResolver({\n path: \"AcoQuery.getFilter\",\n dependencies: [AcoFilterCrud],\n resolver(filterCrud) {\n return ({ args, context }) =>\n resolve(() => {\n ensureAuthentication(context);\n return filterCrud.get(args.id);\n });\n }\n });\n\n builder.addResolver({\n path: \"AcoQuery.listFilters\",\n dependencies: [AcoFilterCrud],\n resolver(filterCrud) {\n return async ({ args, context }) => {\n try {\n ensureAuthentication(context);\n const [entries, meta] = await filterCrud.list(args);\n return new ListResponse(entries, meta);\n } catch (e) {\n return new ErrorResponse(e);\n }\n };\n }\n });\n\n builder.addResolver({\n path: \"AcoMutation.createFilter\",\n dependencies: [AcoFilterCrud],\n resolver(filterCrud) {\n return ({ args, context }) =>\n resolve(() => {\n ensureAuthentication(context);\n return filterCrud.create(args.data);\n });\n }\n });\n\n builder.addResolver({\n path: \"AcoMutation.updateFilter\",\n dependencies: [AcoFilterCrud],\n resolver(filterCrud) {\n return ({ args, context }) =>\n resolve(() => {\n ensureAuthentication(context);\n return filterCrud.update(args.id, args.data);\n });\n }\n });\n\n builder.addResolver({\n path: \"AcoMutation.deleteFilter\",\n dependencies: [AcoFilterCrud],\n resolver(filterCrud) {\n return ({ args, context }) =>\n resolve(() => {\n ensureAuthentication(context);\n return filterCrud.delete(args.id);\n });\n }\n });\n};\n"],"names":["addFilterSchema","builder","AcoFilterCrud","filterCrud","args","context","resolve","ensureAuthentication","entries","meta","ListResponse","e","ErrorResponse"],"mappings":";;;;AAMO,MAAMA,kBAAkB,CAACC;IAC5BA,QAAQ,WAAW,CAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAyFnC,CAAC;IAEDA,QAAQ,WAAW,CAAC;QAChB,MAAM;QACN,cAAc;YAACC;SAAc;QAC7B,UAASC,UAAU;YACf,OAAO,CAAC,EAAEC,IAAI,EAAEC,OAAO,EAAE,GACrBC,QAAQ;oBACJC,qBAAqBF;oBACrB,OAAOF,WAAW,GAAG,CAACC,KAAK,EAAE;gBACjC;QACR;IACJ;IAEAH,QAAQ,WAAW,CAAC;QAChB,MAAM;QACN,cAAc;YAACC;SAAc;QAC7B,UAASC,UAAU;YACf,OAAO,OAAO,EAAEC,IAAI,EAAEC,OAAO,EAAE;gBAC3B,IAAI;oBACAE,qBAAqBF;oBACrB,MAAM,CAACG,SAASC,KAAK,GAAG,MAAMN,WAAW,IAAI,CAACC;oBAC9C,OAAO,IAAIM,aAAaF,SAASC;gBACrC,EAAE,OAAOE,GAAG;oBACR,OAAO,IAAIC,cAAcD;gBAC7B;YACJ;QACJ;IACJ;IAEAV,QAAQ,WAAW,CAAC;QAChB,MAAM;QACN,cAAc;YAACC;SAAc;QAC7B,UAASC,UAAU;YACf,OAAO,CAAC,EAAEC,IAAI,EAAEC,OAAO,EAAE,GACrBC,QAAQ;oBACJC,qBAAqBF;oBACrB,OAAOF,WAAW,MAAM,CAACC,KAAK,IAAI;gBACtC;QACR;IACJ;IAEAH,QAAQ,WAAW,CAAC;QAChB,MAAM;QACN,cAAc;YAACC;SAAc;QAC7B,UAASC,UAAU;YACf,OAAO,CAAC,EAAEC,IAAI,EAAEC,OAAO,EAAE,GACrBC,QAAQ;oBACJC,qBAAqBF;oBACrB,OAAOF,WAAW,MAAM,CAACC,KAAK,EAAE,EAAEA,KAAK,IAAI;gBAC/C;QACR;IACJ;IAEAH,QAAQ,WAAW,CAAC;QAChB,MAAM;QACN,cAAc;YAACC;SAAc;QAC7B,UAASC,UAAU;YACf,OAAO,CAAC,EAAEC,IAAI,EAAEC,OAAO,EAAE,GACrBC,QAAQ;oBACJC,qBAAqBF;oBACrB,OAAOF,WAAW,MAAM,CAACC,KAAK,EAAE;gBACpC;QACR;IACJ;AACJ"}
@@ -5,7 +5,8 @@ class FilterPrivateModelImpl {
5
5
  return [
6
6
  builder.private({
7
7
  modelId: FILTER_MODEL_ID,
8
- name: "ACO - Filter"
8
+ name: "ACO - Filter",
9
+ lifecycleEvents: false
9
10
  }).fields((fields)=>({
10
11
  name: fields.text().label("Name").required(),
11
12
  description: fields.text().label("Description"),
@@ -1 +1 @@
1
- {"version":3,"file":"filter/filter.model.js","sources":["../../src/filter/filter.model.ts"],"sourcesContent":["import { ModelFactory } from \"@webiny/api-headless-cms/features/modelBuilder/index.js\";\n\nexport const FILTER_MODEL_ID = process.env.WEBINY_API_LEGACY_MODELS ? \"acoFilter\" : \"wbyAcoFilter\";\n\nclass FilterPrivateModelImpl implements ModelFactory.Interface {\n public async execute(builder: ModelFactory.Builder) {\n return [\n builder\n .private({\n modelId: FILTER_MODEL_ID,\n name: \"ACO - Filter\"\n })\n .fields(fields => ({\n name: fields.text().label(\"Name\").required(),\n description: fields.text().label(\"Description\"),\n namespace: fields.text().label(\"Model Id\").required(),\n operation: fields\n .text()\n .label(\"Operation\")\n .required()\n .predefinedValues([\n {\n label: \"AND\",\n value: \"AND\"\n },\n {\n label: \"OR\",\n value: \"OR\"\n }\n ]),\n groups: fields\n .object()\n .label(\"Groups\")\n .list()\n .listMinLength(1, \"At least one group is required.\")\n .fields(fields => ({\n operation: fields\n .text()\n .label(\"Operation\")\n .required()\n .predefinedValues([\n {\n label: \"AND\",\n value: \"AND\"\n },\n {\n label: \"OR\",\n value: \"OR\"\n }\n ]),\n filters: fields\n .object()\n .label(\"Filters\")\n .list()\n .listMinLength(1, \"At least one filter is required.\")\n .fields(filterFields => ({\n field: filterFields.text().label(\"Field\").required(),\n condition: filterFields.text().label(\"Condition\").required(),\n value: filterFields.text().label(\"Value\").required()\n }))\n }))\n }))\n ];\n }\n}\n\nexport const FilterPrivateModel = ModelFactory.createImplementation({\n implementation: FilterPrivateModelImpl,\n dependencies: []\n});\n"],"names":["FILTER_MODEL_ID","process","FilterPrivateModelImpl","builder","fields","filterFields","FilterPrivateModel","ModelFactory"],"mappings":";AAEO,MAAMA,kBAAkBC,QAAQ,GAAG,CAAC,wBAAwB,GAAG,cAAc;AAEpF,MAAMC;IACF,MAAa,QAAQC,OAA6B,EAAE;QAChD,OAAO;YACHA,QACK,OAAO,CAAC;gBACL,SAASH;gBACT,MAAM;YACV,GACC,MAAM,CAACI,CAAAA,SAAW;oBACf,MAAMA,OAAO,IAAI,GAAG,KAAK,CAAC,QAAQ,QAAQ;oBAC1C,aAAaA,OAAO,IAAI,GAAG,KAAK,CAAC;oBACjC,WAAWA,OAAO,IAAI,GAAG,KAAK,CAAC,YAAY,QAAQ;oBACnD,WAAWA,OACN,IAAI,GACJ,KAAK,CAAC,aACN,QAAQ,GACR,gBAAgB,CAAC;wBACd;4BACI,OAAO;4BACP,OAAO;wBACX;wBACA;4BACI,OAAO;4BACP,OAAO;wBACX;qBACH;oBACL,QAAQA,OACH,MAAM,GACN,KAAK,CAAC,UACN,IAAI,GACJ,aAAa,CAAC,GAAG,mCACjB,MAAM,CAACA,CAAAA,SAAW;4BACf,WAAWA,OACN,IAAI,GACJ,KAAK,CAAC,aACN,QAAQ,GACR,gBAAgB,CAAC;gCACd;oCACI,OAAO;oCACP,OAAO;gCACX;gCACA;oCACI,OAAO;oCACP,OAAO;gCACX;6BACH;4BACL,SAASA,OACJ,MAAM,GACN,KAAK,CAAC,WACN,IAAI,GACJ,aAAa,CAAC,GAAG,oCACjB,MAAM,CAACC,CAAAA,eAAiB;oCACrB,OAAOA,aAAa,IAAI,GAAG,KAAK,CAAC,SAAS,QAAQ;oCAClD,WAAWA,aAAa,IAAI,GAAG,KAAK,CAAC,aAAa,QAAQ;oCAC1D,OAAOA,aAAa,IAAI,GAAG,KAAK,CAAC,SAAS,QAAQ;gCACtD;wBACR;gBACR;SACP;IACL;AACJ;AAEO,MAAMC,qBAAqBC,aAAa,oBAAoB,CAAC;IAChE,gBAAgBL;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"filter/filter.model.js","sources":["../../src/filter/filter.model.ts"],"sourcesContent":["import { ModelFactory } from \"@webiny/api-headless-cms/features/modelBuilder/index.js\";\n\nexport const FILTER_MODEL_ID = process.env.WEBINY_API_LEGACY_MODELS ? \"acoFilter\" : \"wbyAcoFilter\";\n\nclass FilterPrivateModelImpl implements ModelFactory.Interface {\n public async execute(builder: ModelFactory.Builder) {\n return [\n builder\n .private({\n modelId: FILTER_MODEL_ID,\n name: \"ACO - Filter\",\n lifecycleEvents: false\n })\n .fields(fields => ({\n name: fields.text().label(\"Name\").required(),\n description: fields.text().label(\"Description\"),\n namespace: fields.text().label(\"Model Id\").required(),\n operation: fields\n .text()\n .label(\"Operation\")\n .required()\n .predefinedValues([\n {\n label: \"AND\",\n value: \"AND\"\n },\n {\n label: \"OR\",\n value: \"OR\"\n }\n ]),\n groups: fields\n .object()\n .label(\"Groups\")\n .list()\n .listMinLength(1, \"At least one group is required.\")\n .fields(fields => ({\n operation: fields\n .text()\n .label(\"Operation\")\n .required()\n .predefinedValues([\n {\n label: \"AND\",\n value: \"AND\"\n },\n {\n label: \"OR\",\n value: \"OR\"\n }\n ]),\n filters: fields\n .object()\n .label(\"Filters\")\n .list()\n .listMinLength(1, \"At least one filter is required.\")\n .fields(filterFields => ({\n field: filterFields.text().label(\"Field\").required(),\n condition: filterFields.text().label(\"Condition\").required(),\n value: filterFields.text().label(\"Value\").required()\n }))\n }))\n }))\n ];\n }\n}\n\nexport const FilterPrivateModel = ModelFactory.createImplementation({\n implementation: FilterPrivateModelImpl,\n dependencies: []\n});\n"],"names":["FILTER_MODEL_ID","process","FilterPrivateModelImpl","builder","fields","filterFields","FilterPrivateModel","ModelFactory"],"mappings":";AAEO,MAAMA,kBAAkBC,QAAQ,GAAG,CAAC,wBAAwB,GAAG,cAAc;AAEpF,MAAMC;IACF,MAAa,QAAQC,OAA6B,EAAE;QAChD,OAAO;YACHA,QACK,OAAO,CAAC;gBACL,SAASH;gBACT,MAAM;gBACN,iBAAiB;YACrB,GACC,MAAM,CAACI,CAAAA,SAAW;oBACf,MAAMA,OAAO,IAAI,GAAG,KAAK,CAAC,QAAQ,QAAQ;oBAC1C,aAAaA,OAAO,IAAI,GAAG,KAAK,CAAC;oBACjC,WAAWA,OAAO,IAAI,GAAG,KAAK,CAAC,YAAY,QAAQ;oBACnD,WAAWA,OACN,IAAI,GACJ,KAAK,CAAC,aACN,QAAQ,GACR,gBAAgB,CAAC;wBACd;4BACI,OAAO;4BACP,OAAO;wBACX;wBACA;4BACI,OAAO;4BACP,OAAO;wBACX;qBACH;oBACL,QAAQA,OACH,MAAM,GACN,KAAK,CAAC,UACN,IAAI,GACJ,aAAa,CAAC,GAAG,mCACjB,MAAM,CAACA,CAAAA,SAAW;4BACf,WAAWA,OACN,IAAI,GACJ,KAAK,CAAC,aACN,QAAQ,GACR,gBAAgB,CAAC;gCACd;oCACI,OAAO;oCACP,OAAO;gCACX;gCACA;oCACI,OAAO;oCACP,OAAO;gCACX;6BACH;4BACL,SAASA,OACJ,MAAM,GACN,KAAK,CAAC,WACN,IAAI,GACJ,aAAa,CAAC,GAAG,oCACjB,MAAM,CAACC,CAAAA,eAAiB;oCACrB,OAAOA,aAAa,IAAI,GAAG,KAAK,CAAC,SAAS,QAAQ;oCAClD,WAAWA,aAAa,IAAI,GAAG,KAAK,CAAC,aAAa,QAAQ;oCAC1D,OAAOA,aAAa,IAAI,GAAG,KAAK,CAAC,SAAS,QAAQ;gCACtD;wBACR;gBACR;SACP;IACL;AACJ;AAEO,MAAMC,qBAAqBC,aAAa,oBAAoB,CAAC;IAChE,gBAAgBL;IAChB,cAAc,EAAE;AACpB"}
@@ -1,9 +1,7 @@
1
- import type { HeadlessCms } from "@webiny/api-headless-cms/types/index.js";
2
- import type { Security } from "@webiny/api-core/types/security.js";
1
+ import type { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/abstractions.js";
3
2
  import type { Container } from "@webiny/di";
4
3
  interface CreateFilterOperationsParams {
5
- cms: HeadlessCms;
6
- security: Security;
4
+ identityContext: IdentityContext.Interface;
7
5
  container: Container;
8
6
  }
9
7
  import type { AcoFilterStorageOperations } from "./filter.types.js";