@webiny/api-headless-cms-tasks 6.3.0 → 6.4.0-beta.1
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/constants.js +2 -1
- package/constants.js.map +1 -1
- package/features/DeleteModelTask/DeleteModel.js +92 -119
- package/features/DeleteModelTask/DeleteModel.js.map +1 -1
- package/features/DeleteModelTask/DeleteModelTask.js +33 -31
- package/features/DeleteModelTask/DeleteModelTask.js.map +1 -1
- package/features/DeleteModelTask/feature.js +6 -5
- package/features/DeleteModelTask/feature.js.map +1 -1
- package/features/DeleteModelTask/types.js +7 -6
- package/features/DeleteModelTask/types.js.map +1 -1
- package/features/DisableModel/BlockActionIfModelDisabled.js +9 -10
- package/features/DisableModel/BlockActionIfModelDisabled.js.map +1 -1
- package/features/DisableModel/abstractions.js +2 -1
- package/features/DisableModel/abstractions.js.map +1 -1
- package/features/DisableModel/feature.js +18 -22
- package/features/DisableModel/feature.js.map +1 -1
- package/features/DisableModel/handlers/BlockModelActionOnEntryBeforeCreate.js +12 -9
- package/features/DisableModel/handlers/BlockModelActionOnEntryBeforeCreate.js.map +1 -1
- package/features/DisableModel/handlers/BlockModelActionOnEntryBeforeMove.js +12 -9
- package/features/DisableModel/handlers/BlockModelActionOnEntryBeforeMove.js.map +1 -1
- package/features/DisableModel/handlers/BlockModelActionOnEntryBeforePublish.js +12 -9
- package/features/DisableModel/handlers/BlockModelActionOnEntryBeforePublish.js.map +1 -1
- package/features/DisableModel/handlers/BlockModelActionOnEntryBeforeRepublish.js +12 -9
- package/features/DisableModel/handlers/BlockModelActionOnEntryBeforeRepublish.js.map +1 -1
- package/features/DisableModel/handlers/BlockModelActionOnEntryBeforeRestoreFromBin.js +12 -9
- package/features/DisableModel/handlers/BlockModelActionOnEntryBeforeRestoreFromBin.js.map +1 -1
- package/features/DisableModel/handlers/BlockModelActionOnEntryBeforeUnpublish.js +12 -9
- package/features/DisableModel/handlers/BlockModelActionOnEntryBeforeUnpublish.js.map +1 -1
- package/features/DisableModel/handlers/BlockModelActionOnEntryBeforeUpdate.js +12 -9
- package/features/DisableModel/handlers/BlockModelActionOnEntryBeforeUpdate.js.map +1 -1
- package/features/DisableModel/handlers/BlockModelActionOnEntryRevisionBeforeCreate.js +12 -9
- package/features/DisableModel/handlers/BlockModelActionOnEntryRevisionBeforeCreate.js.map +1 -1
- package/features/DisableModel/handlers/BlockModelActionOnModelBeforeCreateFrom.js +12 -9
- package/features/DisableModel/handlers/BlockModelActionOnModelBeforeCreateFrom.js.map +1 -1
- package/features/DisableModel/handlers/BlockModelActionOnModelBeforeUpdate.js +12 -9
- package/features/DisableModel/handlers/BlockModelActionOnModelBeforeUpdate.js.map +1 -1
- package/features/DisableModel/index.js +0 -2
- package/graphql/deleteModel/cancelDeleteModel.js +45 -55
- package/graphql/deleteModel/cancelDeleteModel.js.map +1 -1
- package/graphql/deleteModel/crud.js +52 -61
- package/graphql/deleteModel/crud.js.map +1 -1
- package/graphql/deleteModel/fullyDeleteModel.js +44 -56
- package/graphql/deleteModel/fullyDeleteModel.js.map +1 -1
- package/graphql/deleteModel/getDeleteModelProgress.js +42 -54
- package/graphql/deleteModel/getDeleteModelProgress.js.map +1 -1
- package/graphql/deleteModel/index.js +78 -101
- package/graphql/deleteModel/index.js.map +1 -1
- package/graphql/deleteModel/status.js +13 -12
- package/graphql/deleteModel/status.js.map +1 -1
- package/helpers/confirmation.js +6 -12
- package/helpers/confirmation.js.map +1 -1
- package/helpers/store.js +9 -14
- package/helpers/store.js.map +1 -1
- package/index.js +15 -8
- package/index.js.map +1 -1
- package/package.json +21 -21
- package/types.js +0 -3
- package/features/DisableModel/index.js.map +0 -1
- package/types.js.map +0 -1
package/constants.js
CHANGED
package/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["export const DELETE_MODEL_TASK = \"deleteModelAndEntries\";\n"],"names":["DELETE_MODEL_TASK"],"mappings":"AAAO,MAAMA,oBAAoB"}
|
|
@@ -1,131 +1,104 @@
|
|
|
1
1
|
import { ListFoldersUseCase } from "@webiny/api-aco/features/folder/ListFolders/index.js";
|
|
2
2
|
import { DeleteFolderUseCase } from "@webiny/api-aco/features/folder/DeleteFolder/index.js";
|
|
3
3
|
import { createStoreKey } from "../../helpers/store.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
4
|
+
class DeleteModel {
|
|
5
|
+
constructor(context){
|
|
6
|
+
this.context = context;
|
|
7
|
+
}
|
|
8
|
+
async run(params) {
|
|
9
|
+
const { input, controller } = params;
|
|
10
|
+
const model = await this.getModel(input.modelId);
|
|
11
|
+
let hasMoreItems = false;
|
|
12
|
+
let lastDeletedId = input.lastDeletedId;
|
|
13
|
+
do {
|
|
14
|
+
if (controller.runtime.isAborted()) {
|
|
15
|
+
await this.removeBeingDeleted(model);
|
|
16
|
+
return controller.response.aborted();
|
|
17
|
+
}
|
|
18
|
+
if (controller.runtime.isCloseToTimeout()) return controller.response.continue({
|
|
19
|
+
...input,
|
|
20
|
+
lastDeletedId
|
|
21
|
+
});
|
|
22
|
+
const where = {
|
|
23
|
+
latest: true
|
|
24
|
+
};
|
|
25
|
+
if (lastDeletedId) where.entryId_gte = lastDeletedId;
|
|
26
|
+
const { items, hasMoreItems: metaHasMoreItems } = await this.context.cms.storageOperations.entries.list(model, {
|
|
27
|
+
limit: 1000,
|
|
28
|
+
where,
|
|
29
|
+
sort: [
|
|
30
|
+
"entryId_ASC"
|
|
31
|
+
]
|
|
32
|
+
});
|
|
33
|
+
for (const item of items){
|
|
34
|
+
try {
|
|
35
|
+
await this.context.cms.deleteEntry(model, item.id, {
|
|
36
|
+
permanently: true,
|
|
37
|
+
force: true
|
|
38
|
+
});
|
|
39
|
+
} catch {
|
|
40
|
+
console.error("Failed to delete entry.", {
|
|
41
|
+
model: model.modelId,
|
|
42
|
+
id: item.id
|
|
43
|
+
});
|
|
44
|
+
return controller.response.error(new Error(`Failed to delete entry "${item.id}". Cannot continue.`));
|
|
45
|
+
}
|
|
46
|
+
lastDeletedId = item.entryId;
|
|
47
|
+
}
|
|
48
|
+
hasMoreItems = metaHasMoreItems;
|
|
49
|
+
}while (hasMoreItems)
|
|
50
|
+
const { items } = await this.context.cms.storageOperations.entries.list(model, {
|
|
51
|
+
limit: 1,
|
|
52
|
+
where: {
|
|
53
|
+
latest: true
|
|
54
|
+
}
|
|
27
55
|
});
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const {
|
|
36
|
-
items,
|
|
37
|
-
hasMoreItems: metaHasMoreItems
|
|
38
|
-
} = await this.context.cms.storageOperations.entries.list(model, {
|
|
39
|
-
limit: 1000,
|
|
40
|
-
where,
|
|
41
|
-
sort: ["entryId_ASC"]
|
|
42
|
-
});
|
|
43
|
-
for (const item of items) {
|
|
44
|
-
try {
|
|
45
|
-
await this.context.cms.deleteEntry(model, item.id, {
|
|
46
|
-
permanently: true,
|
|
47
|
-
force: true
|
|
48
|
-
});
|
|
49
|
-
} catch {
|
|
50
|
-
console.error("Failed to delete entry.", {
|
|
51
|
-
model: model.modelId,
|
|
52
|
-
id: item.id
|
|
53
|
-
});
|
|
54
|
-
return controller.response.error(new Error(`Failed to delete entry "${item.id}". Cannot continue.`));
|
|
56
|
+
if (items.length > 0) {
|
|
57
|
+
console.log("There are still items to be deleted. Continuing the task.");
|
|
58
|
+
return controller.response.continue({
|
|
59
|
+
...input
|
|
60
|
+
}, {
|
|
61
|
+
seconds: 5
|
|
62
|
+
});
|
|
55
63
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const deleteFolder = this.context.container.resolve(DeleteFolderUseCase);
|
|
82
|
-
do {
|
|
83
|
-
const listResult = await listFolders.execute({
|
|
84
|
-
where: {
|
|
85
|
-
type: `cms:${model.modelId}`
|
|
86
|
-
},
|
|
87
|
-
limit: 1000
|
|
88
|
-
});
|
|
89
|
-
const {
|
|
90
|
-
folders,
|
|
91
|
-
meta
|
|
92
|
-
} = listResult.value;
|
|
93
|
-
for (const item of folders) {
|
|
94
|
-
const result = await deleteFolder.execute(item.id);
|
|
95
|
-
if (result.isFail()) {
|
|
96
|
-
return controller.response.error(result.error);
|
|
64
|
+
let hasMoreFolders = false;
|
|
65
|
+
const listFolders = this.context.container.resolve(ListFoldersUseCase);
|
|
66
|
+
const deleteFolder = this.context.container.resolve(DeleteFolderUseCase);
|
|
67
|
+
do {
|
|
68
|
+
const listResult = await listFolders.execute({
|
|
69
|
+
where: {
|
|
70
|
+
type: `cms:${model.modelId}`
|
|
71
|
+
},
|
|
72
|
+
limit: 1000
|
|
73
|
+
});
|
|
74
|
+
const { folders, meta } = listResult.value;
|
|
75
|
+
for (const item of folders){
|
|
76
|
+
const result = await deleteFolder.execute(item.id);
|
|
77
|
+
if (result.isFail()) return controller.response.error(result.error);
|
|
78
|
+
}
|
|
79
|
+
hasMoreFolders = meta.hasMoreItems;
|
|
80
|
+
}while (hasMoreFolders)
|
|
81
|
+
await this.removeBeingDeleted(model);
|
|
82
|
+
if (model.isPlugin) return controller.response.done();
|
|
83
|
+
try {
|
|
84
|
+
await this.context.cms.deleteModel(model.modelId);
|
|
85
|
+
} catch (ex) {
|
|
86
|
+
const message = `Failed to delete model "${model.modelId}".`;
|
|
87
|
+
console.error(message);
|
|
88
|
+
return controller.response.error(ex);
|
|
97
89
|
}
|
|
98
|
-
|
|
99
|
-
hasMoreFolders = meta.hasMoreItems;
|
|
100
|
-
} while (hasMoreFolders);
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* When there is no more records to be deleted, let's delete the model, if it's not a plugin.
|
|
104
|
-
*/
|
|
105
|
-
await this.removeBeingDeleted(model);
|
|
106
|
-
if (model.isPlugin) {
|
|
107
|
-
return controller.response.done();
|
|
90
|
+
return controller.response.done();
|
|
108
91
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
console.error(message);
|
|
114
|
-
return controller.response.error(ex);
|
|
92
|
+
async getModel(modelId) {
|
|
93
|
+
const model = await this.context.cms.getModel(modelId);
|
|
94
|
+
if (!model) throw new Error(`Model "${modelId}" not found.`);
|
|
95
|
+
return model;
|
|
115
96
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const model = await this.context.cms.getModel(modelId);
|
|
120
|
-
if (!model) {
|
|
121
|
-
throw new Error(`Model "${modelId}" not found.`);
|
|
97
|
+
async removeBeingDeleted(model) {
|
|
98
|
+
const key = createStoreKey(model);
|
|
99
|
+
await this.context.db.store.removeValue(key);
|
|
122
100
|
}
|
|
123
|
-
return model;
|
|
124
|
-
}
|
|
125
|
-
async removeBeingDeleted(model) {
|
|
126
|
-
const key = createStoreKey(model);
|
|
127
|
-
await this.context.db.store.removeValue(key);
|
|
128
|
-
}
|
|
129
101
|
}
|
|
102
|
+
export { DeleteModel };
|
|
130
103
|
|
|
131
104
|
//# sourceMappingURL=DeleteModel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ListFoldersUseCase","DeleteFolderUseCase","createStoreKey","DeleteModel","constructor","context","run","params","input","controller","model","getModel","modelId","hasMoreItems","lastDeletedId","runtime","isAborted","removeBeingDeleted","response","aborted","isCloseToTimeout","continue","where","latest","entryId_gte","items","metaHasMoreItems","cms","storageOperations","entries","list","limit","sort","item","deleteEntry","id","permanently","force","console","error","Error","entryId","length","log","seconds","hasMoreFolders","listFolders","container","resolve","deleteFolder","listResult","execute","type","folders","meta","value","result","isFail","isPlugin","done","deleteModel","ex","message","key","db","store","removeValue"],"sources":["DeleteModel.ts"],"sourcesContent":["import type { CmsEntryListWhere } from \"@webiny/api-headless-cms/types/index.js\";\nimport type { CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\nimport { ListFoldersUseCase } from \"@webiny/api-aco/features/folder/ListFolders/index.js\";\nimport { DeleteFolderUseCase } from \"@webiny/api-aco/features/folder/DeleteFolder/index.js\";\nimport { CmsContext } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport type { IDeleteModelTaskInput } from \"./types.js\";\nimport type { IDeleteModelTaskOutput } from \"./types.js\";\nimport { createStoreKey } from \"~/helpers/store.js\";\n\ntype IRunParams = TaskDefinition.RunParams<IDeleteModelTaskInput, IDeleteModelTaskOutput>;\n\nexport interface IDeleteModel {\n run(\n params: IRunParams\n ): Promise<TaskDefinition.Result<IDeleteModelTaskInput, IDeleteModelTaskOutput>>;\n}\n\nexport class DeleteModel implements IDeleteModel {\n constructor(private context: CmsContext.Interface) {}\n\n public async run(\n params: IRunParams\n ): Promise<TaskDefinition.Result<IDeleteModelTaskInput, IDeleteModelTaskOutput>> {\n const { input, controller } = params;\n\n const model = await this.getModel(input.modelId);\n\n let hasMoreItems = false;\n let lastDeletedId: string | undefined = input.lastDeletedId;\n do {\n if (controller.runtime.isAborted()) {\n /**\n * If the task was aborted, we need to remove the task tag from the model.\n */\n await this.removeBeingDeleted(model);\n return controller.response.aborted();\n } else if (controller.runtime.isCloseToTimeout()) {\n return controller.response.continue({\n ...input,\n lastDeletedId\n });\n }\n const where: CmsEntryListWhere = {\n latest: true\n };\n if (lastDeletedId) {\n where.entryId_gte = lastDeletedId;\n }\n const { items, hasMoreItems: metaHasMoreItems } =\n await this.context.cms.storageOperations.entries.list(model, {\n limit: 1000,\n where,\n sort: [\"entryId_ASC\"]\n });\n for (const item of items) {\n try {\n await this.context.cms.deleteEntry(model, item.id, {\n permanently: true,\n force: true\n });\n } catch {\n console.error(\"Failed to delete entry.\", {\n model: model.modelId,\n id: item.id\n });\n return controller.response.error(\n new Error(`Failed to delete entry \"${item.id}\". Cannot continue.`)\n );\n }\n lastDeletedId = item.entryId;\n }\n\n hasMoreItems = metaHasMoreItems;\n } while (hasMoreItems);\n /**\n * Let's do one more check. If there are items, continue the task with 5 seconds delay.\n */\n const { items } = await this.context.cms.storageOperations.entries.list(model, {\n limit: 1,\n where: {\n latest: true\n }\n });\n if (items.length > 0) {\n console.log(\"There are still items to be deleted. Continuing the task.\");\n return controller.response.continue(\n {\n ...input\n },\n {\n seconds: 5\n }\n );\n }\n\n let hasMoreFolders = false;\n\n const listFolders = this.context.container.resolve(ListFoldersUseCase);\n const deleteFolder = this.context.container.resolve(DeleteFolderUseCase);\n\n do {\n const listResult = await listFolders.execute({\n where: {\n type: `cms:${model.modelId}`\n },\n limit: 1000\n });\n\n const { folders, meta } = listResult.value;\n\n for (const item of folders) {\n const result = await deleteFolder.execute(item.id);\n if (result.isFail()) {\n return controller.response.error(result.error);\n }\n }\n\n hasMoreFolders = meta.hasMoreItems;\n } while (hasMoreFolders);\n\n /**\n * When there is no more records to be deleted, let's delete the model, if it's not a plugin.\n */\n await this.removeBeingDeleted(model);\n if (model.isPlugin) {\n return controller.response.done();\n }\n try {\n await this.context.cms.deleteModel(model.modelId);\n } catch (ex) {\n const message = `Failed to delete model \"${model.modelId}\".`;\n console.error(message);\n return controller.response.error(ex);\n }\n\n return controller.response.done();\n }\n\n private async getModel(modelId: string): Promise<CmsModel> {\n const model = await this.context.cms.getModel(modelId);\n if (!model) {\n throw new Error(`Model \"${modelId}\" not found.`);\n }\n return model;\n }\n\n private async removeBeingDeleted(model: Pick<CmsModel, \"modelId\" | \"tenant\">): Promise<void> {\n const key = createStoreKey(model);\n await this.context.db.store.removeValue(key);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"features/DeleteModelTask/DeleteModel.js","sources":["../../../src/features/DeleteModelTask/DeleteModel.ts"],"sourcesContent":["import type { CmsEntryListWhere } from \"@webiny/api-headless-cms/types/index.js\";\nimport type { CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\nimport { ListFoldersUseCase } from \"@webiny/api-aco/features/folder/ListFolders/index.js\";\nimport { DeleteFolderUseCase } from \"@webiny/api-aco/features/folder/DeleteFolder/index.js\";\nimport { CmsContext } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport type { IDeleteModelTaskInput } from \"./types.js\";\nimport type { IDeleteModelTaskOutput } from \"./types.js\";\nimport { createStoreKey } from \"~/helpers/store.js\";\n\ntype IRunParams = TaskDefinition.RunParams<IDeleteModelTaskInput, IDeleteModelTaskOutput>;\n\nexport interface IDeleteModel {\n run(\n params: IRunParams\n ): Promise<TaskDefinition.Result<IDeleteModelTaskInput, IDeleteModelTaskOutput>>;\n}\n\nexport class DeleteModel implements IDeleteModel {\n constructor(private context: CmsContext.Interface) {}\n\n public async run(\n params: IRunParams\n ): Promise<TaskDefinition.Result<IDeleteModelTaskInput, IDeleteModelTaskOutput>> {\n const { input, controller } = params;\n\n const model = await this.getModel(input.modelId);\n\n let hasMoreItems = false;\n let lastDeletedId: string | undefined = input.lastDeletedId;\n do {\n if (controller.runtime.isAborted()) {\n /**\n * If the task was aborted, we need to remove the task tag from the model.\n */\n await this.removeBeingDeleted(model);\n return controller.response.aborted();\n } else if (controller.runtime.isCloseToTimeout()) {\n return controller.response.continue({\n ...input,\n lastDeletedId\n });\n }\n const where: CmsEntryListWhere = {\n latest: true\n };\n if (lastDeletedId) {\n where.entryId_gte = lastDeletedId;\n }\n const { items, hasMoreItems: metaHasMoreItems } =\n await this.context.cms.storageOperations.entries.list(model, {\n limit: 1000,\n where,\n sort: [\"entryId_ASC\"]\n });\n for (const item of items) {\n try {\n await this.context.cms.deleteEntry(model, item.id, {\n permanently: true,\n force: true\n });\n } catch {\n console.error(\"Failed to delete entry.\", {\n model: model.modelId,\n id: item.id\n });\n return controller.response.error(\n new Error(`Failed to delete entry \"${item.id}\". Cannot continue.`)\n );\n }\n lastDeletedId = item.entryId;\n }\n\n hasMoreItems = metaHasMoreItems;\n } while (hasMoreItems);\n /**\n * Let's do one more check. If there are items, continue the task with 5 seconds delay.\n */\n const { items } = await this.context.cms.storageOperations.entries.list(model, {\n limit: 1,\n where: {\n latest: true\n }\n });\n if (items.length > 0) {\n console.log(\"There are still items to be deleted. Continuing the task.\");\n return controller.response.continue(\n {\n ...input\n },\n {\n seconds: 5\n }\n );\n }\n\n let hasMoreFolders = false;\n\n const listFolders = this.context.container.resolve(ListFoldersUseCase);\n const deleteFolder = this.context.container.resolve(DeleteFolderUseCase);\n\n do {\n const listResult = await listFolders.execute({\n where: {\n type: `cms:${model.modelId}`\n },\n limit: 1000\n });\n\n const { folders, meta } = listResult.value;\n\n for (const item of folders) {\n const result = await deleteFolder.execute(item.id);\n if (result.isFail()) {\n return controller.response.error(result.error);\n }\n }\n\n hasMoreFolders = meta.hasMoreItems;\n } while (hasMoreFolders);\n\n /**\n * When there is no more records to be deleted, let's delete the model, if it's not a plugin.\n */\n await this.removeBeingDeleted(model);\n if (model.isPlugin) {\n return controller.response.done();\n }\n try {\n await this.context.cms.deleteModel(model.modelId);\n } catch (ex) {\n const message = `Failed to delete model \"${model.modelId}\".`;\n console.error(message);\n return controller.response.error(ex);\n }\n\n return controller.response.done();\n }\n\n private async getModel(modelId: string): Promise<CmsModel> {\n const model = await this.context.cms.getModel(modelId);\n if (!model) {\n throw new Error(`Model \"${modelId}\" not found.`);\n }\n return model;\n }\n\n private async removeBeingDeleted(model: Pick<CmsModel, \"modelId\" | \"tenant\">): Promise<void> {\n const key = createStoreKey(model);\n await this.context.db.store.removeValue(key);\n }\n}\n"],"names":["DeleteModel","context","params","input","controller","model","hasMoreItems","lastDeletedId","where","items","metaHasMoreItems","item","console","Error","hasMoreFolders","listFolders","ListFoldersUseCase","deleteFolder","DeleteFolderUseCase","listResult","folders","meta","result","ex","message","modelId","key","createStoreKey"],"mappings":"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"}
|
|
@@ -2,39 +2,41 @@ import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/in
|
|
|
2
2
|
import { CmsContext } from "@webiny/api-headless-cms/features/shared/abstractions.js";
|
|
3
3
|
import { DELETE_MODEL_TASK } from "../../constants.js";
|
|
4
4
|
class DeleteModelTaskDefinition {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
5
|
+
constructor(context){
|
|
6
|
+
this.context = context;
|
|
7
|
+
this.id = DELETE_MODEL_TASK;
|
|
8
|
+
this.title = "Delete model and all of the entries";
|
|
9
|
+
this.maxIterations = 50;
|
|
10
|
+
this.isPrivate = true;
|
|
11
|
+
this.databaseLogs = false;
|
|
12
|
+
this.description = "Delete a content model and all associated entries.";
|
|
13
|
+
this.selfCleanup = [
|
|
14
|
+
"onSuccess",
|
|
15
|
+
"onAbort"
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
async run(params) {
|
|
19
|
+
const { DeleteModel } = await import("./DeleteModel.js");
|
|
20
|
+
try {
|
|
21
|
+
const runner = new DeleteModel(this.context);
|
|
22
|
+
return await runner.run(params);
|
|
23
|
+
} catch (ex) {
|
|
24
|
+
return params.controller.response.error(ex);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
createInputValidation({ validator }) {
|
|
28
|
+
return {
|
|
29
|
+
modelId: validator.string(),
|
|
30
|
+
lastDeletedId: validator.string().optional()
|
|
31
|
+
};
|
|
24
32
|
}
|
|
25
|
-
}
|
|
26
|
-
createInputValidation({
|
|
27
|
-
validator
|
|
28
|
-
}) {
|
|
29
|
-
return {
|
|
30
|
-
modelId: validator.string(),
|
|
31
|
-
lastDeletedId: validator.string().optional()
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
33
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
const DeleteModelTask = TaskDefinition.createImplementation({
|
|
35
|
+
implementation: DeleteModelTaskDefinition,
|
|
36
|
+
dependencies: [
|
|
37
|
+
CmsContext
|
|
38
|
+
]
|
|
38
39
|
});
|
|
40
|
+
export { DeleteModelTask };
|
|
39
41
|
|
|
40
42
|
//# sourceMappingURL=DeleteModelTask.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/DeleteModelTask/DeleteModelTask.js","sources":["../../../src/features/DeleteModelTask/DeleteModelTask.ts"],"sourcesContent":["import type { IDeleteModelTaskInput } from \"./types.js\";\nimport type { IDeleteModelTaskOutput } from \"./types.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { CmsContext } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\nimport { DELETE_MODEL_TASK } from \"~/constants.js\";\n\ntype IRunParams = TaskDefinition.RunParams<IDeleteModelTaskInput, IDeleteModelTaskOutput>;\n\nclass DeleteModelTaskDefinition implements TaskDefinition.Interface<\n IDeleteModelTaskInput,\n IDeleteModelTaskOutput\n> {\n id = DELETE_MODEL_TASK;\n title = \"Delete model and all of the entries\";\n maxIterations = 50;\n isPrivate = true;\n databaseLogs = false;\n description = \"Delete a content model and all associated entries.\";\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n constructor(private context: CmsContext.Interface) {}\n\n async run(params: IRunParams) {\n const { DeleteModel } = await import(\n /* webpackChunkName: \"createDeleteModel\" */ \"./DeleteModel.js\"\n );\n\n try {\n const runner = new DeleteModel(this.context);\n return await runner.run(params);\n } catch (ex) {\n return params.controller.response.error(ex);\n }\n }\n\n createInputValidation({ validator }: TaskDefinition.CreateInputValidationParams) {\n return {\n modelId: validator.string(),\n lastDeletedId: validator.string().optional()\n };\n }\n}\n\nexport const DeleteModelTask = TaskDefinition.createImplementation({\n implementation: DeleteModelTaskDefinition,\n dependencies: [CmsContext]\n});\n"],"names":["DeleteModelTaskDefinition","context","DELETE_MODEL_TASK","params","DeleteModel","runner","ex","validator","DeleteModelTask","TaskDefinition","CmsContext"],"mappings":";;;AAQA,MAAMA;IAaF,YAAoBC,OAA6B,CAAE;aAA/BA,OAAO,GAAPA;aATpB,EAAE,GAAGC;aACL,KAAK,GAAG;aACR,aAAa,GAAG;aAChB,SAAS,GAAG;aACZ,YAAY,GAAG;aACf,WAAW,GAAG;aAEE,WAAW,GAAG;YAAC;YAAsB;SAAmB;IAEpB;IAEpD,MAAM,IAAIC,MAAkB,EAAE;QAC1B,MAAM,EAAEC,WAAW,EAAE,GAAG,MAAM,MAAM,CAAN;QAI9B,IAAI;YACA,MAAMC,SAAS,IAAID,YAAY,IAAI,CAAC,OAAO;YAC3C,OAAO,MAAMC,OAAO,GAAG,CAACF;QAC5B,EAAE,OAAOG,IAAI;YACT,OAAOH,OAAO,UAAU,CAAC,QAAQ,CAAC,KAAK,CAACG;QAC5C;IACJ;IAEA,sBAAsB,EAAEC,SAAS,EAA8C,EAAE;QAC7E,OAAO;YACH,SAASA,UAAU,MAAM;YACzB,eAAeA,UAAU,MAAM,GAAG,QAAQ;QAC9C;IACJ;AACJ;AAEO,MAAMC,kBAAkBC,eAAe,oBAAoB,CAAC;IAC/D,gBAAgBT;IAChB,cAAc;QAACU;KAAW;AAC9B"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { createFeature } from "@webiny/feature/api";
|
|
2
2
|
import { DeleteModelTask } from "./DeleteModelTask.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
const DeleteModelTaskFeature = createFeature({
|
|
4
|
+
name: "HeadlessCms/Tasks/DeleteModelTask",
|
|
5
|
+
register (container) {
|
|
6
|
+
container.register(DeleteModelTask);
|
|
7
|
+
}
|
|
8
8
|
});
|
|
9
|
+
export { DeleteModelTaskFeature };
|
|
9
10
|
|
|
10
11
|
//# sourceMappingURL=feature.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/DeleteModelTask/feature.js","sources":["../../../src/features/DeleteModelTask/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { DeleteModelTask } from \"./DeleteModelTask.js\";\n\nexport const DeleteModelTaskFeature = createFeature({\n name: \"HeadlessCms/Tasks/DeleteModelTask\",\n register(container) {\n container.register(DeleteModelTask);\n }\n});\n"],"names":["DeleteModelTaskFeature","createFeature","container","DeleteModelTask"],"mappings":";;AAGO,MAAMA,yBAAyBC,cAAc;IAChD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
var types_DeleteCmsModelTaskStatus = /*#__PURE__*/ function(DeleteCmsModelTaskStatus) {
|
|
2
|
+
DeleteCmsModelTaskStatus["RUNNING"] = "running";
|
|
3
|
+
DeleteCmsModelTaskStatus["DONE"] = "done";
|
|
4
|
+
DeleteCmsModelTaskStatus["ERROR"] = "error";
|
|
5
|
+
DeleteCmsModelTaskStatus["CANCELED"] = "canceled";
|
|
6
|
+
return DeleteCmsModelTaskStatus;
|
|
7
7
|
}({});
|
|
8
|
+
export { types_DeleteCmsModelTaskStatus as DeleteCmsModelTaskStatus };
|
|
8
9
|
|
|
9
10
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/DeleteModelTask/types.js","sources":["../../../src/features/DeleteModelTask/types.ts"],"sourcesContent":["import type { CmsIdentity } from \"@webiny/api-headless-cms/types/index.js\";\nimport type { ListValuesResult } from \"@webiny/db\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nexport interface IDeleteModelTaskInput {\n modelId: string;\n lastDeletedId?: string;\n}\n\nexport interface IDeleteModelTaskOutput extends TaskDefinition.TaskOutput {\n total?: number;\n deleted?: number;\n}\n\nexport enum DeleteCmsModelTaskStatus {\n RUNNING = \"running\",\n DONE = \"done\",\n ERROR = \"error\",\n CANCELED = \"canceled\"\n}\n\nexport interface IDeleteCmsModelTask {\n id: string;\n status: DeleteCmsModelTaskStatus;\n total: number;\n deleted: number;\n message?: string;\n}\n\nexport interface IStoreValue {\n modelId: string;\n tenant: string;\n identity: CmsIdentity;\n task: string;\n}\n\nexport type ListStoreKeysResult = Promise<ListValuesResult<GenericRecord<string, IStoreValue>>>;\n"],"names":["DeleteCmsModelTaskStatus"],"mappings":"AAeO,IAAKA,iCAAwBA,WAAAA,GAAAA,SAAxBA,wBAAwB;;;;;WAAxBA"}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { WebinyError } from "@webiny/error";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
class BlockActionIfModelDisabled {
|
|
3
|
+
constructor(isModelBeingDeleted){
|
|
4
|
+
this.isModelBeingDeleted = isModelBeingDeleted;
|
|
5
|
+
}
|
|
6
|
+
async execute(model) {
|
|
7
|
+
const isBeingDeleted = await this.isModelBeingDeleted(model.modelId);
|
|
8
|
+
if (!isBeingDeleted) return;
|
|
9
|
+
throw new WebinyError(`Model "${model.name}" is being deleted and you cannot create, update or delete any entries of this model.`);
|
|
10
10
|
}
|
|
11
|
-
throw new WebinyError(`Model "${model.name}" is being deleted and you cannot create, update or delete any entries of this model.`);
|
|
12
|
-
}
|
|
13
11
|
}
|
|
12
|
+
export { BlockActionIfModelDisabled };
|
|
14
13
|
|
|
15
14
|
//# sourceMappingURL=BlockActionIfModelDisabled.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/DisableModel/BlockActionIfModelDisabled.js","sources":["../../../src/features/DisableModel/BlockActionIfModelDisabled.ts"],"sourcesContent":["import { WebinyError } from \"@webiny/error\";\nimport type { CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\nimport { BlockActionIfModelDisabled as Abstraction } from \"./abstractions.js\";\nimport type { HeadlessCmsFullyDeleteModel } from \"~/types.js\";\n\nexport class BlockActionIfModelDisabled implements Abstraction.Interface {\n constructor(private isModelBeingDeleted: HeadlessCmsFullyDeleteModel[\"isModelBeingDeleted\"]) {}\n\n async execute(model: CmsModel): Promise<void> {\n const isBeingDeleted = await this.isModelBeingDeleted(model.modelId);\n if (!isBeingDeleted) {\n return;\n }\n\n throw new WebinyError(\n `Model \"${model.name}\" is being deleted and you cannot create, update or delete any entries of this model.`\n );\n }\n}\n"],"names":["BlockActionIfModelDisabled","isModelBeingDeleted","model","isBeingDeleted","WebinyError"],"mappings":";AAKO,MAAMA;IACT,YAAoBC,mBAAuE,CAAE;aAAzEA,mBAAmB,GAAnBA;IAA0E;IAE9F,MAAM,QAAQC,KAAe,EAAiB;QAC1C,MAAMC,iBAAiB,MAAM,IAAI,CAAC,mBAAmB,CAACD,MAAM,OAAO;QACnE,IAAI,CAACC,gBACD;QAGJ,MAAM,IAAIC,YACN,CAAC,OAAO,EAAEF,MAAM,IAAI,CAAC,qFAAqF,CAAC;IAEnH;AACJ"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createAbstraction } from "@webiny/feature/api";
|
|
2
|
-
|
|
2
|
+
const BlockActionIfModelDisabled = createAbstraction("BlockActionIfModelDisabled");
|
|
3
|
+
export { BlockActionIfModelDisabled };
|
|
3
4
|
|
|
4
5
|
//# sourceMappingURL=abstractions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/DisableModel/abstractions.js","sources":["../../../src/features/DisableModel/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\n\nexport interface IBlockActionIfModelDisabled {\n execute(model: CmsModel): Promise<void>;\n}\n\nexport const BlockActionIfModelDisabled = createAbstraction<IBlockActionIfModelDisabled>(\n \"BlockActionIfModelDisabled\"\n);\n\nexport namespace BlockActionIfModelDisabled {\n export type Interface = IBlockActionIfModelDisabled;\n}\n"],"names":["BlockActionIfModelDisabled","createAbstraction"],"mappings":";AAOO,MAAMA,6BAA6BC,kBACtC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createFeature } from "@webiny/feature/api";
|
|
2
|
-
import { BlockActionIfModelDisabled
|
|
3
|
-
import { BlockActionIfModelDisabled } from "./BlockActionIfModelDisabled.js";
|
|
2
|
+
import { BlockActionIfModelDisabled } from "./abstractions.js";
|
|
3
|
+
import { BlockActionIfModelDisabled as external_BlockActionIfModelDisabled_js_BlockActionIfModelDisabled } from "./BlockActionIfModelDisabled.js";
|
|
4
4
|
import { BlockModelActionOnEntryBeforeCreate } from "./handlers/BlockModelActionOnEntryBeforeCreate.js";
|
|
5
5
|
import { BlockModelActionOnEntryRevisionBeforeCreate } from "./handlers/BlockModelActionOnEntryRevisionBeforeCreate.js";
|
|
6
6
|
import { BlockModelActionOnEntryBeforeUpdate } from "./handlers/BlockModelActionOnEntryBeforeUpdate.js";
|
|
@@ -11,26 +11,22 @@ import { BlockModelActionOnEntryBeforeRestoreFromBin } from "./handlers/BlockMod
|
|
|
11
11
|
import { BlockModelActionOnEntryBeforeMove } from "./handlers/BlockModelActionOnEntryBeforeMove.js";
|
|
12
12
|
import { BlockModelActionOnModelBeforeUpdate } from "./handlers/BlockModelActionOnModelBeforeUpdate.js";
|
|
13
13
|
import { BlockModelActionOnModelBeforeCreateFrom } from "./handlers/BlockModelActionOnModelBeforeCreateFrom.js";
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
// Register model event handlers
|
|
31
|
-
container.register(BlockModelActionOnModelBeforeUpdate);
|
|
32
|
-
container.register(BlockModelActionOnModelBeforeCreateFrom);
|
|
33
|
-
}
|
|
14
|
+
const DisableModelFeature = createFeature({
|
|
15
|
+
name: "DisableModel",
|
|
16
|
+
register (container, params) {
|
|
17
|
+
container.registerInstance(BlockActionIfModelDisabled, new external_BlockActionIfModelDisabled_js_BlockActionIfModelDisabled(params.isModelBeingDeleted));
|
|
18
|
+
container.register(BlockModelActionOnEntryBeforeCreate);
|
|
19
|
+
container.register(BlockModelActionOnEntryRevisionBeforeCreate);
|
|
20
|
+
container.register(BlockModelActionOnEntryBeforeUpdate);
|
|
21
|
+
container.register(BlockModelActionOnEntryBeforeUnpublish);
|
|
22
|
+
container.register(BlockModelActionOnEntryBeforePublish);
|
|
23
|
+
container.register(BlockModelActionOnEntryBeforeRepublish);
|
|
24
|
+
container.register(BlockModelActionOnEntryBeforeRestoreFromBin);
|
|
25
|
+
container.register(BlockModelActionOnEntryBeforeMove);
|
|
26
|
+
container.register(BlockModelActionOnModelBeforeUpdate);
|
|
27
|
+
container.register(BlockModelActionOnModelBeforeCreateFrom);
|
|
28
|
+
}
|
|
34
29
|
});
|
|
30
|
+
export { DisableModelFeature };
|
|
35
31
|
|
|
36
32
|
//# sourceMappingURL=feature.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/DisableModel/feature.js","sources":["../../../src/features/DisableModel/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { BlockActionIfModelDisabled as Abstraction } from \"./abstractions.js\";\nimport { BlockActionIfModelDisabled } from \"./BlockActionIfModelDisabled.js\";\nimport type { HeadlessCmsFullyDeleteModel } from \"~/types.js\";\nimport { BlockModelActionOnEntryBeforeCreate } from \"./handlers/BlockModelActionOnEntryBeforeCreate.js\";\nimport { BlockModelActionOnEntryRevisionBeforeCreate } from \"./handlers/BlockModelActionOnEntryRevisionBeforeCreate.js\";\nimport { BlockModelActionOnEntryBeforeUpdate } from \"./handlers/BlockModelActionOnEntryBeforeUpdate.js\";\nimport { BlockModelActionOnEntryBeforeUnpublish } from \"./handlers/BlockModelActionOnEntryBeforeUnpublish.js\";\nimport { BlockModelActionOnEntryBeforePublish } from \"./handlers/BlockModelActionOnEntryBeforePublish.js\";\nimport { BlockModelActionOnEntryBeforeRepublish } from \"./handlers/BlockModelActionOnEntryBeforeRepublish.js\";\nimport { BlockModelActionOnEntryBeforeRestoreFromBin } from \"./handlers/BlockModelActionOnEntryBeforeRestoreFromBin.js\";\nimport { BlockModelActionOnEntryBeforeMove } from \"./handlers/BlockModelActionOnEntryBeforeMove.js\";\nimport { BlockModelActionOnModelBeforeUpdate } from \"./handlers/BlockModelActionOnModelBeforeUpdate.js\";\nimport { BlockModelActionOnModelBeforeCreateFrom } from \"./handlers/BlockModelActionOnModelBeforeCreateFrom.js\";\n\nexport interface LegacyDeps {\n isModelBeingDeleted: HeadlessCmsFullyDeleteModel[\"isModelBeingDeleted\"];\n}\n\nexport const DisableModelFeature = createFeature<LegacyDeps>({\n name: \"DisableModel\",\n register(container, params) {\n // Register the blocking service\n container.registerInstance(\n Abstraction,\n new BlockActionIfModelDisabled(params.isModelBeingDeleted)\n );\n\n // Register entry event handlers\n container.register(BlockModelActionOnEntryBeforeCreate);\n container.register(BlockModelActionOnEntryRevisionBeforeCreate);\n container.register(BlockModelActionOnEntryBeforeUpdate);\n container.register(BlockModelActionOnEntryBeforeUnpublish);\n container.register(BlockModelActionOnEntryBeforePublish);\n container.register(BlockModelActionOnEntryBeforeRepublish);\n container.register(BlockModelActionOnEntryBeforeRestoreFromBin);\n container.register(BlockModelActionOnEntryBeforeMove);\n\n // Register model event handlers\n container.register(BlockModelActionOnModelBeforeUpdate);\n container.register(BlockModelActionOnModelBeforeCreateFrom);\n }\n});\n"],"names":["DisableModelFeature","createFeature","container","params","Abstraction","BlockActionIfModelDisabled","BlockModelActionOnEntryBeforeCreate","BlockModelActionOnEntryRevisionBeforeCreate","BlockModelActionOnEntryBeforeUpdate","BlockModelActionOnEntryBeforeUnpublish","BlockModelActionOnEntryBeforePublish","BlockModelActionOnEntryBeforeRepublish","BlockModelActionOnEntryBeforeRestoreFromBin","BlockModelActionOnEntryBeforeMove","BlockModelActionOnModelBeforeUpdate","BlockModelActionOnModelBeforeCreateFrom"],"mappings":";;;;;;;;;;;;;AAmBO,MAAMA,sBAAsBC,cAA0B;IACzD,MAAM;IACN,UAASC,SAAS,EAAEC,MAAM;QAEtBD,UAAU,gBAAgB,CACtBE,4BACA,IAAIC,kEAA2BF,OAAO,mBAAmB;QAI7DD,UAAU,QAAQ,CAACI;QACnBJ,UAAU,QAAQ,CAACK;QACnBL,UAAU,QAAQ,CAACM;QACnBN,UAAU,QAAQ,CAACO;QACnBP,UAAU,QAAQ,CAACQ;QACnBR,UAAU,QAAQ,CAACS;QACnBT,UAAU,QAAQ,CAACU;QACnBV,UAAU,QAAQ,CAACW;QAGnBX,UAAU,QAAQ,CAACY;QACnBZ,UAAU,QAAQ,CAACa;IACvB;AACJ"}
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import { EntryBeforeCreateEventHandler } from "@webiny/api-headless-cms/features/contentEntry/CreateEntry/events.js";
|
|
2
2
|
import { BlockActionIfModelDisabled } from "../abstractions.js";
|
|
3
3
|
class BlockModelActionOnEntryBeforeCreateImpl {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
constructor(blockAction){
|
|
5
|
+
this.blockAction = blockAction;
|
|
6
|
+
}
|
|
7
|
+
async handle(event) {
|
|
8
|
+
await this.blockAction.execute(event.payload.model);
|
|
9
|
+
}
|
|
10
10
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
const BlockModelActionOnEntryBeforeCreate = EntryBeforeCreateEventHandler.createImplementation({
|
|
12
|
+
implementation: BlockModelActionOnEntryBeforeCreateImpl,
|
|
13
|
+
dependencies: [
|
|
14
|
+
BlockActionIfModelDisabled
|
|
15
|
+
]
|
|
14
16
|
});
|
|
17
|
+
export { BlockModelActionOnEntryBeforeCreate };
|
|
15
18
|
|
|
16
19
|
//# sourceMappingURL=BlockModelActionOnEntryBeforeCreate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/DisableModel/handlers/BlockModelActionOnEntryBeforeCreate.js","sources":["../../../../src/features/DisableModel/handlers/BlockModelActionOnEntryBeforeCreate.ts"],"sourcesContent":["import { EntryBeforeCreateEventHandler } from \"@webiny/api-headless-cms/features/contentEntry/CreateEntry/events.js\";\nimport { BlockActionIfModelDisabled } from \"../abstractions.js\";\n\nclass BlockModelActionOnEntryBeforeCreateImpl implements EntryBeforeCreateEventHandler.Interface {\n constructor(private blockAction: BlockActionIfModelDisabled.Interface) {}\n\n async handle(event: EntryBeforeCreateEventHandler.Event): Promise<void> {\n await this.blockAction.execute(event.payload.model);\n }\n}\n\nexport const BlockModelActionOnEntryBeforeCreate =\n EntryBeforeCreateEventHandler.createImplementation({\n implementation: BlockModelActionOnEntryBeforeCreateImpl,\n dependencies: [BlockActionIfModelDisabled]\n });\n"],"names":["BlockModelActionOnEntryBeforeCreateImpl","blockAction","event","BlockModelActionOnEntryBeforeCreate","EntryBeforeCreateEventHandler","BlockActionIfModelDisabled"],"mappings":";;AAGA,MAAMA;IACF,YAAoBC,WAAiD,CAAE;aAAnDA,WAAW,GAAXA;IAAoD;IAExE,MAAM,OAAOC,KAA0C,EAAiB;QACpE,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAACA,MAAM,OAAO,CAAC,KAAK;IACtD;AACJ;AAEO,MAAMC,sCACTC,8BAA8B,oBAAoB,CAAC;IAC/C,gBAAgBJ;IAChB,cAAc;QAACK;KAA2B;AAC9C"}
|