@webiny/api-headless-cms-tasks 6.4.5-beta.0 → 6.6.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/HcmsTasksFeature.d.ts +4 -0
  2. package/HcmsTasksFeature.js +20 -0
  3. package/HcmsTasksFeature.js.map +1 -0
  4. package/features/DeleteModelTask/DeleteModel.js +19 -10
  5. package/features/DeleteModelTask/DeleteModel.js.map +1 -1
  6. package/features/DeleteModelTask/DeleteModelTask.d.ts +1 -1
  7. package/features/DeleteModelTask/types.d.ts +0 -3
  8. package/features/DeleteModelTask/types.js.map +1 -1
  9. package/features/DisableModel/BlockActionIfModelDisabled.d.ts +2 -2
  10. package/features/DisableModel/BlockActionIfModelDisabled.js.map +1 -1
  11. package/features/DisableModel/feature.d.ts +1 -5
  12. package/features/DisableModel/feature.js +4 -2
  13. package/features/DisableModel/feature.js.map +1 -1
  14. package/graphql/deleteModel/abstractions.d.ts +12 -0
  15. package/graphql/deleteModel/abstractions.js +5 -0
  16. package/graphql/deleteModel/abstractions.js.map +1 -0
  17. package/graphql/deleteModel/cancelDeleteModel.d.ts +1 -1
  18. package/graphql/deleteModel/cancelDeleteModel.js +17 -17
  19. package/graphql/deleteModel/cancelDeleteModel.js.map +1 -1
  20. package/graphql/deleteModel/crud.d.ts +2 -3
  21. package/graphql/deleteModel/crud.js +46 -53
  22. package/graphql/deleteModel/crud.js.map +1 -1
  23. package/graphql/deleteModel/fullyDeleteModel.d.ts +1 -1
  24. package/graphql/deleteModel/fullyDeleteModel.js +18 -11
  25. package/graphql/deleteModel/fullyDeleteModel.js.map +1 -1
  26. package/graphql/deleteModel/getDeleteModelProgress.d.ts +1 -1
  27. package/graphql/deleteModel/getDeleteModelProgress.js +16 -9
  28. package/graphql/deleteModel/getDeleteModelProgress.js.map +1 -1
  29. package/graphql/deleteModel/index.d.ts +2 -2
  30. package/graphql/deleteModel/index.js +65 -62
  31. package/graphql/deleteModel/index.js.map +1 -1
  32. package/helpers/store.d.ts +12 -7
  33. package/helpers/store.js +32 -3
  34. package/helpers/store.js.map +1 -1
  35. package/index.d.ts +1 -2
  36. package/index.js +1 -22
  37. package/package.json +19 -19
  38. package/types.d.ts +0 -10
  39. package/index.js.map +0 -1
