@webiny/app-aco 0.0.0-unstable.7be00a75a9 → 0.0.0-unstable.7c2def32a7
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.
- package/app.js +5 -1
- package/app.js.map +1 -1
- package/components/Actions/DeleteFolder/DeleteFolder.js +1 -1
- package/components/Actions/DeleteFolder/DeleteFolder.js.map +1 -1
- package/components/AdvancedSearch/AdvancedSearch.d.ts +2 -2
- package/components/AdvancedSearch/AdvancedSearch.js +1 -1
- package/components/AdvancedSearch/AdvancedSearch.js.map +1 -1
- package/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilder/components/OperationSelector.js +2 -2
- package/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilder/components/OperationSelector.js.map +1 -1
- package/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilderDrawer.d.ts +2 -2
- package/components/AdvancedSearch/SelectedFilter/SelectedFilter.js +1 -1
- package/components/AdvancedSearch/SelectedFilter/SelectedFilter.js.map +1 -1
- package/components/AdvancedSearch/domain/Filter.d.ts +1 -1
- package/components/AdvancedSearch/domain/FilterRepositoryFactory.d.ts +2 -2
- package/components/AdvancedSearch/domain/FilterRepositoryFactory.js.map +1 -1
- package/components/AdvancedSearch/gateways/FiltersGraphQLGateway.d.ts +2 -2
- package/components/AdvancedSearch/gateways/FiltersGraphQLGateway.js +9 -10
- package/components/AdvancedSearch/gateways/FiltersGraphQLGateway.js.map +1 -1
- package/components/AdvancedSearch/gateways/filters.gql.d.ts +5 -5
- package/components/AdvancedSearch/gateways/filters.gql.js +5 -6
- package/components/AdvancedSearch/gateways/filters.gql.js.map +1 -1
- package/components/AdvancedSearch/useFilterRepository.js +7 -2
- package/components/AdvancedSearch/useFilterRepository.js.map +1 -1
- package/components/FolderTree/List/List.js +14 -6
- package/components/FolderTree/List/List.js.map +1 -1
- package/components/Table/cells/CellAuthor.d.ts +2 -0
- package/components/Table/cells/CellAuthor.js +10 -0
- package/components/Table/cells/CellAuthor.js.map +1 -0
- package/components/Table/cells/CellCreated.d.ts +2 -0
- package/components/Table/cells/CellCreated.js +13 -0
- package/components/Table/cells/CellCreated.js.map +1 -0
- package/components/Table/cells/CellModified.d.ts +2 -0
- package/components/Table/cells/CellModified.js +13 -0
- package/components/Table/cells/CellModified.js.map +1 -0
- package/components/Table/cells/index.d.ts +3 -0
- package/components/Table/cells/index.js +3 -0
- package/components/Table/components/Table/TableInner.d.ts +2 -2
- package/components/Table/createTableData.d.ts +7 -5
- package/components/Table/createTableData.js +22 -7
- package/components/Table/createTableData.js.map +1 -1
- package/components/Table/index.d.ts +2 -2
- package/components/Table/index.js +2 -2
- package/components/index.d.ts +0 -1
- package/components/index.js +0 -1
- package/config/AcoConfig.d.ts +8 -12
- package/config/advanced-search/FieldRenderer.d.ts +3 -1
- package/config/folder/Action.d.ts +1 -1
- package/config/folder/index.d.ts +3 -2
- package/config/index.d.ts +0 -1
- package/config/index.js +0 -1
- package/config/record/Action.d.ts +1 -1
- package/config/record/index.d.ts +1 -1
- package/config/table/Column.d.ts +8 -39
- package/config/table/Column.js +4 -67
- package/config/table/Column.js.map +1 -1
- package/config/table/Sorting.d.ts +2 -11
- package/config/table/Sorting.js +1 -28
- package/config/table/index.d.ts +5 -9
- package/contexts/index.d.ts +0 -3
- package/contexts/index.js +0 -3
- package/dialogs/DialogSetPermissions/UsersTeamsSelection/ListItemMeta.js +5 -0
- package/dialogs/DialogSetPermissions/UsersTeamsSelection/ListItemMeta.js.map +1 -1
- package/dialogs/DialogSetPermissions/graphql.d.ts +1 -1
- package/dialogs/DialogSetPermissions/graphql.js +1 -2
- package/dialogs/DialogSetPermissions/graphql.js.map +1 -1
- package/dialogs/useConfirmMoveFolderDialog.d.ts +1 -0
- package/dialogs/useConfirmMoveFolderDialog.js +3 -2
- package/dialogs/useConfirmMoveFolderDialog.js.map +1 -1
- package/dialogs/useCreateDialog.js +5 -9
- package/dialogs/useCreateDialog.js.map +1 -1
- package/dialogs/useEditDialog.js +2 -2
- package/dialogs/useEditDialog.js.map +1 -1
- package/dialogs/useSetPermissionsDialog.js +16 -4
- package/dialogs/useSetPermissionsDialog.js.map +1 -1
- package/domain/folder/Folder.d.ts +2 -1
- package/domain/folder/Folder.js.map +1 -1
- package/features/folders/cache/FoldersCacheFactory.d.ts +3 -1
- package/features/folders/cache/FoldersCacheFactory.js +5 -0
- package/features/folders/cache/FoldersCacheFactory.js.map +1 -1
- package/features/folders/cache/updateDescendantPermissions.d.ts +12 -0
- package/features/folders/cache/updateDescendantPermissions.js +27 -0
- package/features/folders/cache/updateDescendantPermissions.js.map +1 -0
- package/features/folders/createFolder/CreateFolderGqlGateway.d.ts +3 -3
- package/features/folders/createFolder/CreateFolderGqlGateway.js +15 -16
- package/features/folders/createFolder/CreateFolderGqlGateway.js.map +1 -1
- package/features/folders/deleteFolder/DeleteFolderGqlGateway.d.ts +3 -3
- package/features/folders/deleteFolder/DeleteFolderGqlGateway.js +5 -6
- package/features/folders/deleteFolder/DeleteFolderGqlGateway.js.map +1 -1
- package/features/folders/folderEvents/AddCreatedFolderToCache.d.ts +22 -0
- package/features/folders/folderEvents/AddCreatedFolderToCache.js +24 -0
- package/features/folders/folderEvents/AddCreatedFolderToCache.js.map +1 -0
- package/features/folders/folderEvents/FolderCreatedEvent.d.ts +14 -0
- package/features/folders/folderEvents/FolderCreatedEvent.js +13 -0
- package/features/folders/folderEvents/FolderCreatedEvent.js.map +1 -0
- package/features/folders/folderEvents/FolderDeletedEvent.d.ts +9 -0
- package/features/folders/folderEvents/FolderDeletedEvent.js +13 -0
- package/features/folders/folderEvents/FolderDeletedEvent.js.map +1 -0
- package/features/folders/folderEvents/FolderEvents.test.d.ts +1 -0
- package/features/folders/folderEvents/FolderEvents.test.js +238 -0
- package/features/folders/folderEvents/FolderEvents.test.js.map +1 -0
- package/features/folders/folderEvents/FolderUpdatedEvent.d.ts +12 -0
- package/features/folders/folderEvents/FolderUpdatedEvent.js +13 -0
- package/features/folders/folderEvents/FolderUpdatedEvent.js.map +1 -0
- package/features/folders/folderEvents/FolderWebsocketMessages.d.ts +15 -0
- package/features/folders/folderEvents/FolderWebsocketMessages.js +48 -0
- package/features/folders/folderEvents/FolderWebsocketMessages.js.map +1 -0
- package/features/folders/folderEvents/RefreshUpdatedFolderInCache.d.ts +19 -0
- package/features/folders/folderEvents/RefreshUpdatedFolderInCache.js +27 -0
- package/features/folders/folderEvents/RefreshUpdatedFolderInCache.js.map +1 -0
- package/features/folders/folderEvents/RemoveDeletedFolderFromCache.d.ts +13 -0
- package/features/folders/folderEvents/RemoveDeletedFolderFromCache.js +15 -0
- package/features/folders/folderEvents/RemoveDeletedFolderFromCache.js.map +1 -0
- package/features/folders/folderEvents/abstractions.d.ts +28 -0
- package/features/folders/folderEvents/abstractions.js +7 -0
- package/features/folders/folderEvents/abstractions.js.map +1 -0
- package/features/folders/folderEvents/feature.d.ts +9 -0
- package/features/folders/folderEvents/feature.js +21 -0
- package/features/folders/folderEvents/feature.js.map +1 -0
- package/features/folders/folderEvents/index.d.ts +5 -0
- package/features/folders/folderEvents/index.js +5 -0
- package/features/folders/folderModelProvider/FolderModelProvider.js +30 -31
- package/features/folders/folderModelProvider/FolderModelProvider.js.map +1 -1
- package/features/folders/folderModelProvider/GetFolderModelGqlGateway.d.ts +3 -3
- package/features/folders/folderModelProvider/GetFolderModelGqlGateway.js +5 -7
- package/features/folders/folderModelProvider/GetFolderModelGqlGateway.js.map +1 -1
- package/features/folders/getFolder/GetFolderGqlGateway.d.ts +3 -3
- package/features/folders/getFolder/GetFolderGqlGateway.js +5 -7
- package/features/folders/getFolder/GetFolderGqlGateway.js.map +1 -1
- package/features/folders/getFolderExtensionsFields/GetFolderExtensionsFieldsUseCase.d.ts +4 -3
- package/features/folders/getFolderExtensionsFields/useFolderExtensionsFields.d.ts +4 -3
- package/features/folders/getFolderLevelPermission/GetFolderLevelPermission.test.js +12 -16
- package/features/folders/getFolderLevelPermission/GetFolderLevelPermission.test.js.map +1 -1
- package/features/folders/getFolderLevelPermission/decorators/GetFolderLevelPermissionWithFlpDecorator.d.ts +3 -3
- package/features/folders/getFolderLevelPermission/decorators/GetFolderLevelPermissionWithFlpDecorator.js +5 -5
- package/features/folders/getFolderLevelPermission/decorators/GetFolderLevelPermissionWithFlpDecorator.js.map +1 -1
- package/features/folders/listFolders/ListFoldersGqlGateway.d.ts +1 -1
- package/features/folders/listFolders/ListFoldersGqlGateway.js +1 -2
- package/features/folders/listFolders/ListFoldersGqlGateway.js.map +1 -1
- package/features/folders/listFolders/useListFolders.d.ts +1 -1
- package/features/folders/listFoldersByParentIds/ListFoldersByParentIdsGqlGateway.d.ts +3 -3
- package/features/folders/listFoldersByParentIds/ListFoldersByParentIdsGqlGateway.js +5 -7
- package/features/folders/listFoldersByParentIds/ListFoldersByParentIdsGqlGateway.js.map +1 -1
- package/features/folders/listFoldersByParentIds/useListFoldersByParentIds.d.ts +2 -2
- package/features/folders/loadFolderHierarchy/useLoadFolderHierarchy.d.ts +2 -2
- package/features/folders/updateFolder/UpdateFolderGqlGateway.d.ts +3 -3
- package/features/folders/updateFolder/UpdateFolderGqlGateway.js +6 -7
- package/features/folders/updateFolder/UpdateFolderGqlGateway.js.map +1 -1
- package/features/folders/updateFolder/decorators/RepositoryWithPermissionsChange.d.ts +1 -4
- package/features/folders/updateFolder/decorators/RepositoryWithPermissionsChange.js +3 -30
- package/features/folders/updateFolder/decorators/RepositoryWithPermissionsChange.js.map +1 -1
- package/features/folders/updateFolder/decorators/{UseCaseWithoutInheritedPermissions.d.ts → UseCaseWithoutReadOnlyPermissions.d.ts} +2 -2
- package/features/folders/updateFolder/decorators/{UseCaseWithoutInheritedPermissions.js → UseCaseWithoutReadOnlyPermissions.js} +6 -6
- package/features/folders/updateFolder/decorators/UseCaseWithoutReadOnlyPermissions.js.map +1 -0
- package/features/folders/updateFolder/feature.js +2 -2
- package/features/folders/updateFolder/feature.js.map +1 -1
- package/hooks/index.d.ts +0 -6
- package/hooks/index.js +0 -6
- package/index.d.ts +3 -2
- package/index.js +2 -2
- package/package.json +23 -29
- package/presentation/folderTree/FolderTree.js +13 -5
- package/presentation/folderTree/FolderTree.js.map +1 -1
- package/presentation/folderTree/FolderTreePresenter.d.ts +5 -1
- package/presentation/folderTree/FolderTreePresenter.js +49 -31
- package/presentation/folderTree/FolderTreePresenter.js.map +1 -1
- package/presentation/folderTree/FolderTreePresenter.test.js +111 -7
- package/presentation/folderTree/FolderTreePresenter.test.js.map +1 -1
- package/table.types.d.ts +2 -9
- package/types.d.ts +5 -26
- package/types.js.map +1 -1
- package/components/Extensions/Extensions.d.ts +0 -2
- package/components/Extensions/Extensions.js +0 -30
- package/components/Extensions/Extensions.js.map +0 -1
- package/components/Extensions/index.d.ts +0 -1
- package/components/Extensions/index.js +0 -1
- package/config/folder/createFolderFieldDecoratorFactory.d.ts +0 -13
- package/config/folder/createFolderFieldDecoratorFactory.js +0 -17
- package/config/folder/createFolderFieldDecoratorFactory.js.map +0 -1
- package/config/table/Sorting.js.map +0 -1
- package/contexts/acoList.d.ts +0 -49
- package/contexts/acoList.js +0 -303
- package/contexts/acoList.js.map +0 -1
- package/contexts/app.d.ts +0 -33
- package/contexts/app.js +0 -47
- package/contexts/app.js.map +0 -1
- package/contexts/folders.d.ts +0 -12
- package/contexts/folders.js +0 -32
- package/contexts/folders.js.map +0 -1
- package/contexts/navigateFolder.d.ts +0 -17
- package/contexts/navigateFolder.js +0 -54
- package/contexts/navigateFolder.js.map +0 -1
- package/contexts/records.d.ts +0 -31
- package/contexts/records.js +0 -316
- package/contexts/records.js.map +0 -1
- package/exports/admin/aco.d.ts +0 -2
- package/exports/admin/aco.js +0 -2
- package/features/folders/updateFolder/decorators/UseCaseWithoutInheritedPermissions.js.map +0 -1
- package/graphql/app.gql.d.ts +0 -17
- package/graphql/app.gql.js +0 -22
- package/graphql/app.gql.js.map +0 -1
- package/graphql/records/common.d.ts +0 -4
- package/graphql/records/common.js +0 -57
- package/graphql/records/common.js.map +0 -1
- package/graphql/records/getRecord.d.ts +0 -2
- package/graphql/records/getRecord.js +0 -5
- package/graphql/records/getRecord.js.map +0 -1
- package/graphql/records/listRecords.d.ts +0 -2
- package/graphql/records/listRecords.js +0 -26
- package/graphql/records/listRecords.js.map +0 -1
- package/graphql/records/moveRecord.d.ts +0 -2
- package/graphql/records/moveRecord.js +0 -16
- package/graphql/records/moveRecord.js.map +0 -1
- package/graphql/records/types.d.ts +0 -108
- package/graphql/records/types.js +0 -0
- package/graphql/records.gql.d.ts +0 -3
- package/graphql/records.gql.js +0 -3
- package/handlers.d.ts +0 -23
- package/handlers.js +0 -22
- package/handlers.js.map +0 -1
- package/hooks/useAcoApp.d.ts +0 -2
- package/hooks/useAcoApp.js +0 -16
- package/hooks/useAcoApp.js.map +0 -1
- package/hooks/useAcoList.d.ts +0 -3
- package/hooks/useAcoList.js +0 -10
- package/hooks/useAcoList.js.map +0 -1
- package/hooks/useFolderModel.d.ts +0 -2
- package/hooks/useFolderModel.js +0 -16
- package/hooks/useFolderModel.js.map +0 -1
- package/hooks/useFoldersType.d.ts +0 -1
- package/hooks/useFoldersType.js +0 -12
- package/hooks/useFoldersType.js.map +0 -1
- package/hooks/useNavigateFolder.d.ts +0 -2
- package/hooks/useNavigateFolder.js +0 -10
- package/hooks/useNavigateFolder.js.map +0 -1
- package/hooks/useRecords.d.ts +0 -62
- package/hooks/useRecords.js +0 -64
- package/hooks/useRecords.js.map +0 -1
- package/hooks/useTags.d.ts +0 -14
- package/hooks/useTags.js +0 -27
- package/hooks/useTags.js.map +0 -1
- package/sorting.d.ts +0 -9
- package/sorting.js +0 -31
- package/sorting.js.map +0 -1
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { Container } from "@webiny/di";
|
|
3
|
+
import { EventPublisher, EventPublisherFeature } from "@webiny/app/features/eventPublisher/index.js";
|
|
4
|
+
import { EnvConfig } from "@webiny/app/features/envConfig/index.js";
|
|
5
|
+
import { WebsocketEvent } from "@webiny/app-websockets/events/WebsocketEvent.js";
|
|
6
|
+
import { GetFolderGateway } from "../getFolder/abstractions.js";
|
|
7
|
+
import { folderCacheFactory } from "../cache/index.js";
|
|
8
|
+
import { Folder } from "../../../domain/folder/Folder.js";
|
|
9
|
+
import { AddCreatedFolderToCache } from "./AddCreatedFolderToCache.js";
|
|
10
|
+
import { RefreshUpdatedFolderInCache } from "./RefreshUpdatedFolderInCache.js";
|
|
11
|
+
import { RemoveDeletedFolderFromCache } from "./RemoveDeletedFolderFromCache.js";
|
|
12
|
+
import { FolderWebsocketMessages } from "./FolderWebsocketMessages.js";
|
|
13
|
+
const folderDto = (overrides = {})=>({
|
|
14
|
+
id: "folder-1",
|
|
15
|
+
title: "Drafts",
|
|
16
|
+
slug: "drafts",
|
|
17
|
+
path: "drafts",
|
|
18
|
+
type: "FmFile",
|
|
19
|
+
parentId: null,
|
|
20
|
+
permissions: [],
|
|
21
|
+
...overrides
|
|
22
|
+
});
|
|
23
|
+
const setup = (folder)=>{
|
|
24
|
+
const fetched = [];
|
|
25
|
+
const container = new Container();
|
|
26
|
+
container.registerInstance(EnvConfig, {
|
|
27
|
+
get: ()=>void 0
|
|
28
|
+
});
|
|
29
|
+
EventPublisherFeature.register(container);
|
|
30
|
+
container.registerInstance(GetFolderGateway, {
|
|
31
|
+
execute: async (id)=>{
|
|
32
|
+
fetched.push(id);
|
|
33
|
+
return folder;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
container.register(AddCreatedFolderToCache);
|
|
37
|
+
container.register(RefreshUpdatedFolderInCache);
|
|
38
|
+
container.register(RemoveDeletedFolderFromCache);
|
|
39
|
+
container.register(FolderWebsocketMessages);
|
|
40
|
+
const receive = (payload)=>container.resolve(EventPublisher).publish(new WebsocketEvent(payload));
|
|
41
|
+
return {
|
|
42
|
+
receive,
|
|
43
|
+
fetched
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
describe("folder events", ()=>{
|
|
47
|
+
beforeEach(()=>{
|
|
48
|
+
folderCacheFactory.getCache("FmFile").clear();
|
|
49
|
+
folderCacheFactory.getCache("cms:article").clear();
|
|
50
|
+
});
|
|
51
|
+
it("adds a folder created on the server to the cache for its type", async ()=>{
|
|
52
|
+
const { receive, fetched } = setup(folderDto());
|
|
53
|
+
await receive({
|
|
54
|
+
action: "aco.folder.created",
|
|
55
|
+
data: {
|
|
56
|
+
id: "folder-1"
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
expect(fetched).toEqual([
|
|
60
|
+
"folder-1"
|
|
61
|
+
]);
|
|
62
|
+
expect(folderCacheFactory.getCache("FmFile").getItem((f)=>"folder-1" === f.id)?.title).toBe("Drafts");
|
|
63
|
+
});
|
|
64
|
+
it("files the folder under its own type, not the one on screen", async ()=>{
|
|
65
|
+
const { receive } = setup(folderDto({
|
|
66
|
+
type: "cms:article"
|
|
67
|
+
}));
|
|
68
|
+
await receive({
|
|
69
|
+
action: "aco.folder.created",
|
|
70
|
+
data: {
|
|
71
|
+
id: "folder-1"
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
expect(folderCacheFactory.getCache("FmFile").hasItems()).toBe(false);
|
|
75
|
+
expect(folderCacheFactory.getCache("cms:article").count()).toBe(1);
|
|
76
|
+
});
|
|
77
|
+
it("keeps one copy when the same folder arrives twice", async ()=>{
|
|
78
|
+
const { receive } = setup(folderDto());
|
|
79
|
+
await receive({
|
|
80
|
+
action: "aco.folder.created",
|
|
81
|
+
data: {
|
|
82
|
+
id: "folder-1"
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
await receive({
|
|
86
|
+
action: "aco.folder.created",
|
|
87
|
+
data: {
|
|
88
|
+
id: "folder-1"
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
expect(folderCacheFactory.getCache("FmFile").count()).toBe(1);
|
|
92
|
+
});
|
|
93
|
+
it("ignores messages that are not about folders", async ()=>{
|
|
94
|
+
const { receive, fetched } = setup(folderDto());
|
|
95
|
+
await receive({
|
|
96
|
+
action: "fm.file.enrichment",
|
|
97
|
+
data: {
|
|
98
|
+
id: "file-1"
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
expect(fetched).toEqual([]);
|
|
102
|
+
expect(folderCacheFactory.getCache("FmFile").hasItems()).toBe(false);
|
|
103
|
+
});
|
|
104
|
+
describe("updates", ()=>{
|
|
105
|
+
const viewer = {
|
|
106
|
+
target: "admin:1",
|
|
107
|
+
level: "viewer"
|
|
108
|
+
};
|
|
109
|
+
const cache = ()=>folderCacheFactory.getCache("FmFile");
|
|
110
|
+
const child = ()=>cache().getItem((f)=>"child-1" === f.id);
|
|
111
|
+
const seed = (parentPermissions, childPermissions)=>{
|
|
112
|
+
cache().addItems([
|
|
113
|
+
Folder.create(folderDto({
|
|
114
|
+
permissions: parentPermissions
|
|
115
|
+
})),
|
|
116
|
+
Folder.create(folderDto({
|
|
117
|
+
id: "child-1",
|
|
118
|
+
slug: "child",
|
|
119
|
+
path: "drafts/child",
|
|
120
|
+
parentId: "folder-1",
|
|
121
|
+
permissions: childPermissions
|
|
122
|
+
}))
|
|
123
|
+
]);
|
|
124
|
+
};
|
|
125
|
+
it("replaces the cached folder with the one the server has now", async ()=>{
|
|
126
|
+
seed([], []);
|
|
127
|
+
const { receive, fetched } = setup(folderDto({
|
|
128
|
+
title: "Renamed",
|
|
129
|
+
permissions: [
|
|
130
|
+
viewer
|
|
131
|
+
]
|
|
132
|
+
}));
|
|
133
|
+
await receive({
|
|
134
|
+
action: "aco.folder.updated",
|
|
135
|
+
data: {
|
|
136
|
+
id: "folder-1"
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
expect(fetched).toEqual([
|
|
140
|
+
"folder-1"
|
|
141
|
+
]);
|
|
142
|
+
const updated = cache().getItem((f)=>"folder-1" === f.id);
|
|
143
|
+
expect(updated?.title).toBe("Renamed");
|
|
144
|
+
expect(updated?.permissions).toEqual([
|
|
145
|
+
viewer
|
|
146
|
+
]);
|
|
147
|
+
});
|
|
148
|
+
it("passes access granted on a parent down to its cached children", async ()=>{
|
|
149
|
+
seed([], []);
|
|
150
|
+
const { receive } = setup(folderDto({
|
|
151
|
+
permissions: [
|
|
152
|
+
viewer
|
|
153
|
+
]
|
|
154
|
+
}));
|
|
155
|
+
await receive({
|
|
156
|
+
action: "aco.folder.updated",
|
|
157
|
+
data: {
|
|
158
|
+
id: "folder-1"
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
expect(child()?.permissions).toEqual([
|
|
162
|
+
{
|
|
163
|
+
...viewer,
|
|
164
|
+
inheritedFrom: "parent:folder-1"
|
|
165
|
+
}
|
|
166
|
+
]);
|
|
167
|
+
});
|
|
168
|
+
it("takes access revoked on a parent away from its cached children", async ()=>{
|
|
169
|
+
seed([
|
|
170
|
+
viewer
|
|
171
|
+
], [
|
|
172
|
+
{
|
|
173
|
+
...viewer,
|
|
174
|
+
inheritedFrom: "parent:folder-1"
|
|
175
|
+
}
|
|
176
|
+
]);
|
|
177
|
+
const { receive } = setup(folderDto({
|
|
178
|
+
permissions: []
|
|
179
|
+
}));
|
|
180
|
+
await receive({
|
|
181
|
+
action: "aco.folder.updated",
|
|
182
|
+
data: {
|
|
183
|
+
id: "folder-1"
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
expect(child()?.permissions).toEqual([]);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe("deletes", ()=>{
|
|
190
|
+
it("removes a deleted folder from the cache it was in", async ()=>{
|
|
191
|
+
folderCacheFactory.getCache("cms:article").addItems([
|
|
192
|
+
Folder.create(folderDto({
|
|
193
|
+
type: "cms:article"
|
|
194
|
+
})),
|
|
195
|
+
Folder.create(folderDto({
|
|
196
|
+
id: "folder-2",
|
|
197
|
+
type: "cms:article"
|
|
198
|
+
}))
|
|
199
|
+
]);
|
|
200
|
+
const { receive, fetched } = setup(folderDto());
|
|
201
|
+
await receive({
|
|
202
|
+
action: "aco.folder.deleted",
|
|
203
|
+
data: {
|
|
204
|
+
id: "folder-1"
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
expect(fetched).toEqual([]);
|
|
208
|
+
expect(folderCacheFactory.getCache("cms:article").getItems().map((f)=>f.id)).toEqual([
|
|
209
|
+
"folder-2"
|
|
210
|
+
]);
|
|
211
|
+
});
|
|
212
|
+
it("ignores a folder the cache never held", async ()=>{
|
|
213
|
+
folderCacheFactory.getCache("FmFile").addItems([
|
|
214
|
+
Folder.create(folderDto())
|
|
215
|
+
]);
|
|
216
|
+
const { receive } = setup(folderDto());
|
|
217
|
+
await receive({
|
|
218
|
+
action: "aco.folder.deleted",
|
|
219
|
+
data: {
|
|
220
|
+
id: "unknown"
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
expect(folderCacheFactory.getCache("FmFile").count()).toBe(1);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
it("ignores an action that only looks like a known key", async ()=>{
|
|
227
|
+
const { receive, fetched } = setup(folderDto());
|
|
228
|
+
await receive({
|
|
229
|
+
action: "toString",
|
|
230
|
+
data: {
|
|
231
|
+
id: "folder-1"
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
expect(fetched).toEqual([]);
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
//# sourceMappingURL=FolderEvents.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/folders/folderEvents/FolderEvents.test.js","sources":["../../../../src/features/folders/folderEvents/FolderEvents.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport {\n EventPublisher,\n EventPublisherFeature\n} from \"@webiny/app/features/eventPublisher/index.js\";\nimport { EnvConfig } from \"@webiny/app/features/envConfig/index.js\";\nimport { WebsocketEvent } from \"@webiny/app-websockets/events/WebsocketEvent.js\";\nimport { GetFolderGateway } from \"~/features/folders/getFolder/abstractions.js\";\nimport { folderCacheFactory } from \"~/features/folders/cache/index.js\";\nimport type { FolderDto } from \"~/domain/folder/FolderDto.js\";\nimport type { FolderPermission } from \"~/types.js\";\nimport { Folder } from \"~/domain/folder/Folder.js\";\nimport { AddCreatedFolderToCache } from \"./AddCreatedFolderToCache.js\";\nimport { RefreshUpdatedFolderInCache } from \"./RefreshUpdatedFolderInCache.js\";\nimport { RemoveDeletedFolderFromCache } from \"./RemoveDeletedFolderFromCache.js\";\nimport { FolderWebsocketMessages } from \"./FolderWebsocketMessages.js\";\n\nconst folderDto = (overrides: Partial<FolderDto> = {}) =>\n ({\n id: \"folder-1\",\n title: \"Drafts\",\n slug: \"drafts\",\n path: \"drafts\",\n type: \"FmFile\",\n parentId: null,\n permissions: [],\n ...overrides\n }) as FolderDto;\n\n/*\n * Real publisher and handlers, fake server. The websocket bridge publishes `WebsocketEvent`s through\n * the same publisher, so publishing one here is what an incoming message does at runtime.\n */\nconst setup = (folder: FolderDto) => {\n const fetched: string[] = [];\n const container = new Container();\n\n // The publisher reads `debug` from here to decide whether to log.\n container.registerInstance(EnvConfig, {\n get: () => undefined\n } as unknown as EnvConfig.Interface);\n EventPublisherFeature.register(container);\n container.registerInstance(GetFolderGateway, {\n execute: async (id: string) => {\n fetched.push(id);\n return folder;\n }\n });\n container.register(AddCreatedFolderToCache);\n container.register(RefreshUpdatedFolderInCache);\n container.register(RemoveDeletedFolderFromCache);\n container.register(FolderWebsocketMessages);\n\n const receive = (payload: { action: string; data: unknown }) =>\n container.resolve(EventPublisher).publish(new WebsocketEvent(payload));\n\n return { receive, fetched };\n};\n\ndescribe(\"folder events\", () => {\n beforeEach(() => {\n folderCacheFactory.getCache(\"FmFile\").clear();\n folderCacheFactory.getCache(\"cms:article\").clear();\n });\n\n it(\"adds a folder created on the server to the cache for its type\", async () => {\n const { receive, fetched } = setup(folderDto());\n\n await receive({ action: \"aco.folder.created\", data: { id: \"folder-1\" } });\n\n expect(fetched).toEqual([\"folder-1\"]);\n expect(folderCacheFactory.getCache(\"FmFile\").getItem(f => f.id === \"folder-1\")?.title).toBe(\n \"Drafts\"\n );\n });\n\n it(\"files the folder under its own type, not the one on screen\", async () => {\n const { receive } = setup(folderDto({ type: \"cms:article\" }));\n\n await receive({ action: \"aco.folder.created\", data: { id: \"folder-1\" } });\n\n expect(folderCacheFactory.getCache(\"FmFile\").hasItems()).toBe(false);\n expect(folderCacheFactory.getCache(\"cms:article\").count()).toBe(1);\n });\n\n it(\"keeps one copy when the same folder arrives twice\", async () => {\n const { receive } = setup(folderDto());\n\n await receive({ action: \"aco.folder.created\", data: { id: \"folder-1\" } });\n await receive({ action: \"aco.folder.created\", data: { id: \"folder-1\" } });\n\n expect(folderCacheFactory.getCache(\"FmFile\").count()).toBe(1);\n });\n\n it(\"ignores messages that are not about folders\", async () => {\n const { receive, fetched } = setup(folderDto());\n\n await receive({ action: \"fm.file.enrichment\", data: { id: \"file-1\" } });\n\n expect(fetched).toEqual([]);\n expect(folderCacheFactory.getCache(\"FmFile\").hasItems()).toBe(false);\n });\n\n describe(\"updates\", () => {\n const viewer: FolderPermission = { target: \"admin:1\", level: \"viewer\" };\n const cache = () => folderCacheFactory.getCache(\"FmFile\");\n const child = () => cache().getItem(f => f.id === \"child-1\");\n\n const seed = (\n parentPermissions: FolderDto[\"permissions\"],\n childPermissions: FolderDto[\"permissions\"]\n ) => {\n cache().addItems([\n Folder.create(folderDto({ permissions: parentPermissions })),\n Folder.create(\n folderDto({\n id: \"child-1\",\n slug: \"child\",\n path: \"drafts/child\",\n parentId: \"folder-1\",\n permissions: childPermissions\n })\n )\n ]);\n };\n\n it(\"replaces the cached folder with the one the server has now\", async () => {\n seed([], []);\n const { receive, fetched } = setup(\n folderDto({ title: \"Renamed\", permissions: [viewer] })\n );\n\n await receive({ action: \"aco.folder.updated\", data: { id: \"folder-1\" } });\n\n expect(fetched).toEqual([\"folder-1\"]);\n const updated = cache().getItem(f => f.id === \"folder-1\");\n expect(updated?.title).toBe(\"Renamed\");\n expect(updated?.permissions).toEqual([viewer]);\n });\n\n it(\"passes access granted on a parent down to its cached children\", async () => {\n seed([], []);\n const { receive } = setup(folderDto({ permissions: [viewer] }));\n\n await receive({ action: \"aco.folder.updated\", data: { id: \"folder-1\" } });\n\n expect(child()?.permissions).toEqual([{ ...viewer, inheritedFrom: \"parent:folder-1\" }]);\n });\n\n it(\"takes access revoked on a parent away from its cached children\", async () => {\n seed([viewer], [{ ...viewer, inheritedFrom: \"parent:folder-1\" }]);\n const { receive } = setup(folderDto({ permissions: [] }));\n\n await receive({ action: \"aco.folder.updated\", data: { id: \"folder-1\" } });\n\n expect(child()?.permissions).toEqual([]);\n });\n });\n\n describe(\"deletes\", () => {\n it(\"removes a deleted folder from the cache it was in\", async () => {\n folderCacheFactory\n .getCache(\"cms:article\")\n .addItems([\n Folder.create(folderDto({ type: \"cms:article\" })),\n Folder.create(folderDto({ id: \"folder-2\", type: \"cms:article\" }))\n ]);\n const { receive, fetched } = setup(folderDto());\n\n await receive({ action: \"aco.folder.deleted\", data: { id: \"folder-1\" } });\n\n // A deleted folder cannot be read back, so nothing is fetched.\n expect(fetched).toEqual([]);\n expect(\n folderCacheFactory\n .getCache(\"cms:article\")\n .getItems()\n .map(f => f.id)\n ).toEqual([\"folder-2\"]);\n });\n\n it(\"ignores a folder the cache never held\", async () => {\n folderCacheFactory.getCache(\"FmFile\").addItems([Folder.create(folderDto())]);\n const { receive } = setup(folderDto());\n\n await receive({ action: \"aco.folder.deleted\", data: { id: \"unknown\" } });\n\n expect(folderCacheFactory.getCache(\"FmFile\").count()).toBe(1);\n });\n });\n\n it(\"ignores an action that only looks like a known key\", async () => {\n const { receive, fetched } = setup(folderDto());\n\n await receive({ action: \"toString\", data: { id: \"folder-1\" } });\n\n expect(fetched).toEqual([]);\n });\n});\n"],"names":["folderDto","overrides","setup","folder","fetched","container","Container","EnvConfig","undefined","EventPublisherFeature","GetFolderGateway","id","AddCreatedFolderToCache","RefreshUpdatedFolderInCache","RemoveDeletedFolderFromCache","FolderWebsocketMessages","receive","payload","EventPublisher","WebsocketEvent","describe","beforeEach","folderCacheFactory","it","expect","f","viewer","cache","child","seed","parentPermissions","childPermissions","Folder","updated"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseEvent } from "@webiny/app/features/eventPublisher/index.js";
|
|
2
|
+
export interface FolderUpdatedPayload {
|
|
3
|
+
id: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* A folder changed and the admin's cache may hold the old version. Like `FolderCreatedEvent`, it
|
|
7
|
+
* says nothing about where the news came from.
|
|
8
|
+
*/
|
|
9
|
+
export declare class FolderUpdatedEvent extends BaseEvent<FolderUpdatedPayload> {
|
|
10
|
+
readonly eventType: "Aco/FolderUpdated";
|
|
11
|
+
getHandlerAbstraction(): import("@webiny/di").Abstraction<import("@webiny/app/features/eventPublisher/abstractions.js").IEventHandler<FolderUpdatedEvent>>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BaseEvent } from "@webiny/app/features/eventPublisher/index.js";
|
|
2
|
+
import { FolderUpdatedEventHandler } from "./abstractions.js";
|
|
3
|
+
class FolderUpdatedEvent extends BaseEvent {
|
|
4
|
+
getHandlerAbstraction() {
|
|
5
|
+
return FolderUpdatedEventHandler;
|
|
6
|
+
}
|
|
7
|
+
constructor(...args){
|
|
8
|
+
super(...args), this.eventType = "Aco/FolderUpdated";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export { FolderUpdatedEvent };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=FolderUpdatedEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/folders/folderEvents/FolderUpdatedEvent.js","sources":["../../../../src/features/folders/folderEvents/FolderUpdatedEvent.ts"],"sourcesContent":["import { BaseEvent } from \"@webiny/app/features/eventPublisher/index.js\";\nimport { FolderUpdatedEventHandler } from \"./abstractions.js\";\n\nexport interface FolderUpdatedPayload {\n id: string;\n}\n\n/**\n * A folder changed and the admin's cache may hold the old version. Like `FolderCreatedEvent`, it\n * says nothing about where the news came from.\n */\nexport class FolderUpdatedEvent extends BaseEvent<FolderUpdatedPayload> {\n readonly eventType = \"Aco/FolderUpdated\" as const;\n\n getHandlerAbstraction() {\n return FolderUpdatedEventHandler;\n }\n}\n"],"names":["FolderUpdatedEvent","BaseEvent","FolderUpdatedEventHandler"],"mappings":";;AAWO,MAAMA,2BAA2BC;IAGpC,wBAAwB;QACpB,OAAOC;IACX;;QALG,qBACM,SAAS,GAAG;;AAKzB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { WebsocketEventHandler } from "@webiny/app-websockets/events/abstractions.js";
|
|
2
|
+
import { EventPublisher } from "@webiny/app/features/eventPublisher/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Turns the folder messages the api sends over the websocket into folder events. The handlers that
|
|
5
|
+
* update the cache listen to those events, so they never depend on how the news arrived.
|
|
6
|
+
*/
|
|
7
|
+
declare class FolderWebsocketMessagesImpl implements WebsocketEventHandler.Interface {
|
|
8
|
+
private eventPublisher;
|
|
9
|
+
constructor(eventPublisher: EventPublisher.Interface);
|
|
10
|
+
handle(event: WebsocketEventHandler.Event): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare const FolderWebsocketMessages: typeof FolderWebsocketMessagesImpl & {
|
|
13
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/app/features/eventPublisher/abstractions.js").IEventHandler<import("@webiny/app-websockets/events/WebsocketEvent.js").WebsocketEvent>>;
|
|
14
|
+
};
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { WebsocketEventHandler } from "@webiny/app-websockets/events/abstractions.js";
|
|
2
|
+
import { EventPublisher } from "@webiny/app/features/eventPublisher/index.js";
|
|
3
|
+
import { FolderCreatedEvent } from "./FolderCreatedEvent.js";
|
|
4
|
+
import { FolderUpdatedEvent } from "./FolderUpdatedEvent.js";
|
|
5
|
+
import { FolderDeletedEvent } from "./FolderDeletedEvent.js";
|
|
6
|
+
const FOLDER_CREATED_ACTION = "aco.folder.created";
|
|
7
|
+
const FOLDER_UPDATED_ACTION = "aco.folder.updated";
|
|
8
|
+
const FOLDER_DELETED_ACTION = "aco.folder.deleted";
|
|
9
|
+
const TO_EVENT = new Map([
|
|
10
|
+
[
|
|
11
|
+
FOLDER_CREATED_ACTION,
|
|
12
|
+
(id)=>new FolderCreatedEvent({
|
|
13
|
+
id
|
|
14
|
+
})
|
|
15
|
+
],
|
|
16
|
+
[
|
|
17
|
+
FOLDER_UPDATED_ACTION,
|
|
18
|
+
(id)=>new FolderUpdatedEvent({
|
|
19
|
+
id
|
|
20
|
+
})
|
|
21
|
+
],
|
|
22
|
+
[
|
|
23
|
+
FOLDER_DELETED_ACTION,
|
|
24
|
+
(id)=>new FolderDeletedEvent({
|
|
25
|
+
id
|
|
26
|
+
})
|
|
27
|
+
]
|
|
28
|
+
]);
|
|
29
|
+
class FolderWebsocketMessagesImpl {
|
|
30
|
+
constructor(eventPublisher){
|
|
31
|
+
this.eventPublisher = eventPublisher;
|
|
32
|
+
}
|
|
33
|
+
async handle(event) {
|
|
34
|
+
const toEvent = TO_EVENT.get(event.payload.action);
|
|
35
|
+
if (!toEvent) return;
|
|
36
|
+
const { data } = event.payload;
|
|
37
|
+
await this.eventPublisher.publish(toEvent(data.id));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const FolderWebsocketMessages = WebsocketEventHandler.createImplementation({
|
|
41
|
+
implementation: FolderWebsocketMessagesImpl,
|
|
42
|
+
dependencies: [
|
|
43
|
+
EventPublisher
|
|
44
|
+
]
|
|
45
|
+
});
|
|
46
|
+
export { FolderWebsocketMessages };
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=FolderWebsocketMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/folders/folderEvents/FolderWebsocketMessages.js","sources":["../../../../src/features/folders/folderEvents/FolderWebsocketMessages.ts"],"sourcesContent":["import { WebsocketEventHandler } from \"@webiny/app-websockets/events/abstractions.js\";\nimport { EventPublisher, type BaseEvent } from \"@webiny/app/features/eventPublisher/index.js\";\nimport { FolderCreatedEvent } from \"./FolderCreatedEvent.js\";\nimport { FolderUpdatedEvent } from \"./FolderUpdatedEvent.js\";\nimport { FolderDeletedEvent } from \"./FolderDeletedEvent.js\";\n\n// Sent by the api when a folder changes; see `NotifyFolderChangeUseCase` in @webiny/api-aco.\nconst FOLDER_CREATED_ACTION = \"aco.folder.created\";\nconst FOLDER_UPDATED_ACTION = \"aco.folder.updated\";\nconst FOLDER_DELETED_ACTION = \"aco.folder.deleted\";\n\ninterface FolderMessageData {\n id: string;\n}\n\nconst TO_EVENT = new Map<string, (id: string) => BaseEvent<{ id: string }>>([\n [FOLDER_CREATED_ACTION, id => new FolderCreatedEvent({ id })],\n [FOLDER_UPDATED_ACTION, id => new FolderUpdatedEvent({ id })],\n [FOLDER_DELETED_ACTION, id => new FolderDeletedEvent({ id })]\n]);\n\n/**\n * Turns the folder messages the api sends over the websocket into folder events. The handlers that\n * update the cache listen to those events, so they never depend on how the news arrived.\n */\nclass FolderWebsocketMessagesImpl implements WebsocketEventHandler.Interface {\n constructor(private eventPublisher: EventPublisher.Interface) {}\n\n async handle(event: WebsocketEventHandler.Event): Promise<void> {\n const toEvent = TO_EVENT.get(event.payload.action);\n if (!toEvent) {\n return;\n }\n\n const { data } = event.payload as unknown as { data: FolderMessageData };\n await this.eventPublisher.publish(toEvent(data.id));\n }\n}\n\nexport const FolderWebsocketMessages = WebsocketEventHandler.createImplementation({\n implementation: FolderWebsocketMessagesImpl,\n dependencies: [EventPublisher]\n});\n"],"names":["FOLDER_CREATED_ACTION","FOLDER_UPDATED_ACTION","FOLDER_DELETED_ACTION","TO_EVENT","Map","id","FolderCreatedEvent","FolderUpdatedEvent","FolderDeletedEvent","FolderWebsocketMessagesImpl","eventPublisher","event","toEvent","data","FolderWebsocketMessages","WebsocketEventHandler","EventPublisher"],"mappings":";;;;;AAOA,MAAMA,wBAAwB;AAC9B,MAAMC,wBAAwB;AAC9B,MAAMC,wBAAwB;AAM9B,MAAMC,WAAW,IAAIC,IAAuD;IACxE;QAACJ;QAAuBK,CAAAA,KAAM,IAAIC,mBAAmB;gBAAED;YAAG;KAAG;IAC7D;QAACJ;QAAuBI,CAAAA,KAAM,IAAIE,mBAAmB;gBAAEF;YAAG;KAAG;IAC7D;QAACH;QAAuBG,CAAAA,KAAM,IAAIG,mBAAmB;gBAAEH;YAAG;KAAG;CAChE;AAMD,MAAMI;IACF,YAAoBC,cAAwC,CAAE;aAA1CA,cAAc,GAAdA;IAA2C;IAE/D,MAAM,OAAOC,KAAkC,EAAiB;QAC5D,MAAMC,UAAUT,SAAS,GAAG,CAACQ,MAAM,OAAO,CAAC,MAAM;QACjD,IAAI,CAACC,SACD;QAGJ,MAAM,EAAEC,IAAI,EAAE,GAAGF,MAAM,OAAO;QAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAACC,QAAQC,KAAK,EAAE;IACrD;AACJ;AAEO,MAAMC,0BAA0BC,sBAAsB,oBAAoB,CAAC;IAC9E,gBAAgBN;IAChB,cAAc;QAACO;KAAe;AAClC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { GetFolderGateway } from "../../../features/folders/getFolder/abstractions.js";
|
|
2
|
+
import { FolderUpdatedEventHandler } from "./abstractions.js";
|
|
3
|
+
/**
|
|
4
|
+
* Reads the folder back and replaces it in the cache for its type, then re-derives the inherited
|
|
5
|
+
* permissions of its cached descendants. An access change on a parent changes what every folder
|
|
6
|
+
* below it inherits, and the server only sent the one id.
|
|
7
|
+
*
|
|
8
|
+
* Same reasons as `AddCreatedFolderToCache` for reading back and for reaching the cache through
|
|
9
|
+
* `folderCacheFactory`.
|
|
10
|
+
*/
|
|
11
|
+
declare class RefreshUpdatedFolderInCacheImpl implements FolderUpdatedEventHandler.Interface {
|
|
12
|
+
private getFolder;
|
|
13
|
+
constructor(getFolder: GetFolderGateway.Interface);
|
|
14
|
+
handle(event: FolderUpdatedEventHandler.Event): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare const RefreshUpdatedFolderInCache: typeof RefreshUpdatedFolderInCacheImpl & {
|
|
17
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/app/features/eventPublisher/abstractions.js").IEventHandler<import("./FolderUpdatedEvent.js").FolderUpdatedEvent>>;
|
|
18
|
+
};
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { GetFolderGateway } from "../getFolder/abstractions.js";
|
|
2
|
+
import { folderCacheFactory } from "../cache/index.js";
|
|
3
|
+
import { updateDescendantPermissions } from "../cache/updateDescendantPermissions.js";
|
|
4
|
+
import { Folder } from "../../../domain/folder/Folder.js";
|
|
5
|
+
import { FolderUpdatedEventHandler } from "./abstractions.js";
|
|
6
|
+
class RefreshUpdatedFolderInCacheImpl {
|
|
7
|
+
constructor(getFolder){
|
|
8
|
+
this.getFolder = getFolder;
|
|
9
|
+
}
|
|
10
|
+
async handle(event) {
|
|
11
|
+
const folder = Folder.create(await this.getFolder.execute(event.payload.id));
|
|
12
|
+
const cache = folderCacheFactory.getCache(folder.type);
|
|
13
|
+
cache.addItems([
|
|
14
|
+
folder
|
|
15
|
+
]);
|
|
16
|
+
updateDescendantPermissions(cache, folder);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const RefreshUpdatedFolderInCache = FolderUpdatedEventHandler.createImplementation({
|
|
20
|
+
implementation: RefreshUpdatedFolderInCacheImpl,
|
|
21
|
+
dependencies: [
|
|
22
|
+
GetFolderGateway
|
|
23
|
+
]
|
|
24
|
+
});
|
|
25
|
+
export { RefreshUpdatedFolderInCache };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=RefreshUpdatedFolderInCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/folders/folderEvents/RefreshUpdatedFolderInCache.js","sources":["../../../../src/features/folders/folderEvents/RefreshUpdatedFolderInCache.ts"],"sourcesContent":["import { GetFolderGateway } from \"~/features/folders/getFolder/abstractions.js\";\nimport { folderCacheFactory } from \"~/features/folders/cache/index.js\";\nimport { updateDescendantPermissions } from \"~/features/folders/cache/updateDescendantPermissions.js\";\nimport { Folder } from \"~/domain/folder/Folder.js\";\nimport { FolderUpdatedEventHandler } from \"./abstractions.js\";\n\n/**\n * Reads the folder back and replaces it in the cache for its type, then re-derives the inherited\n * permissions of its cached descendants. An access change on a parent changes what every folder\n * below it inherits, and the server only sent the one id.\n *\n * Same reasons as `AddCreatedFolderToCache` for reading back and for reaching the cache through\n * `folderCacheFactory`.\n */\nclass RefreshUpdatedFolderInCacheImpl implements FolderUpdatedEventHandler.Interface {\n constructor(private getFolder: GetFolderGateway.Interface) {}\n\n async handle(event: FolderUpdatedEventHandler.Event): Promise<void> {\n const folder = Folder.create(await this.getFolder.execute(event.payload.id));\n const cache = folderCacheFactory.getCache(folder.type);\n\n cache.addItems([folder]);\n updateDescendantPermissions(cache, folder);\n }\n}\n\nexport const RefreshUpdatedFolderInCache = FolderUpdatedEventHandler.createImplementation({\n implementation: RefreshUpdatedFolderInCacheImpl,\n dependencies: [GetFolderGateway]\n});\n"],"names":["RefreshUpdatedFolderInCacheImpl","getFolder","event","folder","Folder","cache","folderCacheFactory","updateDescendantPermissions","RefreshUpdatedFolderInCache","FolderUpdatedEventHandler","GetFolderGateway"],"mappings":";;;;;AAcA,MAAMA;IACF,YAAoBC,SAAqC,CAAE;aAAvCA,SAAS,GAATA;IAAwC;IAE5D,MAAM,OAAOC,KAAsC,EAAiB;QAChE,MAAMC,SAASC,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAACF,MAAM,OAAO,CAAC,EAAE;QAC1E,MAAMG,QAAQC,mBAAmB,QAAQ,CAACH,OAAO,IAAI;QAErDE,MAAM,QAAQ,CAAC;YAACF;SAAO;QACvBI,4BAA4BF,OAAOF;IACvC;AACJ;AAEO,MAAMK,8BAA8BC,0BAA0B,oBAAoB,CAAC;IACtF,gBAAgBT;IAChB,cAAc;QAACU;KAAiB;AACpC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FolderDeletedEventHandler } from "./abstractions.js";
|
|
2
|
+
/**
|
|
3
|
+
* Takes the folder out of the cache. A deleted folder cannot be read back to learn its type, so it
|
|
4
|
+
* is removed by id from every folder type's cache; ids are unique across types, so nothing else
|
|
5
|
+
* matches. Only empty folders can be deleted, so there are no cached children to clean up.
|
|
6
|
+
*/
|
|
7
|
+
declare class RemoveDeletedFolderFromCacheImpl implements FolderDeletedEventHandler.Interface {
|
|
8
|
+
handle(event: FolderDeletedEventHandler.Event): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare const RemoveDeletedFolderFromCache: typeof RemoveDeletedFolderFromCacheImpl & {
|
|
11
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/app/features/eventPublisher/abstractions.js").IEventHandler<import("./FolderDeletedEvent.js").FolderDeletedEvent>>;
|
|
12
|
+
};
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { folderCacheFactory } from "../cache/index.js";
|
|
2
|
+
import { FolderDeletedEventHandler } from "./abstractions.js";
|
|
3
|
+
class RemoveDeletedFolderFromCacheImpl {
|
|
4
|
+
async handle(event) {
|
|
5
|
+
const { id } = event.payload;
|
|
6
|
+
for (const cache of folderCacheFactory.getCaches())cache.removeItems((folder)=>folder.id === id);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
const RemoveDeletedFolderFromCache = FolderDeletedEventHandler.createImplementation({
|
|
10
|
+
implementation: RemoveDeletedFolderFromCacheImpl,
|
|
11
|
+
dependencies: []
|
|
12
|
+
});
|
|
13
|
+
export { RemoveDeletedFolderFromCache };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=RemoveDeletedFolderFromCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/folders/folderEvents/RemoveDeletedFolderFromCache.js","sources":["../../../../src/features/folders/folderEvents/RemoveDeletedFolderFromCache.ts"],"sourcesContent":["import { folderCacheFactory } from \"~/features/folders/cache/index.js\";\nimport { FolderDeletedEventHandler } from \"./abstractions.js\";\n\n/**\n * Takes the folder out of the cache. A deleted folder cannot be read back to learn its type, so it\n * is removed by id from every folder type's cache; ids are unique across types, so nothing else\n * matches. Only empty folders can be deleted, so there are no cached children to clean up.\n */\nclass RemoveDeletedFolderFromCacheImpl implements FolderDeletedEventHandler.Interface {\n async handle(event: FolderDeletedEventHandler.Event): Promise<void> {\n const { id } = event.payload;\n\n for (const cache of folderCacheFactory.getCaches()) {\n cache.removeItems(folder => folder.id === id);\n }\n }\n}\n\nexport const RemoveDeletedFolderFromCache = FolderDeletedEventHandler.createImplementation({\n implementation: RemoveDeletedFolderFromCacheImpl,\n dependencies: []\n});\n"],"names":["RemoveDeletedFolderFromCacheImpl","event","id","cache","folderCacheFactory","folder","RemoveDeletedFolderFromCache","FolderDeletedEventHandler"],"mappings":";;AAQA,MAAMA;IACF,MAAM,OAAOC,KAAsC,EAAiB;QAChE,MAAM,EAAEC,EAAE,EAAE,GAAGD,MAAM,OAAO;QAE5B,KAAK,MAAME,SAASC,mBAAmB,SAAS,GAC5CD,MAAM,WAAW,CAACE,CAAAA,SAAUA,OAAO,EAAE,KAAKH;IAElD;AACJ;AAEO,MAAMI,+BAA+BC,0BAA0B,oBAAoB,CAAC;IACvF,gBAAgBP;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { IEventHandler } from "@webiny/app/features/eventPublisher/index.js";
|
|
2
|
+
import type { FolderCreatedEvent } from "./FolderCreatedEvent.js";
|
|
3
|
+
import type { FolderUpdatedEvent } from "./FolderUpdatedEvent.js";
|
|
4
|
+
import type { FolderDeletedEvent } from "./FolderDeletedEvent.js";
|
|
5
|
+
/**
|
|
6
|
+
* Reacts to a folder created somewhere the admin did not see: by the assistant, a background task,
|
|
7
|
+
* or anything else on the server. Folders the admin creates itself are already in its cache.
|
|
8
|
+
*/
|
|
9
|
+
export declare const FolderCreatedEventHandler: import("@webiny/di").Abstraction<IEventHandler<FolderCreatedEvent>>;
|
|
10
|
+
export declare namespace FolderCreatedEventHandler {
|
|
11
|
+
type Interface = IEventHandler<FolderCreatedEvent>;
|
|
12
|
+
type Event = FolderCreatedEvent;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Reacts to a folder changed somewhere the admin did not see, such as the assistant granting or
|
|
16
|
+
* revoking access. Changes the admin makes itself already update its cache.
|
|
17
|
+
*/
|
|
18
|
+
export declare const FolderUpdatedEventHandler: import("@webiny/di").Abstraction<IEventHandler<FolderUpdatedEvent>>;
|
|
19
|
+
export declare namespace FolderUpdatedEventHandler {
|
|
20
|
+
type Interface = IEventHandler<FolderUpdatedEvent>;
|
|
21
|
+
type Event = FolderUpdatedEvent;
|
|
22
|
+
}
|
|
23
|
+
/** Reacts to a folder deleted somewhere the admin did not see, such as by the assistant. */
|
|
24
|
+
export declare const FolderDeletedEventHandler: import("@webiny/di").Abstraction<IEventHandler<FolderDeletedEvent>>;
|
|
25
|
+
export declare namespace FolderDeletedEventHandler {
|
|
26
|
+
type Interface = IEventHandler<FolderDeletedEvent>;
|
|
27
|
+
type Event = FolderDeletedEvent;
|
|
28
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { createAbstraction } from "@webiny/feature/admin";
|
|
2
|
+
const FolderCreatedEventHandler = createAbstraction("Aco/FolderCreatedEventHandler");
|
|
3
|
+
const FolderUpdatedEventHandler = createAbstraction("Aco/FolderUpdatedEventHandler");
|
|
4
|
+
const FolderDeletedEventHandler = createAbstraction("Aco/FolderDeletedEventHandler");
|
|
5
|
+
export { FolderCreatedEventHandler, FolderDeletedEventHandler, FolderUpdatedEventHandler };
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=abstractions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/folders/folderEvents/abstractions.js","sources":["../../../../src/features/folders/folderEvents/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { IEventHandler } from \"@webiny/app/features/eventPublisher/index.js\";\nimport type { FolderCreatedEvent } from \"./FolderCreatedEvent.js\";\nimport type { FolderUpdatedEvent } from \"./FolderUpdatedEvent.js\";\nimport type { FolderDeletedEvent } from \"./FolderDeletedEvent.js\";\n\n/**\n * Reacts to a folder created somewhere the admin did not see: by the assistant, a background task,\n * or anything else on the server. Folders the admin creates itself are already in its cache.\n */\nexport const FolderCreatedEventHandler = createAbstraction<IEventHandler<FolderCreatedEvent>>(\n \"Aco/FolderCreatedEventHandler\"\n);\n\nexport namespace FolderCreatedEventHandler {\n export type Interface = IEventHandler<FolderCreatedEvent>;\n export type Event = FolderCreatedEvent;\n}\n\n/**\n * Reacts to a folder changed somewhere the admin did not see, such as the assistant granting or\n * revoking access. Changes the admin makes itself already update its cache.\n */\nexport const FolderUpdatedEventHandler = createAbstraction<IEventHandler<FolderUpdatedEvent>>(\n \"Aco/FolderUpdatedEventHandler\"\n);\n\nexport namespace FolderUpdatedEventHandler {\n export type Interface = IEventHandler<FolderUpdatedEvent>;\n export type Event = FolderUpdatedEvent;\n}\n\n/** Reacts to a folder deleted somewhere the admin did not see, such as by the assistant. */\nexport const FolderDeletedEventHandler = createAbstraction<IEventHandler<FolderDeletedEvent>>(\n \"Aco/FolderDeletedEventHandler\"\n);\n\nexport namespace FolderDeletedEventHandler {\n export type Interface = IEventHandler<FolderDeletedEvent>;\n export type Event = FolderDeletedEvent;\n}\n"],"names":["FolderCreatedEventHandler","createAbstraction","FolderUpdatedEventHandler","FolderDeletedEventHandler"],"mappings":";AAUO,MAAMA,4BAA4BC,kBACrC;AAYG,MAAMC,4BAA4BD,kBACrC;AASG,MAAME,4BAA4BF,kBACrC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keeps folder caches current when folders change on the server. Registered once, in the container
|
|
3
|
+
* the websocket bridge publishes from, because the news can arrive while no folder view is open.
|
|
4
|
+
*
|
|
5
|
+
* Registers its own folder model provider. The one `FolderModelProviderModule` registers lives in a
|
|
6
|
+
* child of this container, and a container only looks up to its parents, so the gateway below could
|
|
7
|
+
* not reach it. The model is fetched on the first event, not at startup.
|
|
8
|
+
*/
|
|
9
|
+
export declare const FolderEventsFeature: import("@webiny/feature/admin").FeatureDefinition<any, []>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/admin";
|
|
2
|
+
import { GetFolderGqlGateway } from "../getFolder/GetFolderGqlGateway.js";
|
|
3
|
+
import { FolderModelProviderFeature } from "../folderModelProvider/feature.js";
|
|
4
|
+
import { AddCreatedFolderToCache } from "./AddCreatedFolderToCache.js";
|
|
5
|
+
import { RefreshUpdatedFolderInCache } from "./RefreshUpdatedFolderInCache.js";
|
|
6
|
+
import { RemoveDeletedFolderFromCache } from "./RemoveDeletedFolderFromCache.js";
|
|
7
|
+
import { FolderWebsocketMessages } from "./FolderWebsocketMessages.js";
|
|
8
|
+
const FolderEventsFeature = createFeature({
|
|
9
|
+
name: "Aco/FolderEvents",
|
|
10
|
+
register (container) {
|
|
11
|
+
FolderModelProviderFeature.register(container);
|
|
12
|
+
container.register(GetFolderGqlGateway);
|
|
13
|
+
container.register(AddCreatedFolderToCache);
|
|
14
|
+
container.register(RefreshUpdatedFolderInCache);
|
|
15
|
+
container.register(RemoveDeletedFolderFromCache);
|
|
16
|
+
container.register(FolderWebsocketMessages);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
export { FolderEventsFeature };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/folders/folderEvents/feature.js","sources":["../../../../src/features/folders/folderEvents/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { GetFolderGqlGateway } from \"~/features/folders/getFolder/GetFolderGqlGateway.js\";\nimport { FolderModelProviderFeature } from \"~/features/folders/folderModelProvider/feature.js\";\nimport { AddCreatedFolderToCache } from \"./AddCreatedFolderToCache.js\";\nimport { RefreshUpdatedFolderInCache } from \"./RefreshUpdatedFolderInCache.js\";\nimport { RemoveDeletedFolderFromCache } from \"./RemoveDeletedFolderFromCache.js\";\nimport { FolderWebsocketMessages } from \"./FolderWebsocketMessages.js\";\n\n/**\n * Keeps folder caches current when folders change on the server. Registered once, in the container\n * the websocket bridge publishes from, because the news can arrive while no folder view is open.\n *\n * Registers its own folder model provider. The one `FolderModelProviderModule` registers lives in a\n * child of this container, and a container only looks up to its parents, so the gateway below could\n * not reach it. The model is fetched on the first event, not at startup.\n */\nexport const FolderEventsFeature = createFeature({\n name: \"Aco/FolderEvents\",\n register(container) {\n FolderModelProviderFeature.register(container);\n container.register(GetFolderGqlGateway);\n container.register(AddCreatedFolderToCache);\n container.register(RefreshUpdatedFolderInCache);\n container.register(RemoveDeletedFolderFromCache);\n container.register(FolderWebsocketMessages);\n }\n});\n"],"names":["FolderEventsFeature","createFeature","container","FolderModelProviderFeature","GetFolderGqlGateway","AddCreatedFolderToCache","RefreshUpdatedFolderInCache","RemoveDeletedFolderFromCache","FolderWebsocketMessages"],"mappings":";;;;;;;AAgBO,MAAMA,sBAAsBC,cAAc;IAC7C,MAAM;IACN,UAASC,SAAS;QACdC,2BAA2B,QAAQ,CAACD;QACpCA,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QACnBH,UAAU,QAAQ,CAACI;QACnBJ,UAAU,QAAQ,CAACK;QACnBL,UAAU,QAAQ,CAACM;IACvB;AACJ"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { FolderEventsFeature } from "./feature.js";
|
|
2
|
+
export { FolderCreatedEvent, type FolderCreatedPayload } from "./FolderCreatedEvent.js";
|
|
3
|
+
export { FolderUpdatedEvent, type FolderUpdatedPayload } from "./FolderUpdatedEvent.js";
|
|
4
|
+
export { FolderDeletedEvent, type FolderDeletedPayload } from "./FolderDeletedEvent.js";
|
|
5
|
+
export { FolderCreatedEventHandler, FolderUpdatedEventHandler, FolderDeletedEventHandler } from "./abstractions.js";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { FolderEventsFeature } from "./feature.js";
|
|
2
|
+
export { FolderCreatedEvent } from "./FolderCreatedEvent.js";
|
|
3
|
+
export { FolderUpdatedEvent } from "./FolderUpdatedEvent.js";
|
|
4
|
+
export { FolderDeletedEvent } from "./FolderDeletedEvent.js";
|
|
5
|
+
export { FolderCreatedEventHandler, FolderDeletedEventHandler, FolderUpdatedEventHandler } from "./abstractions.js";
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { createFieldsList } from "@webiny/app-headless-cms-common";
|
|
2
1
|
import { GetFolderModelRepository } from "./abstractions.js";
|
|
3
2
|
import { FolderModelProvider } from "../abstractions.js";
|
|
4
3
|
class FolderModelProviderImpl {
|
|
@@ -13,38 +12,38 @@ class FolderModelProviderImpl {
|
|
|
13
12
|
}
|
|
14
13
|
async getGraphQLSelection() {
|
|
15
14
|
const model = await this.getModel();
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
});
|
|
20
|
-
return `{
|
|
21
|
-
id
|
|
22
|
-
createdOn
|
|
23
|
-
createdBy {
|
|
15
|
+
const valuesBlock = model.valuesSelection && "_empty" !== model.valuesSelection ? model.valuesSelection : "";
|
|
16
|
+
return `
|
|
17
|
+
{
|
|
24
18
|
id
|
|
25
|
-
|
|
19
|
+
createdOn
|
|
20
|
+
createdBy {
|
|
21
|
+
id
|
|
22
|
+
displayName
|
|
23
|
+
}
|
|
24
|
+
savedOn
|
|
25
|
+
savedBy {
|
|
26
|
+
id
|
|
27
|
+
displayName
|
|
28
|
+
}
|
|
29
|
+
modifiedOn
|
|
30
|
+
modifiedBy {
|
|
31
|
+
id
|
|
32
|
+
displayName
|
|
33
|
+
}
|
|
34
|
+
permissions {
|
|
35
|
+
target
|
|
36
|
+
level
|
|
37
|
+
inheritedFrom
|
|
38
|
+
plugin
|
|
39
|
+
}
|
|
40
|
+
hasNonInheritedPermissions
|
|
41
|
+
canManagePermissions
|
|
42
|
+
canManageStructure
|
|
43
|
+
canManageContent
|
|
44
|
+
${valuesBlock}
|
|
26
45
|
}
|
|
27
|
-
|
|
28
|
-
savedBy {
|
|
29
|
-
id
|
|
30
|
-
displayName
|
|
31
|
-
}
|
|
32
|
-
modifiedOn
|
|
33
|
-
modifiedBy {
|
|
34
|
-
id
|
|
35
|
-
displayName
|
|
36
|
-
}
|
|
37
|
-
permissions {
|
|
38
|
-
target
|
|
39
|
-
level
|
|
40
|
-
inheritedFrom
|
|
41
|
-
}
|
|
42
|
-
hasNonInheritedPermissions
|
|
43
|
-
canManagePermissions
|
|
44
|
-
canManageStructure
|
|
45
|
-
canManageContent
|
|
46
|
-
${fields}
|
|
47
|
-
}`;
|
|
46
|
+
`;
|
|
48
47
|
}
|
|
49
48
|
}
|
|
50
49
|
const FolderModelProvider_FolderModelProvider = FolderModelProvider.createImplementation({
|