@@ -0,0 +1,4 @@
1
+ export declare const HcmsTasksFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,20 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { RequestContextInitializer } from "@webiny/event-handler-core";
3
+ import { HcmsBulkActionsFeature } from "@webiny/api-headless-cms-bulk-actions";
4
+ import { DeleteModelTaskFeature } from "./features/DeleteModelTask/feature.js";
5
+ import { createDeleteModelCrud } from "./graphql/deleteModel/crud.js";
6
+ import { createDeleteModelGraphQl } from "./graphql/deleteModel/index.js";
7
+ const HcmsTasksFeature = createFeature({
8
+ name: "HcmsTasks",
9
+ register (container) {
10
+ HcmsBulkActionsFeature.register(container, {
11
+ batchSize: 100
12
+ });
13
+ DeleteModelTaskFeature.register(container);
14
+ container.registerInstance(RequestContextInitializer, createDeleteModelCrud());
15
+ container.registerInstance(RequestContextInitializer, createDeleteModelGraphQl());
16
+ }
17
+ });
18
+ export { HcmsTasksFeature };
19
+
20
+ //# sourceMappingURL=HcmsTasksFeature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HcmsTasksFeature.js","sources":["../src/HcmsTasksFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { RequestContextInitializer } from \"@webiny/event-handler-core\";\nimport { HcmsBulkActionsFeature } from \"@webiny/api-headless-cms-bulk-actions\";\nimport { DeleteModelTaskFeature } from \"./features/DeleteModelTask/feature.js\";\nimport { createDeleteModelCrud } from \"./graphql/deleteModel/crud.js\";\nimport { createDeleteModelGraphQl } from \"./graphql/deleteModel/index.js\";\n\nexport const HcmsTasksFeature = createFeature({\n name: \"HcmsTasks\",\n register(container) {\n // Bulk actions (entries) + the empty-trash-bin task.\n HcmsBulkActionsFeature.register(container, { batchSize: 100 });\n\n // Delete-model task + its per-request operations/schema. The crud initializer registers\n // DeleteModelOperations (+ DisableModelFeature) and MUST run before the GraphQL initializer,\n // whose resolvers resolve DeleteModelOperations — RequestContextInitializers run in\n // registration order.\n DeleteModelTaskFeature.register(container);\n container.registerInstance(RequestContextInitializer, createDeleteModelCrud());\n container.registerInstance(RequestContextInitializer, createDeleteModelGraphQl());\n }\n});\n"],"names":["HcmsTasksFeature","createFeature","container","HcmsBulkActionsFeature","DeleteModelTaskFeature","RequestContextInitializer","createDeleteModelCrud","createDeleteModelGraphQl"],"mappings":";;;;;;AAOO,MAAMA,mBAAmBC,cAAc;IAC1C,MAAM;IACN,UAASC,SAAS;QAEdC,uBAAuB,QAAQ,CAACD,WAAW;YAAE,WAAW;QAAI;QAM5DE,uBAAuB,QAAQ,CAACF;QAChCA,UAAU,gBAAgB,CAACG,2BAA2BC;QACtDJ,UAAU,gBAAgB,CAACG,2BAA2BE;IAC1D;AACJ"}
@@ -1,6 +1,11 @@
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
- import { createStoreKey } from "../../helpers/store.js";
3
+ import { ListEntriesStorageOperation } from "@webiny/api-headless-cms/features/shared/storageOperations/entry/ListEntriesStorageOperation.js";
4
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
5
+ import { DeleteModelUseCase } from "@webiny/api-headless-cms/features/contentModel/DeleteModel/index.js";
6
+ import { DeleteEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js";
7
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/abstractions.js";
8
+ import { createDeleteModelStore } from "../../helpers/store.js";
4
9
  class DeleteModel {
5
10
  constructor(context){
6
11
  this.context = context;
@@ -23,7 +28,8 @@ class DeleteModel {
23
28
  latest: true
24
29
  };
25
30
  if (lastDeletedId) where.entryId_gte = lastDeletedId;
26
- const { items, hasMoreItems: metaHasMoreItems } = await this.context.cms.storageOperations.entries.list(model, {
31
+ const listEntries = this.context.container.resolve(ListEntriesStorageOperation);
32
+ const { items, hasMoreItems: metaHasMoreItems } = await listEntries.execute(model, {
27
33
  limit: 1000,
28
34
  where,
29
35
  sort: [
@@ -32,10 +38,11 @@ class DeleteModel {
32
38
  });
33
39
  for (const item of items){
34
40
  try {
35
- await this.context.cms.deleteEntry(model, item.id, {
41
+ const deleteResult = await this.context.container.resolve(DeleteEntryUseCase).execute(model, item.id, {
36
42
  permanently: true,
37
43
  force: true
38
44
  });
45
+ if (deleteResult.isFail()) throw deleteResult.error;
39
46
  } catch {
40
47
  console.error("Failed to delete entry.", {
41
48
  model: model.modelId,
@@ -47,7 +54,8 @@ class DeleteModel {
47
54
  }
48
55
  hasMoreItems = metaHasMoreItems;
49
56
  }while (hasMoreItems)
50
- const { items } = await this.context.cms.storageOperations.entries.list(model, {
57
+ const listEntries = this.context.container.resolve(ListEntriesStorageOperation);
58
+ const { items } = await listEntries.execute(model, {
51
59
  limit: 1,
52
60
  where: {
53
61
  latest: true
@@ -81,7 +89,8 @@ class DeleteModel {
81
89
  await this.removeBeingDeleted(model);
82
90
  if (model.isPlugin) return controller.response.done();
83
91
  try {
84
- await this.context.cms.deleteModel(model.modelId);
92
+ const deleteModelResult = await this.context.container.resolve(DeleteModelUseCase).execute(model.modelId);
93
+ if (deleteModelResult.isFail()) throw deleteModelResult.error;
85
94
  } catch (ex) {
86
95
  const message = `Failed to delete model "${model.modelId}".`;
87
96
  console.error(message);
@@ -90,13 +99,13 @@ class DeleteModel {
90
99
  return controller.response.done();
91
100
  }
92
101
  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;
102
+ const result = await this.context.container.resolve(GetModelUseCase).execute(modelId);
103
+ if (result.isFail()) throw result.error;
104
+ return result.value;
96
105
  }
97
106
  async removeBeingDeleted(model) {
98
- const key = createStoreKey(model);
99
- await this.context.db.store.removeValue(key);
107
+ const store = createDeleteModelStore(this.context.container.resolve(GlobalKeyValueStore), model.tenant);
108
+ await store.remove(model.modelId);
100
109
  }
101
110
  }
102
111
  export { DeleteModel };
@@ -1 +1 @@
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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"}
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 { ListEntriesStorageOperation } from \"@webiny/api-headless-cms/features/shared/storageOperations/entry/ListEntriesStorageOperation.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { DeleteModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/DeleteModel/index.js\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/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 { createDeleteModelStore } 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 listEntries = this.context.container.resolve(ListEntriesStorageOperation);\n const { items, hasMoreItems: metaHasMoreItems } = await listEntries.execute(model, {\n limit: 1000,\n where,\n sort: [\"entryId_ASC\"]\n });\n for (const item of items) {\n try {\n const deleteResult = await this.context.container\n .resolve(DeleteEntryUseCase)\n .execute(model, item.id, {\n permanently: true,\n force: true\n });\n if (deleteResult.isFail()) {\n throw deleteResult.error;\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 listEntries = this.context.container.resolve(ListEntriesStorageOperation);\n const { items } = await listEntries.execute(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 const deleteModelResult = await this.context.container\n .resolve(DeleteModelUseCase)\n .execute(model.modelId);\n if (deleteModelResult.isFail()) {\n throw deleteModelResult.error;\n }\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 result = await this.context.container.resolve(GetModelUseCase).execute(modelId);\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n }\n\n private async removeBeingDeleted(model: Pick<CmsModel, \"modelId\" | \"tenant\">): Promise<void> {\n const store = createDeleteModelStore(\n this.context.container.resolve(GlobalKeyValueStore),\n model.tenant\n );\n await store.remove(model.modelId);\n }\n}\n"],"names":["DeleteModel","context","params","input","controller","model","hasMoreItems","lastDeletedId","where","listEntries","ListEntriesStorageOperation","items","metaHasMoreItems","item","deleteResult","DeleteEntryUseCase","console","Error","hasMoreFolders","listFolders","ListFoldersUseCase","deleteFolder","DeleteFolderUseCase","listResult","folders","meta","result","deleteModelResult","DeleteModelUseCase","ex","message","modelId","GetModelUseCase","store","createDeleteModelStore","GlobalKeyValueStore"],"mappings":"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"}
@@ -11,7 +11,7 @@ declare class DeleteModelTaskDefinition implements TaskDefinition.Interface<IDel
11
11
  isPrivate: boolean;
12
12
  databaseLogs: boolean;
13
13
  description: string;
14
- readonly selfCleanup: ("onSuccess" | "onAbort")[];
14
+ readonly selfCleanup: ("onAbort" | "onSuccess")[];
15
15
  constructor(context: CmsContext.Interface);
16
16
  run(params: IRunParams): Promise<TaskDefinition.Result<IDeleteModelTaskInput, IDeleteModelTaskOutput>>;
17
17
  createInputValidation({ validator }: TaskDefinition.CreateInputValidationParams): {
@@ -1,6 +1,4 @@
1
1
  import type { CmsIdentity } from "@webiny/api-headless-cms/types/index.js";
2
- import type { ListValuesResult } from "@webiny/db";
3
- import type { GenericRecord } from "@webiny/api/types.js";
4
2
  import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
5
3
  export interface IDeleteModelTaskInput {
6
4
  modelId: string;
@@ -29,4 +27,3 @@ export interface IStoreValue {
29
27
  identity: CmsIdentity;
30
28
  task: string;
31
29
  }
32
- export type ListStoreKeysResult = Promise<ListValuesResult<GenericRecord<string, IStoreValue>>>;
@@ -1 +1 @@
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
+ {"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 { 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"],"names":["DeleteCmsModelTaskStatus"],"mappings":"AAaO,IAAKA,iCAAwBA,WAAAA,GAAAA,SAAxBA,wBAAwB;;;;;WAAxBA"}
@@ -1,8 +1,8 @@
1
1
  import type { CmsModel } from "@webiny/api-headless-cms/types/index.js";
2
2
  import { BlockActionIfModelDisabled as Abstraction } from "./abstractions.js";
3
- import type { HeadlessCmsFullyDeleteModel } from "../../types.js";
3
+ import type { DeleteModelOperations } from "../../graphql/deleteModel/abstractions.js";
4
4
  export declare class BlockActionIfModelDisabled implements Abstraction.Interface {
5
5
  private isModelBeingDeleted;
6
- constructor(isModelBeingDeleted: HeadlessCmsFullyDeleteModel["isModelBeingDeleted"]);
6
+ constructor(isModelBeingDeleted: DeleteModelOperations.Interface["isModelBeingDeleted"]);
7
7
  execute(model: CmsModel): Promise<void>;
8
8
  }
@@ -1 +1 @@
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
+ {"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 { DeleteModelOperations } from \"~/graphql/deleteModel/abstractions.js\";\n\nexport class BlockActionIfModelDisabled implements Abstraction.Interface {\n constructor(\n private isModelBeingDeleted: DeleteModelOperations.Interface[\"isModelBeingDeleted\"]\n ) {}\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,YACYC,mBAA2E,CACrF;aADUA,mBAAmB,GAAnBA;IACT;IAEH,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,8 +1,4 @@
1
- import type { HeadlessCmsFullyDeleteModel } from "../../types.js";
2
- export interface LegacyDeps {
3
- isModelBeingDeleted: HeadlessCmsFullyDeleteModel["isModelBeingDeleted"];
4
- }
5
1
  export declare const DisableModelFeature: {
6
2
  name: string;
7
- register(container: import("@webiny/di").Container, context: LegacyDeps): void;
3
+ register(container: import("@webiny/di").Container): void;
8
4
  };
@@ -1,6 +1,7 @@
1
1
  import { createFeature } from "@webiny/feature/api";
2
2
  import { BlockActionIfModelDisabled } from "./abstractions.js";
3
3
  import { BlockActionIfModelDisabled as external_BlockActionIfModelDisabled_js_BlockActionIfModelDisabled } from "./BlockActionIfModelDisabled.js";
4
+ import { DeleteModelOperations } from "../../graphql/deleteModel/abstractions.js";
4
5
  import { BlockModelActionOnEntryBeforeCreate } from "./handlers/BlockModelActionOnEntryBeforeCreate.js";
5
6
  import { BlockModelActionOnEntryRevisionBeforeCreate } from "./handlers/BlockModelActionOnEntryRevisionBeforeCreate.js";
6
7
  import { BlockModelActionOnEntryBeforeUpdate } from "./handlers/BlockModelActionOnEntryBeforeUpdate.js";
@@ -13,8 +14,9 @@ import { BlockModelActionOnModelBeforeUpdate } from "./handlers/BlockModelAction
13
14
  import { BlockModelActionOnModelBeforeCreateFrom } from "./handlers/BlockModelActionOnModelBeforeCreateFrom.js";
14
15
  const DisableModelFeature = createFeature({
15
16
  name: "DisableModel",
16
- register (container, params) {
17
- container.registerInstance(BlockActionIfModelDisabled, new external_BlockActionIfModelDisabled_js_BlockActionIfModelDisabled(params.isModelBeingDeleted));
17
+ register (container) {
18
+ const ops = container.resolve(DeleteModelOperations);
19
+ container.registerInstance(BlockActionIfModelDisabled, new external_BlockActionIfModelDisabled_js_BlockActionIfModelDisabled(ops.isModelBeingDeleted.bind(ops)));
18
20
  container.register(BlockModelActionOnEntryBeforeCreate);
19
21
  container.register(BlockModelActionOnEntryRevisionBeforeCreate);
20
22
  container.register(BlockModelActionOnEntryBeforeUpdate);
@@ -1 +1 @@
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
+ {"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 { DeleteModelOperations } from \"~/graphql/deleteModel/abstractions.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 const DisableModelFeature = createFeature({\n name: \"DisableModel\",\n register(container) {\n const ops = container.resolve(DeleteModelOperations);\n\n container.registerInstance(\n Abstraction,\n new BlockActionIfModelDisabled(ops.isModelBeingDeleted.bind(ops))\n );\n\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 container.register(BlockModelActionOnModelBeforeUpdate);\n container.register(BlockModelActionOnModelBeforeCreateFrom);\n }\n});\n"],"names":["DisableModelFeature","createFeature","container","ops","DeleteModelOperations","Abstraction","BlockActionIfModelDisabled","BlockModelActionOnEntryBeforeCreate","BlockModelActionOnEntryRevisionBeforeCreate","BlockModelActionOnEntryBeforeUpdate","BlockModelActionOnEntryBeforeUnpublish","BlockModelActionOnEntryBeforePublish","BlockModelActionOnEntryBeforeRepublish","BlockModelActionOnEntryBeforeRestoreFromBin","BlockModelActionOnEntryBeforeMove","BlockModelActionOnModelBeforeUpdate","BlockModelActionOnModelBeforeCreateFrom"],"mappings":";;;;;;;;;;;;;;AAeO,MAAMA,sBAAsBC,cAAc;IAC7C,MAAM;IACN,UAASC,SAAS;QACd,MAAMC,MAAMD,UAAU,OAAO,CAACE;QAE9BF,UAAU,gBAAgB,CACtBG,4BACA,IAAIC,kEAA2BH,IAAI,mBAAmB,CAAC,IAAI,CAACA;QAGhED,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;QACnBX,UAAU,QAAQ,CAACY;QAEnBZ,UAAU,QAAQ,CAACa;QACnBb,UAAU,QAAQ,CAACc;IACvB;AACJ"}
@@ -0,0 +1,12 @@
1
+ import type { IDeleteCmsModelTask, IStoreValue } from "../../features/DeleteModelTask/types.js";
2
+ export interface IDeleteModelOperations {
3
+ listModelsBeingDeleted(): Promise<IStoreValue[]>;
4
+ isModelBeingDeleted(modelId: string): Promise<boolean>;
5
+ fullyDeleteModel(modelId: string): Promise<IDeleteCmsModelTask>;
6
+ cancelFullyDeleteModel(modelId: string): Promise<IDeleteCmsModelTask>;
7
+ getDeleteModelProgress(modelId: string): Promise<IDeleteCmsModelTask>;
8
+ }
9
+ export declare const DeleteModelOperations: import("@webiny/di").Abstraction<IDeleteModelOperations>;
10
+ export declare namespace DeleteModelOperations {
11
+ type Interface = IDeleteModelOperations;
12
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const DeleteModelOperations = createAbstraction("DeleteModelOperations");
3
+ export { DeleteModelOperations };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql/deleteModel/abstractions.js","sources":["../../../src/graphql/deleteModel/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { IDeleteCmsModelTask, IStoreValue } from \"~/features/DeleteModelTask/types.js\";\n\nexport interface IDeleteModelOperations {\n listModelsBeingDeleted(): Promise<IStoreValue[]>;\n isModelBeingDeleted(modelId: string): Promise<boolean>;\n fullyDeleteModel(modelId: string): Promise<IDeleteCmsModelTask>;\n cancelFullyDeleteModel(modelId: string): Promise<IDeleteCmsModelTask>;\n getDeleteModelProgress(modelId: string): Promise<IDeleteCmsModelTask>;\n}\n\nexport const DeleteModelOperations =\n createAbstraction<IDeleteModelOperations>(\"DeleteModelOperations\");\n\nexport namespace DeleteModelOperations {\n export type Interface = IDeleteModelOperations;\n}\n"],"names":["DeleteModelOperations","createAbstraction"],"mappings":";AAWO,MAAMA,wBACTC,kBAA0C"}
@@ -1,7 +1,7 @@
1
1
  import type { HcmsTasksContext } from "../../types.js";
2
2
  import type { IDeleteCmsModelTask } from "../../features/DeleteModelTask/types.js";
3
3
  export interface ICancelDeleteModelParams {
4
- readonly context: Pick<HcmsTasksContext, "cms" | "tasks" | "db" | "container">;
4
+ readonly context: Pick<HcmsTasksContext, "container">;
5
5
  readonly modelId: string;
6
6
  }
7
7
  export declare const cancelDeleteModel: (params: ICancelDeleteModelParams) => Promise<IDeleteCmsModelTask>;
@@ -1,12 +1,17 @@
1
1
  import { WebinyError } from "@webiny/error";
2
- import { createStoreKey } from "../../helpers/store.js";
2
+ import { createDeleteModelStore } from "../../helpers/store.js";
3
3
  import { DELETE_MODEL_TASK } from "../../constants.js";
4
4
  import { getStatus } from "./status.js";
5
5
  import { NotAuthorizedError } from "@webiny/api-headless-cms/utils/errors.js";
6
6
  import { AccessControl } from "@webiny/api-headless-cms/features/shared/abstractions.js";
7
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
8
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/abstractions.js";
9
+ import { AbortTaskUseCase, GetTaskUseCase } from "@webiny/background-tasks/api";
7
10
  const cancelDeleteModel = async (params)=>{
8
11
  const { context, modelId } = params;
9
- const model = await context.cms.getModel(modelId);
12
+ const modelResult = await context.container.resolve(GetModelUseCase).execute(modelId);
13
+ if (modelResult.isFail()) throw modelResult.error;
14
+ const model = modelResult.value;
10
15
  const accessControl = context.container.resolve(AccessControl);
11
16
  const canAccessModel = await accessControl.canAccessModel({
12
17
  model,
@@ -18,20 +23,15 @@ const cancelDeleteModel = async (params)=>{
18
23
  rwd: "w"
19
24
  });
20
25
  if (!canAccessEntry) throw new NotAuthorizedError(`Not allowed to access "${model.modelId}" entries.`);
21
- const storeKey = createStoreKey(model);
22
- const result = await context.db.store.getValue(storeKey);
23
- const taskId = result.data?.task;
24
- await context.db.store.removeValue(storeKey);
25
- if (!taskId) {
26
- if (result.error) throw WebinyError.from(result.error, {
27
- code: "DELETE_MODEL_NO_TASK_DEFINED"
28
- });
29
- throw new WebinyError({
30
- message: `Model "${modelId}" is not being deleted.`,
31
- code: "MODEL_NOT_BEING_DELETED"
32
- });
33
- }
34
- const task = await context.tasks.getTask(taskId);
26
+ const store = createDeleteModelStore(context.container.resolve(GlobalKeyValueStore), model.tenant);
27
+ const existing = await store.get(model.modelId);
28
+ const taskId = existing?.task;
29
+ await store.remove(model.modelId);
30
+ if (!taskId) throw new WebinyError({
31
+ message: `Model "${modelId}" is not being deleted.`,
32
+ code: "MODEL_NOT_BEING_DELETED"
33
+ });
34
+ const task = await context.container.resolve(GetTaskUseCase).execute(taskId);
35
35
  if (task?.definitionId !== DELETE_MODEL_TASK) throw new WebinyError({
36
36
  message: `The task which is deleting a model cannot be found. Please check Step Functions for more info. Task id: ${taskId}`,
37
37
  code: "DELETE_MODEL_TASK_NOT_FOUND",
@@ -40,7 +40,7 @@ const cancelDeleteModel = async (params)=>{
40
40
  task: taskId
41
41
  }
42
42
  });
43
- const abortResult = await context.tasks.abort({
43
+ const abortResult = await context.container.resolve(AbortTaskUseCase).execute({
44
44
  id: task.id,
45
45
  message: "User canceled the task."
46
46
  });
@@ -1 +1 @@
1
- {"version":3,"file":"graphql/deleteModel/cancelDeleteModel.js","sources":["../../../src/graphql/deleteModel/cancelDeleteModel.ts"],"sourcesContent":["import type { HcmsTasksContext } from \"~/types.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport type {\n IDeleteCmsModelTask,\n IDeleteModelTaskInput,\n IDeleteModelTaskOutput,\n IStoreValue\n} from \"~/features/DeleteModelTask/types.js\";\nimport { createStoreKey } from \"~/helpers/store.js\";\nimport { DELETE_MODEL_TASK } from \"~/constants.js\";\nimport { getStatus } from \"~/graphql/deleteModel/status.js\";\nimport { NotAuthorizedError } from \"@webiny/api-headless-cms/utils/errors.js\";\nimport { AccessControl } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\n\nexport interface ICancelDeleteModelParams {\n readonly context: Pick<HcmsTasksContext, \"cms\" | \"tasks\" | \"db\" | \"container\">;\n readonly modelId: string;\n}\n\nexport const cancelDeleteModel = async (\n params: ICancelDeleteModelParams\n): Promise<IDeleteCmsModelTask> => {\n const { context, modelId } = params;\n\n const model = await context.cms.getModel(modelId);\n const accessControl = context.container.resolve(AccessControl);\n\n const canAccessModel = await accessControl.canAccessModel({ model, rwd: \"d\" });\n if (!canAccessModel) {\n throw new NotAuthorizedError(`Not allowed to access content model \"${model.name}\".`);\n }\n\n const canAccessEntry = await accessControl.canAccessEntry({ model, rwd: \"w\" });\n if (!canAccessEntry) {\n throw new NotAuthorizedError(`Not allowed to access \"${model.modelId}\" entries.`);\n }\n\n const storeKey = createStoreKey(model);\n\n const result = await context.db.store.getValue<IStoreValue>(storeKey);\n\n const taskId = result.data?.task;\n\n await context.db.store.removeValue(storeKey);\n if (!taskId) {\n if (result.error) {\n throw WebinyError.from(result.error, {\n code: \"DELETE_MODEL_NO_TASK_DEFINED\"\n });\n }\n throw new WebinyError({\n message: `Model \"${modelId}\" is not being deleted.`,\n code: \"MODEL_NOT_BEING_DELETED\"\n });\n }\n\n const task = await context.tasks.getTask<IDeleteModelTaskInput, IDeleteModelTaskOutput>(taskId);\n if (task?.definitionId !== DELETE_MODEL_TASK) {\n throw new WebinyError({\n message: `The task which is deleting a model cannot be found. Please check Step Functions for more info. Task id: ${taskId}`,\n code: \"DELETE_MODEL_TASK_NOT_FOUND\",\n data: {\n model: model.modelId,\n task: taskId\n }\n });\n }\n\n const abortResult = await context.tasks.abort<IDeleteModelTaskInput, IDeleteModelTaskOutput>({\n id: task.id,\n message: \"User canceled the task.\"\n });\n\n const canceledTask = abortResult.value;\n\n return {\n id: canceledTask.id,\n status: getStatus(canceledTask.taskStatus),\n total: canceledTask.output?.total || 0,\n deleted: canceledTask.output?.deleted || 0\n };\n};\n"],"names":["cancelDeleteModel","params","context","modelId","model","accessControl","AccessControl","canAccessModel","NotAuthorizedError","canAccessEntry","storeKey","createStoreKey","result","taskId","WebinyError","task","DELETE_MODEL_TASK","abortResult","canceledTask","getStatus"],"mappings":";;;;;;AAmBO,MAAMA,oBAAoB,OAC7BC;IAEA,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAE,GAAGF;IAE7B,MAAMG,QAAQ,MAAMF,QAAQ,GAAG,CAAC,QAAQ,CAACC;IACzC,MAAME,gBAAgBH,QAAQ,SAAS,CAAC,OAAO,CAACI;IAEhD,MAAMC,iBAAiB,MAAMF,cAAc,cAAc,CAAC;QAAED;QAAO,KAAK;IAAI;IAC5E,IAAI,CAACG,gBACD,MAAM,IAAIC,mBAAmB,CAAC,qCAAqC,EAAEJ,MAAM,IAAI,CAAC,EAAE,CAAC;IAGvF,MAAMK,iBAAiB,MAAMJ,cAAc,cAAc,CAAC;QAAED;QAAO,KAAK;IAAI;IAC5E,IAAI,CAACK,gBACD,MAAM,IAAID,mBAAmB,CAAC,uBAAuB,EAAEJ,MAAM,OAAO,CAAC,UAAU,CAAC;IAGpF,MAAMM,WAAWC,eAAeP;IAEhC,MAAMQ,SAAS,MAAMV,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAcQ;IAE5D,MAAMG,SAASD,OAAO,IAAI,EAAE;IAE5B,MAAMV,QAAQ,EAAE,CAAC,KAAK,CAAC,WAAW,CAACQ;IACnC,IAAI,CAACG,QAAQ;QACT,IAAID,OAAO,KAAK,EACZ,MAAME,YAAY,IAAI,CAACF,OAAO,KAAK,EAAE;YACjC,MAAM;QACV;QAEJ,MAAM,IAAIE,YAAY;YAClB,SAAS,CAAC,OAAO,EAAEX,QAAQ,uBAAuB,CAAC;YACnD,MAAM;QACV;IACJ;IAEA,MAAMY,OAAO,MAAMb,QAAQ,KAAK,CAAC,OAAO,CAAgDW;IACxF,IAAIE,MAAM,iBAAiBC,mBACvB,MAAM,IAAIF,YAAY;QAClB,SAAS,CAAC,wGAAwG,EAAED,QAAQ;QAC5H,MAAM;QACN,MAAM;YACF,OAAOT,MAAM,OAAO;YACpB,MAAMS;QACV;IACJ;IAGJ,MAAMI,cAAc,MAAMf,QAAQ,KAAK,CAAC,KAAK,CAAgD;QACzF,IAAIa,KAAK,EAAE;QACX,SAAS;IACb;IAEA,MAAMG,eAAeD,YAAY,KAAK;IAEtC,OAAO;QACH,IAAIC,aAAa,EAAE;QACnB,QAAQC,UAAUD,aAAa,UAAU;QACzC,OAAOA,aAAa,MAAM,EAAE,SAAS;QACrC,SAASA,aAAa,MAAM,EAAE,WAAW;IAC7C;AACJ"}
1
+ {"version":3,"file":"graphql/deleteModel/cancelDeleteModel.js","sources":["../../../src/graphql/deleteModel/cancelDeleteModel.ts"],"sourcesContent":["import type { HcmsTasksContext } from \"~/types.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport type {\n IDeleteCmsModelTask,\n IDeleteModelTaskInput,\n IDeleteModelTaskOutput\n} from \"~/features/DeleteModelTask/types.js\";\nimport { createDeleteModelStore } from \"~/helpers/store.js\";\nimport { DELETE_MODEL_TASK } from \"~/constants.js\";\nimport { getStatus } from \"~/graphql/deleteModel/status.js\";\nimport { NotAuthorizedError } from \"@webiny/api-headless-cms/utils/errors.js\";\nimport { AccessControl } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/abstractions.js\";\nimport { GetTaskUseCase, AbortTaskUseCase } from \"@webiny/background-tasks/api\";\n\nexport interface ICancelDeleteModelParams {\n readonly context: Pick<HcmsTasksContext, \"container\">;\n readonly modelId: string;\n}\n\nexport const cancelDeleteModel = async (\n params: ICancelDeleteModelParams\n): Promise<IDeleteCmsModelTask> => {\n const { context, modelId } = params;\n\n const modelResult = await context.container.resolve(GetModelUseCase).execute(modelId);\n if (modelResult.isFail()) {\n throw modelResult.error;\n }\n const model = modelResult.value;\n const accessControl = context.container.resolve(AccessControl);\n\n const canAccessModel = await accessControl.canAccessModel({ model, rwd: \"d\" });\n if (!canAccessModel) {\n throw new NotAuthorizedError(`Not allowed to access content model \"${model.name}\".`);\n }\n\n const canAccessEntry = await accessControl.canAccessEntry({ model, rwd: \"w\" });\n if (!canAccessEntry) {\n throw new NotAuthorizedError(`Not allowed to access \"${model.modelId}\" entries.`);\n }\n\n const store = createDeleteModelStore(\n context.container.resolve(GlobalKeyValueStore),\n model.tenant\n );\n const existing = await store.get(model.modelId);\n const taskId = existing?.task;\n\n await store.remove(model.modelId);\n if (!taskId) {\n throw new WebinyError({\n message: `Model \"${modelId}\" is not being deleted.`,\n code: \"MODEL_NOT_BEING_DELETED\"\n });\n }\n\n const task = await context.container\n .resolve(GetTaskUseCase)\n .execute<IDeleteModelTaskInput, IDeleteModelTaskOutput>(taskId);\n if (task?.definitionId !== DELETE_MODEL_TASK) {\n throw new WebinyError({\n message: `The task which is deleting a model cannot be found. Please check Step Functions for more info. Task id: ${taskId}`,\n code: \"DELETE_MODEL_TASK_NOT_FOUND\",\n data: {\n model: model.modelId,\n task: taskId\n }\n });\n }\n\n const abortResult = await context.container\n .resolve(AbortTaskUseCase)\n .execute<IDeleteModelTaskInput, IDeleteModelTaskOutput>({\n id: task.id,\n message: \"User canceled the task.\"\n });\n\n const canceledTask = abortResult.value;\n\n return {\n id: canceledTask.id,\n status: getStatus(canceledTask.taskStatus),\n total: canceledTask.output?.total || 0,\n deleted: canceledTask.output?.deleted || 0\n };\n};\n"],"names":["cancelDeleteModel","params","context","modelId","modelResult","GetModelUseCase","model","accessControl","AccessControl","canAccessModel","NotAuthorizedError","canAccessEntry","store","createDeleteModelStore","GlobalKeyValueStore","existing","taskId","WebinyError","task","GetTaskUseCase","DELETE_MODEL_TASK","abortResult","AbortTaskUseCase","canceledTask","getStatus"],"mappings":";;;;;;;;;AAqBO,MAAMA,oBAAoB,OAC7BC;IAEA,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAE,GAAGF;IAE7B,MAAMG,cAAc,MAAMF,QAAQ,SAAS,CAAC,OAAO,CAACG,iBAAiB,OAAO,CAACF;IAC7E,IAAIC,YAAY,MAAM,IAClB,MAAMA,YAAY,KAAK;IAE3B,MAAME,QAAQF,YAAY,KAAK;IAC/B,MAAMG,gBAAgBL,QAAQ,SAAS,CAAC,OAAO,CAACM;IAEhD,MAAMC,iBAAiB,MAAMF,cAAc,cAAc,CAAC;QAAED;QAAO,KAAK;IAAI;IAC5E,IAAI,CAACG,gBACD,MAAM,IAAIC,mBAAmB,CAAC,qCAAqC,EAAEJ,MAAM,IAAI,CAAC,EAAE,CAAC;IAGvF,MAAMK,iBAAiB,MAAMJ,cAAc,cAAc,CAAC;QAAED;QAAO,KAAK;IAAI;IAC5E,IAAI,CAACK,gBACD,MAAM,IAAID,mBAAmB,CAAC,uBAAuB,EAAEJ,MAAM,OAAO,CAAC,UAAU,CAAC;IAGpF,MAAMM,QAAQC,uBACVX,QAAQ,SAAS,CAAC,OAAO,CAACY,sBAC1BR,MAAM,MAAM;IAEhB,MAAMS,WAAW,MAAMH,MAAM,GAAG,CAACN,MAAM,OAAO;IAC9C,MAAMU,SAASD,UAAU;IAEzB,MAAMH,MAAM,MAAM,CAACN,MAAM,OAAO;IAChC,IAAI,CAACU,QACD,MAAM,IAAIC,YAAY;QAClB,SAAS,CAAC,OAAO,EAAEd,QAAQ,uBAAuB,CAAC;QACnD,MAAM;IACV;IAGJ,MAAMe,OAAO,MAAMhB,QAAQ,SAAS,CAC/B,OAAO,CAACiB,gBACR,OAAO,CAAgDH;IAC5D,IAAIE,MAAM,iBAAiBE,mBACvB,MAAM,IAAIH,YAAY;QAClB,SAAS,CAAC,wGAAwG,EAAED,QAAQ;QAC5H,MAAM;QACN,MAAM;YACF,OAAOV,MAAM,OAAO;YACpB,MAAMU;QACV;IACJ;IAGJ,MAAMK,cAAc,MAAMnB,QAAQ,SAAS,CACtC,OAAO,CAACoB,kBACR,OAAO,CAAgD;QACpD,IAAIJ,KAAK,EAAE;QACX,SAAS;IACb;IAEJ,MAAMK,eAAeF,YAAY,KAAK;IAEtC,OAAO;QACH,IAAIE,aAAa,EAAE;QACnB,QAAQC,UAAUD,aAAa,UAAU;QACzC,OAAOA,aAAa,MAAM,EAAE,SAAS;QACrC,SAASA,aAAa,MAAM,EAAE,WAAW;IAC7C;AACJ"}
@@ -1,3 +1,2 @@
1
- import type { HcmsTasksContext } from "../../types.js";
2
- import { ContextPlugin } from "@webiny/api";
3
- export declare const createDeleteModelCrud: () => ContextPlugin<HcmsTasksContext>;
1
+ import type { RequestContextInitializer } from "@webiny/event-handler-core";
2
+ export declare const createDeleteModelCrud: () => RequestContextInitializer.Interface;
@@ -1,63 +1,56 @@
1
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/abstractions.js";
2
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/abstractions.js";
1
3
  import { createCacheKey, createMemoryCache } from "@webiny/api-headless-cms/utils/index.js";
2
- import { ContextPlugin } from "@webiny/api";
3
4
  import { DisableModelFeature } from "../../features/DisableModel/feature.js";
4
- import { createStoreNamespace } from "../../helpers/store.js";
5
+ import { createDeleteModelStore } from "../../helpers/store.js";
5
6
  import { fullyDeleteModel } from "./fullyDeleteModel.js";
6
7
  import { cancelDeleteModel } from "./cancelDeleteModel.js";
7
8
  import { getDeleteModelProgress } from "./getDeleteModelProgress.js";
8
- const createDeleteModelCrud = ()=>{
9
- const plugin = new ContextPlugin(async (context)=>{
10
- const getTenant = ()=>context.tenancy.getCurrentTenant().id;
11
- const cache = createMemoryCache();
12
- context.cms.listModelsBeingDeleted = async ()=>{
13
- const tenant = getTenant();
14
- const cacheKey = createCacheKey({
15
- tenant: getTenant(),
16
- type: "deleteModel"
17
- });
18
- const result = await cache.getOrSet(cacheKey, async ()=>{
19
- const beginsWith = createStoreNamespace({
20
- tenant
9
+ import { DeleteModelOperations } from "./abstractions.js";
10
+ const createDeleteModelCrud = ()=>({
11
+ async init (context) {
12
+ const getTenant = ()=>context.container.resolve(TenantContext).getTenant().id;
13
+ const getStore = ()=>createDeleteModelStore(context.container.resolve(GlobalKeyValueStore), getTenant());
14
+ const cache = createMemoryCache();
15
+ const listModelsBeingDeleted = async ()=>{
16
+ const cacheKey = createCacheKey({
17
+ tenant: getTenant(),
18
+ type: "deleteModel"
21
19
  });
22
- return await context.db.store.listValues({
23
- beginsWith
24
- });
25
- });
26
- if (result.error) throw result.error;
27
- if (!result.data) return [];
28
- return Object.values(result.data);
29
- };
30
- context.cms.isModelBeingDeleted = async (modelId)=>{
31
- const items = await context.cms.listModelsBeingDeleted();
32
- return items.some((item)=>item.modelId === modelId);
33
- };
34
- context.cms.fullyDeleteModel = async (modelId)=>{
35
- const result = await fullyDeleteModel({
36
- context,
37
- modelId
38
- });
39
- cache.clear();
40
- return result;
41
- };
42
- context.cms.cancelFullyDeleteModel = async (modelId)=>{
43
- const result = await cancelDeleteModel({
44
- context,
45
- modelId
46
- });
47
- cache.clear();
48
- return result;
49
- };
50
- context.cms.getDeleteModelProgress = async (modelId)=>await getDeleteModelProgress({
51
- context,
52
- modelId
53
- });
54
- DisableModelFeature.register(context.container, {
55
- isModelBeingDeleted: context.cms.isModelBeingDeleted
56
- });
20
+ return cache.getOrSet(cacheKey, ()=>getStore().list());
21
+ };
22
+ const isModelBeingDeleted = async (modelId)=>{
23
+ const items = await listModelsBeingDeleted();
24
+ return items.some((item)=>item.modelId === modelId);
25
+ };
26
+ const operations = {
27
+ listModelsBeingDeleted,
28
+ isModelBeingDeleted,
29
+ fullyDeleteModel: async (modelId)=>{
30
+ const result = await fullyDeleteModel({
31
+ context,
32
+ modelId
33
+ });
34
+ cache.clear();
35
+ return result;
36
+ },
37
+ cancelFullyDeleteModel: async (modelId)=>{
38
+ const result = await cancelDeleteModel({
39
+ context,
40
+ modelId
41
+ });
42
+ cache.clear();
43
+ return result;
44
+ },
45
+ getDeleteModelProgress: async (modelId)=>getDeleteModelProgress({
46
+ context,
47
+ modelId
48
+ })
49
+ };
50
+ context.container.registerInstance(DeleteModelOperations, operations);
51
+ DisableModelFeature.register(context.container);
52
+ }
57
53
  });
58
- plugin.name = "headlessCms.context.cms.fullyDeleteModel";
59
- return plugin;
60
- };
61
54
  export { createDeleteModelCrud };
62
55
 
63
56
  //# sourceMappingURL=crud.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"graphql/deleteModel/crud.js","sources":["../../../src/graphql/deleteModel/crud.ts"],"sourcesContent":["import type { HcmsTasksContext } from \"~/types.js\";\nimport { createCacheKey } from \"@webiny/api-headless-cms/utils/index.js\";\nimport { createMemoryCache } from \"@webiny/api-headless-cms/utils/index.js\";\nimport type { IStoreValue } from \"~/features/DeleteModelTask/types.js\";\nimport type { ListStoreKeysResult } from \"~/features/DeleteModelTask/types.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { DisableModelFeature } from \"~/features/DisableModel/feature.js\";\nimport { createStoreNamespace } from \"~/helpers/store.js\";\nimport { fullyDeleteModel } from \"~/graphql/deleteModel/fullyDeleteModel.js\";\nimport { cancelDeleteModel } from \"~/graphql/deleteModel/cancelDeleteModel.js\";\nimport { getDeleteModelProgress } from \"~/graphql/deleteModel/getDeleteModelProgress.js\";\n\nexport const createDeleteModelCrud = () => {\n const plugin = new ContextPlugin<HcmsTasksContext>(async context => {\n const getTenant = (): string => {\n return context.tenancy.getCurrentTenant().id;\n };\n\n const cache = createMemoryCache<ListStoreKeysResult>();\n\n context.cms.listModelsBeingDeleted = async () => {\n const tenant = getTenant();\n const cacheKey = createCacheKey({\n tenant: getTenant(),\n type: \"deleteModel\"\n });\n\n const result = await cache.getOrSet(cacheKey, async () => {\n const beginsWith = createStoreNamespace({\n tenant\n });\n return await context.db.store.listValues<GenericRecord<string, IStoreValue>>({\n beginsWith\n });\n });\n\n if (result.error) {\n throw result.error;\n } else if (!result.data) {\n return [];\n }\n return Object.values(result.data);\n };\n\n context.cms.isModelBeingDeleted = async (modelId: string) => {\n const items = await context.cms.listModelsBeingDeleted();\n return items.some(item => item.modelId === modelId);\n };\n context.cms.fullyDeleteModel = async (modelId: string) => {\n const result = await fullyDeleteModel({\n context,\n modelId\n });\n cache.clear();\n return result;\n };\n\n context.cms.cancelFullyDeleteModel = async (modelId: string) => {\n const result = await cancelDeleteModel({\n context,\n modelId\n });\n cache.clear();\n return result;\n };\n\n context.cms.getDeleteModelProgress = async (modelId: string) => {\n return await getDeleteModelProgress({\n context,\n modelId\n });\n };\n\n // Register feature\n DisableModelFeature.register(context.container, {\n isModelBeingDeleted: context.cms.isModelBeingDeleted\n });\n });\n\n plugin.name = \"headlessCms.context.cms.fullyDeleteModel\";\n\n return plugin;\n};\n"],"names":["createDeleteModelCrud","plugin","ContextPlugin","context","getTenant","cache","createMemoryCache","tenant","cacheKey","createCacheKey","result","beginsWith","createStoreNamespace","Object","modelId","items","item","fullyDeleteModel","cancelDeleteModel","getDeleteModelProgress","DisableModelFeature"],"mappings":";;;;;;;AAaO,MAAMA,wBAAwB;IACjC,MAAMC,SAAS,IAAIC,cAAgC,OAAMC;QACrD,MAAMC,YAAY,IACPD,QAAQ,OAAO,CAAC,gBAAgB,GAAG,EAAE;QAGhD,MAAME,QAAQC;QAEdH,QAAQ,GAAG,CAAC,sBAAsB,GAAG;YACjC,MAAMI,SAASH;YACf,MAAMI,WAAWC,eAAe;gBAC5B,QAAQL;gBACR,MAAM;YACV;YAEA,MAAMM,SAAS,MAAML,MAAM,QAAQ,CAACG,UAAU;gBAC1C,MAAMG,aAAaC,qBAAqB;oBACpCL;gBACJ;gBACA,OAAO,MAAMJ,QAAQ,EAAE,CAAC,KAAK,CAAC,UAAU,CAAqC;oBACzEQ;gBACJ;YACJ;YAEA,IAAID,OAAO,KAAK,EACZ,MAAMA,OAAO,KAAK;YACf,IAAI,CAACA,OAAO,IAAI,EACnB,OAAO,EAAE;YAEb,OAAOG,OAAO,MAAM,CAACH,OAAO,IAAI;QACpC;QAEAP,QAAQ,GAAG,CAAC,mBAAmB,GAAG,OAAOW;YACrC,MAAMC,QAAQ,MAAMZ,QAAQ,GAAG,CAAC,sBAAsB;YACtD,OAAOY,MAAM,IAAI,CAACC,CAAAA,OAAQA,KAAK,OAAO,KAAKF;QAC/C;QACAX,QAAQ,GAAG,CAAC,gBAAgB,GAAG,OAAOW;YAClC,MAAMJ,SAAS,MAAMO,iBAAiB;gBAClCd;gBACAW;YACJ;YACAT,MAAM,KAAK;YACX,OAAOK;QACX;QAEAP,QAAQ,GAAG,CAAC,sBAAsB,GAAG,OAAOW;YACxC,MAAMJ,SAAS,MAAMQ,kBAAkB;gBACnCf;gBACAW;YACJ;YACAT,MAAM,KAAK;YACX,OAAOK;QACX;QAEAP,QAAQ,GAAG,CAAC,sBAAsB,GAAG,OAAOW,UACjC,MAAMK,uBAAuB;gBAChChB;gBACAW;YACJ;QAIJM,oBAAoB,QAAQ,CAACjB,QAAQ,SAAS,EAAE;YAC5C,qBAAqBA,QAAQ,GAAG,CAAC,mBAAmB;QACxD;IACJ;IAEAF,OAAO,IAAI,GAAG;IAEd,OAAOA;AACX"}
1
+ {"version":3,"file":"graphql/deleteModel/crud.js","sources":["../../../src/graphql/deleteModel/crud.ts"],"sourcesContent":["import type { HcmsTasksContext } from \"~/types.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/abstractions.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/abstractions.js\";\nimport { createCacheKey } from \"@webiny/api-headless-cms/utils/index.js\";\nimport { createMemoryCache } from \"@webiny/api-headless-cms/utils/index.js\";\nimport type { IStoreValue } from \"~/features/DeleteModelTask/types.js\";\nimport type { RequestContextInitializer } from \"@webiny/event-handler-core\";\nimport { DisableModelFeature } from \"~/features/DisableModel/feature.js\";\nimport { createDeleteModelStore } from \"~/helpers/store.js\";\nimport { fullyDeleteModel } from \"~/graphql/deleteModel/fullyDeleteModel.js\";\nimport { cancelDeleteModel } from \"~/graphql/deleteModel/cancelDeleteModel.js\";\nimport { getDeleteModelProgress } from \"~/graphql/deleteModel/getDeleteModelProgress.js\";\nimport { DeleteModelOperations } from \"~/graphql/deleteModel/abstractions.js\";\n\nexport const createDeleteModelCrud = (): RequestContextInitializer.Interface => ({\n async init(context: HcmsTasksContext) {\n const getTenant = (): string => {\n return context.container.resolve(TenantContext).getTenant().id;\n };\n\n const getStore = () => {\n return createDeleteModelStore(\n context.container.resolve(GlobalKeyValueStore),\n getTenant()\n );\n };\n\n const cache = createMemoryCache<Promise<IStoreValue[]>>();\n\n const listModelsBeingDeleted = async (): Promise<IStoreValue[]> => {\n const cacheKey = createCacheKey({\n tenant: getTenant(),\n type: \"deleteModel\"\n });\n\n return cache.getOrSet(cacheKey, () => getStore().list());\n };\n\n const isModelBeingDeleted = async (modelId: string): Promise<boolean> => {\n const items = await listModelsBeingDeleted();\n return items.some(item => item.modelId === modelId);\n };\n\n const operations: DeleteModelOperations.Interface = {\n listModelsBeingDeleted,\n isModelBeingDeleted,\n fullyDeleteModel: async (modelId: string) => {\n const result = await fullyDeleteModel({ context, modelId });\n cache.clear();\n return result;\n },\n cancelFullyDeleteModel: async (modelId: string) => {\n const result = await cancelDeleteModel({ context, modelId });\n cache.clear();\n return result;\n },\n getDeleteModelProgress: async (modelId: string) => {\n return getDeleteModelProgress({ context, modelId });\n }\n };\n\n context.container.registerInstance(DeleteModelOperations, operations);\n\n DisableModelFeature.register(context.container);\n }\n});\n"],"names":["createDeleteModelCrud","context","getTenant","TenantContext","getStore","createDeleteModelStore","GlobalKeyValueStore","cache","createMemoryCache","listModelsBeingDeleted","cacheKey","createCacheKey","isModelBeingDeleted","modelId","items","item","operations","result","fullyDeleteModel","cancelDeleteModel","getDeleteModelProgress","DeleteModelOperations","DisableModelFeature"],"mappings":";;;;;;;;;AAcO,MAAMA,wBAAwB,IAA4C;QAC7E,MAAM,MAAKC,OAAyB;YAChC,MAAMC,YAAY,IACPD,QAAQ,SAAS,CAAC,OAAO,CAACE,eAAe,SAAS,GAAG,EAAE;YAGlE,MAAMC,WAAW,IACNC,uBACHJ,QAAQ,SAAS,CAAC,OAAO,CAACK,sBAC1BJ;YAIR,MAAMK,QAAQC;YAEd,MAAMC,yBAAyB;gBAC3B,MAAMC,WAAWC,eAAe;oBAC5B,QAAQT;oBACR,MAAM;gBACV;gBAEA,OAAOK,MAAM,QAAQ,CAACG,UAAU,IAAMN,WAAW,IAAI;YACzD;YAEA,MAAMQ,sBAAsB,OAAOC;gBAC/B,MAAMC,QAAQ,MAAML;gBACpB,OAAOK,MAAM,IAAI,CAACC,CAAAA,OAAQA,KAAK,OAAO,KAAKF;YAC/C;YAEA,MAAMG,aAA8C;gBAChDP;gBACAG;gBACA,kBAAkB,OAAOC;oBACrB,MAAMI,SAAS,MAAMC,iBAAiB;wBAAEjB;wBAASY;oBAAQ;oBACzDN,MAAM,KAAK;oBACX,OAAOU;gBACX;gBACA,wBAAwB,OAAOJ;oBAC3B,MAAMI,SAAS,MAAME,kBAAkB;wBAAElB;wBAASY;oBAAQ;oBAC1DN,MAAM,KAAK;oBACX,OAAOU;gBACX;gBACA,wBAAwB,OAAOJ,UACpBO,uBAAuB;wBAAEnB;wBAASY;oBAAQ;YAEzD;YAEAZ,QAAQ,SAAS,CAAC,gBAAgB,CAACoB,uBAAuBL;YAE1DM,oBAAoB,QAAQ,CAACrB,QAAQ,SAAS;QAClD;IACJ"}
@@ -1,7 +1,7 @@
1
1
  import type { HcmsTasksContext } from "../../types.js";
2
2
  import type { IDeleteCmsModelTask } from "../../features/DeleteModelTask/types.js";
3
3
  export interface IFullyDeleteModelParams {
4
- readonly context: Pick<HcmsTasksContext, "cms" | "tasks" | "db" | "security">;
4
+ readonly context: Pick<HcmsTasksContext, "container">;
5
5
  readonly modelId: string;
6
6
  }
7
7
  export declare const fullyDeleteModel: (params: IFullyDeleteModelParams) => Promise<IDeleteCmsModelTask>;