@webiny/api-headless-cms-bulk-actions 6.4.5 → 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 (50) hide show
  1. package/BulkActionsEventBridgeLambdaHandler.d.ts +13 -0
  2. package/BulkActionsEventBridgeLambdaHandler.js +33 -0
  3. package/BulkActionsEventBridgeLambdaHandler.js.map +1 -0
  4. package/HcmsBulkActionsFeature.d.ts +7 -0
  5. package/HcmsBulkActionsFeature.js +40 -0
  6. package/HcmsBulkActionsFeature.js.map +1 -0
  7. package/features/EntriesBulkAction/createBulkActionTasks.js +12 -8
  8. package/features/EntriesBulkAction/createBulkActionTasks.js.map +1 -1
  9. package/features/EntriesBulkAction/internals/ChildTasksCleanup.d.ts +2 -2
  10. package/features/EntriesBulkAction/internals/ChildTasksCleanup.js +8 -8
  11. package/features/EntriesBulkAction/internals/ChildTasksCleanup.js.map +1 -1
  12. package/features/EntriesBulkAction/internals/CreateTasksByModel.d.ts +4 -4
  13. package/features/EntriesBulkAction/internals/CreateTasksByModel.js +6 -6
  14. package/features/EntriesBulkAction/internals/CreateTasksByModel.js.map +1 -1
  15. package/features/EntriesBulkAction/internals/ProcessTask.d.ts +1 -1
  16. package/features/EntriesBulkAction/internals/ProcessTasksByModel.d.ts +3 -3
  17. package/features/EntriesBulkAction/internals/ProcessTasksByModel.js +3 -3
  18. package/features/EntriesBulkAction/internals/ProcessTasksByModel.js.map +1 -1
  19. package/features/EntriesBulkAction/internals/TaskCache.d.ts +4 -4
  20. package/features/EntriesBulkAction/internals/TaskCache.js +2 -2
  21. package/features/EntriesBulkAction/internals/TaskCache.js.map +1 -1
  22. package/graphql/createBulkActionGraphQL.js +21 -18
  23. package/graphql/createBulkActionGraphQL.js.map +1 -1
  24. package/graphql/createDefaultGraphQL.d.ts +7 -2
  25. package/graphql/createDefaultGraphQL.js +41 -39
  26. package/graphql/createDefaultGraphQL.js.map +1 -1
  27. package/index.d.ts +3 -7
  28. package/index.js +2 -46
  29. package/package.json +20 -15
  30. package/tasks/EmptyTrashBinTaskDefinition.d.ts +1 -1
  31. package/features/BulkActionContext/abstractions.d.ts +0 -5
  32. package/features/BulkActionContext/abstractions.js +0 -5
  33. package/features/BulkActionContext/abstractions.js.map +0 -1
  34. package/features/BulkActionContext/index.d.ts +0 -1
  35. package/features/BulkActionContext/index.js +0 -1
  36. package/handlers/eventBridgeEventHandler.d.ts +0 -1
  37. package/handlers/eventBridgeEventHandler.js +0 -28
  38. package/handlers/eventBridgeEventHandler.js.map +0 -1
  39. package/handlers/index.d.ts +0 -1
  40. package/handlers/index.js +0 -9
  41. package/handlers/index.js.map +0 -1
  42. package/handlers/setupEventsTenant.d.ts +0 -1
  43. package/handlers/setupEventsTenant.js +0 -10
  44. package/handlers/setupEventsTenant.js.map +0 -1
  45. package/index.js.map +0 -1
  46. package/tasks/createEmptyTrashBinsTask.d.ts +0 -1
  47. package/tasks/createEmptyTrashBinsTask.js +0 -8
  48. package/tasks/createEmptyTrashBinsTask.js.map +0 -1
  49. package/tasks/index.d.ts +0 -1
  50. package/tasks/index.js +0 -1
@@ -0,0 +1,13 @@
1
+ import type { Container } from "@webiny/feature/api";
2
+ import type { EventBridgeEvent } from "@webiny/aws-sdk/types/index.js";
3
+ import { EventBridgeEventHandler, type EventBridgeResult } from "@webiny/event-handler-aws/abstractions/handlers/EventBridgeEventHandler.js";
4
+ import type { EventContext, NextFunction } from "@webiny/event-handler-core";
5
+ declare class BulkActionsEventBridgeLambdaHandlerImpl implements EventBridgeEventHandler.Interface {
6
+ private container;
7
+ constructor(container: Container);
8
+ execute(eventCtx: EventContext<EventBridgeEvent<string, any>>, _next: NextFunction): Promise<EventBridgeResult>;
9
+ }
10
+ export declare const BulkActionsEventBridgeLambdaHandler: typeof BulkActionsEventBridgeLambdaHandlerImpl & {
11
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/event-handler-aws/abstractions/handlers/EventBridgeEventHandler.js").IEventBridgeEventHandler>;
12
+ };
13
+ export {};
@@ -0,0 +1,33 @@
1
+ import { EventBridgeEventHandler } from "@webiny/event-handler-aws/abstractions/handlers/EventBridgeEventHandler.js";
2
+ import { RequestContainer } from "@webiny/event-handler-core";
3
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
4
+ import { TaskService } from "@webiny/api-core/features/task/TaskService/abstractions.js";
5
+ const DETAIL_TYPE = "WebinyEmptyTrashBin";
6
+ class BulkActionsEventBridgeLambdaHandlerImpl {
7
+ constructor(container){
8
+ this.container = container;
9
+ }
10
+ async execute(eventCtx, _next) {
11
+ if (eventCtx.event["detail-type"] !== DETAIL_TYPE) return {
12
+ success: true,
13
+ message: "Not a bulk action event."
14
+ };
15
+ await this.container.resolve(TenantContext).withRootTenant(async ()=>{
16
+ await this.container.resolve(TaskService).trigger({
17
+ definition: "hcmsEntriesEmptyTrashBins"
18
+ });
19
+ });
20
+ return {
21
+ success: true
22
+ };
23
+ }
24
+ }
25
+ const BulkActionsEventBridgeLambdaHandler = EventBridgeEventHandler.createImplementation({
26
+ implementation: BulkActionsEventBridgeLambdaHandlerImpl,
27
+ dependencies: [
28
+ RequestContainer
29
+ ]
30
+ });
31
+ export { BulkActionsEventBridgeLambdaHandler };
32
+
33
+ //# sourceMappingURL=BulkActionsEventBridgeLambdaHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BulkActionsEventBridgeLambdaHandler.js","sources":["../src/BulkActionsEventBridgeLambdaHandler.ts"],"sourcesContent":["import type { Container } from \"@webiny/feature/api\";\nimport type { EventBridgeEvent } from \"@webiny/aws-sdk/types/index.js\";\nimport {\n EventBridgeEventHandler,\n type EventBridgeResult\n} from \"@webiny/event-handler-aws/abstractions/handlers/EventBridgeEventHandler.js\";\nimport { RequestContainer } from \"@webiny/event-handler-core\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/abstractions.js\";\nimport type { EventContext, NextFunction } from \"@webiny/event-handler-core\";\n\nconst DETAIL_TYPE = \"WebinyEmptyTrashBin\";\n\nclass BulkActionsEventBridgeLambdaHandlerImpl implements EventBridgeEventHandler.Interface {\n constructor(private container: Container) {}\n\n async execute(\n eventCtx: EventContext<EventBridgeEvent<string, any>>,\n _next: NextFunction\n ): Promise<EventBridgeResult> {\n if (eventCtx.event[\"detail-type\"] !== DETAIL_TYPE) {\n return { success: true, message: \"Not a bulk action event.\" };\n }\n\n await this.container.resolve(TenantContext).withRootTenant(async () => {\n await this.container\n .resolve(TaskService)\n .trigger({ definition: \"hcmsEntriesEmptyTrashBins\" });\n });\n\n return { success: true };\n }\n}\n\nexport const BulkActionsEventBridgeLambdaHandler = EventBridgeEventHandler.createImplementation({\n implementation: BulkActionsEventBridgeLambdaHandlerImpl,\n dependencies: [RequestContainer]\n});\n"],"names":["DETAIL_TYPE","BulkActionsEventBridgeLambdaHandlerImpl","container","eventCtx","_next","TenantContext","TaskService","BulkActionsEventBridgeLambdaHandler","EventBridgeEventHandler","RequestContainer"],"mappings":";;;;AAWA,MAAMA,cAAc;AAEpB,MAAMC;IACF,YAAoBC,SAAoB,CAAE;aAAtBA,SAAS,GAATA;IAAuB;IAE3C,MAAM,QACFC,QAAqD,EACrDC,KAAmB,EACO;QAC1B,IAAID,SAAS,KAAK,CAAC,cAAc,KAAKH,aAClC,OAAO;YAAE,SAAS;YAAM,SAAS;QAA2B;QAGhE,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAACK,eAAe,cAAc,CAAC;YACvD,MAAM,IAAI,CAAC,SAAS,CACf,OAAO,CAACC,aACR,OAAO,CAAC;gBAAE,YAAY;YAA4B;QAC3D;QAEA,OAAO;YAAE,SAAS;QAAK;IAC3B;AACJ;AAEO,MAAMC,sCAAsCC,wBAAwB,oBAAoB,CAAC;IAC5F,gBAAgBP;IAChB,cAAc;QAACQ;KAAiB;AACpC"}
@@ -0,0 +1,7 @@
1
+ export interface HcmsBulkActionsFeatureConfig {
2
+ batchSize?: number;
3
+ }
4
+ export declare const HcmsBulkActionsFeature: {
5
+ name: string;
6
+ register(container: import("@webiny/di").Container, context?: HcmsBulkActionsFeatureConfig | undefined): void;
7
+ };
@@ -0,0 +1,40 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { RequestContextInitializer } from "@webiny/event-handler-core";
3
+ import { EntriesBulkAction, EntriesBulkActionConfig } from "./features/EntriesBulkAction/abstractions.js";
4
+ import { createBulkActionTasks } from "./features/EntriesBulkAction/createBulkActionTasks.js";
5
+ import { DeleteEntriesBulkActionFeature } from "./features/DeleteEntriesBulkAction/feature.js";
6
+ import { MoveToFolderBulkActionFeature } from "./features/MoveToFolderBulkAction/feature.js";
7
+ import { MoveToTrashBulkActionFeature } from "./features/MoveToTrashBulkAction/feature.js";
8
+ import { PublishEntriesBulkActionFeature } from "./features/PublishEntriesBulkAction/feature.js";
9
+ import { UnpublishEntriesBulkActionFeature } from "./features/UnpublishEntriesBulkAction/feature.js";
10
+ import { RestoreEntriesBulkActionFeature } from "./features/RestoreEntriesBulkAction/feature.js";
11
+ import { EmptyTrashBinTaskDefinition } from "./tasks/EmptyTrashBinTaskDefinition.js";
12
+ import { registerDefaultBulkActionGraphQL } from "./graphql/createDefaultGraphQL.js";
13
+ import { createBulkActionGraphQL } from "./graphql/createBulkActionGraphQL.js";
14
+ const HcmsBulkActionsFeature = createFeature({
15
+ name: "HcmsBulkActions",
16
+ register (container, config) {
17
+ container.registerInstance(EntriesBulkActionConfig, {
18
+ batchSize: config?.batchSize ?? 100
19
+ });
20
+ DeleteEntriesBulkActionFeature.register(container);
21
+ MoveToFolderBulkActionFeature.register(container);
22
+ MoveToTrashBulkActionFeature.register(container);
23
+ PublishEntriesBulkActionFeature.register(container);
24
+ UnpublishEntriesBulkActionFeature.register(container);
25
+ RestoreEntriesBulkActionFeature.register(container);
26
+ container.register(EmptyTrashBinTaskDefinition);
27
+ const bulkActionsConfig = container.resolve(EntriesBulkActionConfig);
28
+ for (const bulkAction of container.resolveAll(EntriesBulkAction))createBulkActionTasks(bulkAction, bulkActionsConfig).register(container);
29
+ container.registerInstance(RequestContextInitializer, {
30
+ async init (ctx) {
31
+ const context = ctx;
32
+ await registerDefaultBulkActionGraphQL(context);
33
+ for (const bulkAction of container.resolveAll(EntriesBulkAction))await createBulkActionGraphQL(context, bulkAction);
34
+ }
35
+ });
36
+ }
37
+ });
38
+ export { HcmsBulkActionsFeature };
39
+
40
+ //# sourceMappingURL=HcmsBulkActionsFeature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HcmsBulkActionsFeature.js","sources":["../src/HcmsBulkActionsFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { RequestContextInitializer } from \"@webiny/event-handler-core\";\nimport {\n EntriesBulkAction,\n EntriesBulkActionConfig\n} from \"~/features/EntriesBulkAction/abstractions.js\";\nimport { createBulkActionTasks } from \"~/features/EntriesBulkAction/createBulkActionTasks.js\";\nimport { DeleteEntriesBulkActionFeature } from \"~/features/DeleteEntriesBulkAction/feature.js\";\nimport { MoveToFolderBulkActionFeature } from \"~/features/MoveToFolderBulkAction/feature.js\";\nimport { MoveToTrashBulkActionFeature } from \"~/features/MoveToTrashBulkAction/feature.js\";\nimport { PublishEntriesBulkActionFeature } from \"~/features/PublishEntriesBulkAction/feature.js\";\nimport { UnpublishEntriesBulkActionFeature } from \"~/features/UnpublishEntriesBulkAction/feature.js\";\nimport { RestoreEntriesBulkActionFeature } from \"~/features/RestoreEntriesBulkAction/feature.js\";\nimport { EmptyTrashBinTaskDefinition } from \"~/tasks/EmptyTrashBinTaskDefinition.js\";\nimport { registerDefaultBulkActionGraphQL } from \"~/graphql/createDefaultGraphQL.js\";\nimport { createBulkActionGraphQL } from \"~/graphql/createBulkActionGraphQL.js\";\nimport type { HcmsBulkActionsContext } from \"~/types.js\";\n\nexport interface HcmsBulkActionsFeatureConfig {\n batchSize?: number;\n}\n\nexport const HcmsBulkActionsFeature = createFeature<HcmsBulkActionsFeatureConfig | undefined>({\n name: \"HcmsBulkActions\",\n register(container, config) {\n container.registerInstance(EntriesBulkActionConfig, {\n batchSize: config?.batchSize ?? 100\n });\n\n // Bulk-action implementations (one EntriesBulkAction each).\n DeleteEntriesBulkActionFeature.register(container);\n MoveToFolderBulkActionFeature.register(container);\n MoveToTrashBulkActionFeature.register(container);\n PublishEntriesBulkActionFeature.register(container);\n UnpublishEntriesBulkActionFeature.register(container);\n RestoreEntriesBulkActionFeature.register(container);\n\n container.register(EmptyTrashBinTaskDefinition);\n\n // Per-action task definitions (list + process). resolveAll works now that the actions are\n // registered above; the task definitions need no per-request/model data.\n const bulkActionsConfig = container.resolve(EntriesBulkActionConfig);\n for (const bulkAction of container.resolveAll(EntriesBulkAction)) {\n createBulkActionTasks(bulkAction, bulkActionsConfig).register(container);\n }\n\n // The bulk-action GraphQL is model-derived (per-tenant models are known only at request\n // time), so it's built in a RequestContextInitializer that registers CmsGraphQLSchemaFactory\n // instances — merged by the CMS schema build that runs after initializers.\n container.registerInstance(RequestContextInitializer, {\n async init(ctx: Record<string, any>) {\n const context = ctx as HcmsBulkActionsContext;\n await registerDefaultBulkActionGraphQL(context);\n for (const bulkAction of container.resolveAll(EntriesBulkAction)) {\n await createBulkActionGraphQL(context, bulkAction);\n }\n }\n });\n }\n});\n"],"names":["HcmsBulkActionsFeature","createFeature","container","config","EntriesBulkActionConfig","DeleteEntriesBulkActionFeature","MoveToFolderBulkActionFeature","MoveToTrashBulkActionFeature","PublishEntriesBulkActionFeature","UnpublishEntriesBulkActionFeature","RestoreEntriesBulkActionFeature","EmptyTrashBinTaskDefinition","bulkActionsConfig","bulkAction","EntriesBulkAction","createBulkActionTasks","RequestContextInitializer","ctx","context","registerDefaultBulkActionGraphQL","createBulkActionGraphQL"],"mappings":";;;;;;;;;;;;;AAsBO,MAAMA,yBAAyBC,cAAwD;IAC1F,MAAM;IACN,UAASC,SAAS,EAAEC,MAAM;QACtBD,UAAU,gBAAgB,CAACE,yBAAyB;YAChD,WAAWD,QAAQ,aAAa;QACpC;QAGAE,+BAA+B,QAAQ,CAACH;QACxCI,8BAA8B,QAAQ,CAACJ;QACvCK,6BAA6B,QAAQ,CAACL;QACtCM,gCAAgC,QAAQ,CAACN;QACzCO,kCAAkC,QAAQ,CAACP;QAC3CQ,gCAAgC,QAAQ,CAACR;QAEzCA,UAAU,QAAQ,CAACS;QAInB,MAAMC,oBAAoBV,UAAU,OAAO,CAACE;QAC5C,KAAK,MAAMS,cAAcX,UAAU,UAAU,CAACY,mBAC1CC,sBAAsBF,YAAYD,mBAAmB,QAAQ,CAACV;QAMlEA,UAAU,gBAAgB,CAACc,2BAA2B;YAClD,MAAM,MAAKC,GAAwB;gBAC/B,MAAMC,UAAUD;gBAChB,MAAME,iCAAiCD;gBACvC,KAAK,MAAML,cAAcX,UAAU,UAAU,CAACY,mBAC1C,MAAMM,wBAAwBF,SAASL;YAE/C;QACJ;IACJ;AACJ"}
@@ -1,7 +1,7 @@
1
1
  import { createFeature } from "@webiny/feature/api";
2
2
  import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
3
3
  import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
4
- import { BulkActionContext } from "../BulkActionContext/index.js";
4
+ import { ListTasksUseCase, TasksCrud, TriggerTaskUseCase } from "@webiny/background-tasks/api";
5
5
  import { BulkActionName } from "../../domain/BulkActionName.js";
6
6
  import { ChildTasksCleanup } from "./internals/ChildTasksCleanup.js";
7
7
  import { ProcessTask } from "./internals/ProcessTask.js";
@@ -13,7 +13,7 @@ const createBulkActionTasks = (bulkAction, bulkActionsConfig)=>{
13
13
  const listTaskId = `hcmsBulkList${bulkActionName}Entries`;
14
14
  const processTaskId = `hcmsBulkProcess${bulkActionName}Entries`;
15
15
  class BulkActionListTask {
16
- constructor(context, getModel){
16
+ constructor(getModel, listTasks, triggerTask, tasksCrud){
17
17
  this.id = listTaskId;
18
18
  this.title = `Headless CMS: list "${bulkActionName}" entries by model`;
19
19
  this.maxIterations = 500;
@@ -23,8 +23,10 @@ const createBulkActionTasks = (bulkAction, bulkActionsConfig)=>{
23
23
  "onSuccess",
24
24
  "onAbort"
25
25
  ];
26
- this.context = context;
27
26
  this.getModel = getModel;
27
+ this.listTasks = listTasks;
28
+ this.triggerTask = triggerTask;
29
+ this.tasksCrud = tasksCrud;
28
30
  }
29
31
  async run({ input, controller }) {
30
32
  try {
@@ -33,7 +35,7 @@ const createBulkActionTasks = (bulkAction, bulkActionsConfig)=>{
33
35
  switch(action){
34
36
  case "PROCESS_SUBTASKS":
35
37
  {
36
- const processTasks = new ProcessTasksByModel(this.context, processTaskId);
38
+ const processTasks = new ProcessTasksByModel(this.listTasks, processTaskId);
37
39
  return await processTasks.execute({
38
40
  input,
39
41
  controller
@@ -42,7 +44,7 @@ const createBulkActionTasks = (bulkAction, bulkActionsConfig)=>{
42
44
  case "CREATE_SUBTASKS":
43
45
  case "CHECK_MORE_SUBTASKS":
44
46
  {
45
- const createTasks = new CreateTasksByModel(this.context, this.getModel, bulkAction, processTaskId, batchSize);
47
+ const createTasks = new CreateTasksByModel(this.getModel, this.triggerTask, bulkAction, processTaskId, batchSize);
46
48
  return await createTasks.execute({
47
49
  input,
48
50
  controller
@@ -73,7 +75,7 @@ const createBulkActionTasks = (bulkAction, bulkActionsConfig)=>{
73
75
  const childTasksCleanup = new ChildTasksCleanup();
74
76
  try {
75
77
  await childTasksCleanup.execute({
76
- context: this.context,
78
+ tasksCrud: this.tasksCrud,
77
79
  task
78
80
  });
79
81
  } catch (ex) {
@@ -109,8 +111,10 @@ const createBulkActionTasks = (bulkAction, bulkActionsConfig)=>{
109
111
  const BulkListTask = TaskDefinition.createImplementation({
110
112
  implementation: BulkActionListTask,
111
113
  dependencies: [
112
- BulkActionContext,
113
- GetModelUseCase
114
+ GetModelUseCase,
115
+ ListTasksUseCase,
116
+ TriggerTaskUseCase,
117
+ TasksCrud
114
118
  ]
115
119
  });
116
120
  const BulkProcessTask = TaskDefinition.createImplementation({
@@ -1 +1 @@
1
- {"version":3,"file":"features/EntriesBulkAction/createBulkActionTasks.js","sources":["../../../src/features/EntriesBulkAction/createBulkActionTasks.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { BulkActionContext } from \"~/features/BulkActionContext/index.js\";\nimport type {\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput,\n IBulkActionOperationInput,\n IBulkActionOperationOutput\n} from \"~/types.js\";\nimport { EntriesBulkAction, EntriesBulkActionConfig } from \"./abstractions.js\";\nimport { BulkActionName } from \"~/domain/BulkActionName.js\";\nimport { ChildTasksCleanup } from \"./internals/ChildTasksCleanup.js\";\nimport { ProcessTask } from \"./internals/ProcessTask.js\";\nimport { CreateTasksByModel } from \"./internals/CreateTasksByModel.js\";\nimport { ProcessTasksByModel } from \"./internals/ProcessTasksByModel.js\";\n\nenum BulkActionOperationByModelAction {\n CREATE_SUBTASKS = \"CREATE_SUBTASKS\",\n CHECK_MORE_SUBTASKS = \"CHECK_MORE_SUBTASKS\",\n PROCESS_SUBTASKS = \"PROCESS_SUBTASKS\",\n END_TASK = \"END_TASK\"\n}\n\nexport const createBulkActionTasks = (\n bulkAction: EntriesBulkAction.Interface,\n bulkActionsConfig: EntriesBulkActionConfig.Interface\n) => {\n const bulkActionName = BulkActionName.from(bulkAction.name);\n const batchSize = bulkAction.batchSize ?? bulkActionsConfig.batchSize ?? 100;\n const listTaskId = `hcmsBulkList${bulkActionName}Entries`;\n const processTaskId = `hcmsBulkProcess${bulkActionName}Entries`;\n\n // List Task - manages pagination and creates subtasks\n class BulkActionListTask implements TaskDefinition.Interface<\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput\n > {\n public readonly id = listTaskId;\n public readonly title = `Headless CMS: list \"${bulkActionName}\" entries by model`;\n public readonly maxIterations = 500;\n public readonly databaseLogs = false;\n public readonly isPrivate = true;\n public readonly context: BulkActionContext.Interface;\n public readonly getModel: GetModelUseCase.Interface;\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n constructor(context: BulkActionContext.Interface, getModel: GetModelUseCase.Interface) {\n this.context = context;\n this.getModel = getModel;\n }\n\n async run({\n input,\n controller\n }: TaskDefinition.RunParams<\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput\n >) {\n try {\n if (!input.modelId) {\n return controller.response.error(`Missing \"modelId\" in the input.`);\n }\n\n const action = input.action ?? BulkActionOperationByModelAction.CREATE_SUBTASKS;\n\n switch (action) {\n case BulkActionOperationByModelAction.PROCESS_SUBTASKS: {\n const processTasks = new ProcessTasksByModel(this.context, processTaskId);\n return await processTasks.execute({ input, controller });\n }\n case BulkActionOperationByModelAction.CREATE_SUBTASKS:\n case BulkActionOperationByModelAction.CHECK_MORE_SUBTASKS: {\n const createTasks = new CreateTasksByModel(\n this.context,\n this.getModel,\n bulkAction,\n processTaskId,\n batchSize\n );\n return await createTasks.execute({ input, controller });\n }\n case BulkActionOperationByModelAction.END_TASK: {\n return controller.response.done(\n `Task done: task \"${processTaskId}\" has been successfully processed for entries from \"${\n input.modelId\n }\" model.`\n );\n }\n default:\n return controller.response.error(`Unknown action: ${action}`);\n }\n } catch (ex) {\n return controller.response.error(ex.message ?? \"Error while executing list task\");\n }\n }\n\n async onDone({ task }: TaskDefinition.LifecycleHookParams): Promise<void> {\n await this.cleanup(task);\n }\n\n async onError({ task }: TaskDefinition.LifecycleHookParams) {\n await this.cleanup(task);\n }\n\n async onAbort({ task }: TaskDefinition.LifecycleHookParams) {\n await this.cleanup(task);\n }\n\n async onMaxIterations({ task }: TaskDefinition.LifecycleHookParams) {\n await this.cleanup(task);\n }\n\n async cleanup(task: TaskDefinition.Task) {\n const childTasksCleanup = new ChildTasksCleanup();\n try {\n await childTasksCleanup.execute({ context: this.context, task });\n } catch (ex) {\n console.error(`Error while cleaning \"${listTaskId}\" child tasks.`, ex);\n }\n }\n }\n\n // Process Task - processes individual batches of entries\n class BulkActionProcessTask implements TaskDefinition.Interface<\n IBulkActionOperationInput,\n IBulkActionOperationOutput\n > {\n public readonly id = processTaskId;\n public readonly title = `Headless CMS: process \"${bulkActionName}\" entries`;\n public readonly maxIterations = 2;\n public readonly databaseLogs = false;\n public readonly isPrivate = true;\n public readonly getModel: GetModelUseCase.Interface;\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n constructor(getModel: GetModelUseCase.Interface) {\n this.getModel = getModel;\n }\n\n async run({\n input,\n controller\n }: TaskDefinition.RunParams<IBulkActionOperationInput, IBulkActionOperationOutput>) {\n try {\n const processTask = new ProcessTask(bulkAction, this.getModel);\n return await processTask.execute({ input, controller });\n } catch (ex) {\n return controller.response.error(\n ex.message ?? \"Error while executing process task\"\n );\n }\n }\n }\n\n const BulkListTask = TaskDefinition.createImplementation({\n implementation: BulkActionListTask,\n dependencies: [BulkActionContext, GetModelUseCase]\n });\n\n const BulkProcessTask = TaskDefinition.createImplementation({\n implementation: BulkActionProcessTask,\n dependencies: [GetModelUseCase]\n });\n\n return createFeature({\n name: `HeadlessCms/BulkActionTasks/${bulkActionName}`,\n register(container) {\n container.register(BulkListTask);\n container.register(BulkProcessTask);\n }\n });\n};\n"],"names":["createBulkActionTasks","bulkAction","bulkActionsConfig","bulkActionName","BulkActionName","batchSize","listTaskId","processTaskId","BulkActionListTask","context","getModel","input","controller","action","processTasks","ProcessTasksByModel","createTasks","CreateTasksByModel","ex","task","childTasksCleanup","ChildTasksCleanup","console","BulkActionProcessTask","processTask","ProcessTask","BulkListTask","TaskDefinition","BulkActionContext","GetModelUseCase","BulkProcessTask","createFeature","container"],"mappings":"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"}
1
+ {"version":3,"file":"features/EntriesBulkAction/createBulkActionTasks.js","sources":["../../../src/features/EntriesBulkAction/createBulkActionTasks.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { ListTasksUseCase, TriggerTaskUseCase, TasksCrud } from \"@webiny/background-tasks/api\";\nimport type {\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput,\n IBulkActionOperationInput,\n IBulkActionOperationOutput\n} from \"~/types.js\";\nimport { EntriesBulkAction, EntriesBulkActionConfig } from \"./abstractions.js\";\nimport { BulkActionName } from \"~/domain/BulkActionName.js\";\nimport { ChildTasksCleanup } from \"./internals/ChildTasksCleanup.js\";\nimport { ProcessTask } from \"./internals/ProcessTask.js\";\nimport { CreateTasksByModel } from \"./internals/CreateTasksByModel.js\";\nimport { ProcessTasksByModel } from \"./internals/ProcessTasksByModel.js\";\n\nenum BulkActionOperationByModelAction {\n CREATE_SUBTASKS = \"CREATE_SUBTASKS\",\n CHECK_MORE_SUBTASKS = \"CHECK_MORE_SUBTASKS\",\n PROCESS_SUBTASKS = \"PROCESS_SUBTASKS\",\n END_TASK = \"END_TASK\"\n}\n\nexport const createBulkActionTasks = (\n bulkAction: EntriesBulkAction.Interface,\n bulkActionsConfig: EntriesBulkActionConfig.Interface\n) => {\n const bulkActionName = BulkActionName.from(bulkAction.name);\n const batchSize = bulkAction.batchSize ?? bulkActionsConfig.batchSize ?? 100;\n const listTaskId = `hcmsBulkList${bulkActionName}Entries`;\n const processTaskId = `hcmsBulkProcess${bulkActionName}Entries`;\n\n // List Task - manages pagination and creates subtasks\n class BulkActionListTask implements TaskDefinition.Interface<\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput\n > {\n public readonly id = listTaskId;\n public readonly title = `Headless CMS: list \"${bulkActionName}\" entries by model`;\n public readonly maxIterations = 500;\n public readonly databaseLogs = false;\n public readonly isPrivate = true;\n public readonly getModel: GetModelUseCase.Interface;\n public readonly listTasks: ListTasksUseCase.Interface;\n public readonly triggerTask: TriggerTaskUseCase.Interface;\n public readonly tasksCrud: TasksCrud.Interface;\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n constructor(\n getModel: GetModelUseCase.Interface,\n listTasks: ListTasksUseCase.Interface,\n triggerTask: TriggerTaskUseCase.Interface,\n tasksCrud: TasksCrud.Interface\n ) {\n this.getModel = getModel;\n this.listTasks = listTasks;\n this.triggerTask = triggerTask;\n this.tasksCrud = tasksCrud;\n }\n\n async run({\n input,\n controller\n }: TaskDefinition.RunParams<\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput\n >) {\n try {\n if (!input.modelId) {\n return controller.response.error(`Missing \"modelId\" in the input.`);\n }\n\n const action = input.action ?? BulkActionOperationByModelAction.CREATE_SUBTASKS;\n\n switch (action) {\n case BulkActionOperationByModelAction.PROCESS_SUBTASKS: {\n const processTasks = new ProcessTasksByModel(this.listTasks, processTaskId);\n return await processTasks.execute({ input, controller });\n }\n case BulkActionOperationByModelAction.CREATE_SUBTASKS:\n case BulkActionOperationByModelAction.CHECK_MORE_SUBTASKS: {\n const createTasks = new CreateTasksByModel(\n this.getModel,\n this.triggerTask,\n bulkAction,\n processTaskId,\n batchSize\n );\n return await createTasks.execute({ input, controller });\n }\n case BulkActionOperationByModelAction.END_TASK: {\n return controller.response.done(\n `Task done: task \"${processTaskId}\" has been successfully processed for entries from \"${\n input.modelId\n }\" model.`\n );\n }\n default:\n return controller.response.error(`Unknown action: ${action}`);\n }\n } catch (ex) {\n return controller.response.error(ex.message ?? \"Error while executing list task\");\n }\n }\n\n async onDone({ task }: TaskDefinition.LifecycleHookParams): Promise<void> {\n await this.cleanup(task);\n }\n\n async onError({ task }: TaskDefinition.LifecycleHookParams) {\n await this.cleanup(task);\n }\n\n async onAbort({ task }: TaskDefinition.LifecycleHookParams) {\n await this.cleanup(task);\n }\n\n async onMaxIterations({ task }: TaskDefinition.LifecycleHookParams) {\n await this.cleanup(task);\n }\n\n async cleanup(task: TaskDefinition.Task) {\n const childTasksCleanup = new ChildTasksCleanup();\n try {\n await childTasksCleanup.execute({ tasksCrud: this.tasksCrud, task });\n } catch (ex) {\n console.error(`Error while cleaning \"${listTaskId}\" child tasks.`, ex);\n }\n }\n }\n\n // Process Task - processes individual batches of entries\n class BulkActionProcessTask implements TaskDefinition.Interface<\n IBulkActionOperationInput,\n IBulkActionOperationOutput\n > {\n public readonly id = processTaskId;\n public readonly title = `Headless CMS: process \"${bulkActionName}\" entries`;\n public readonly maxIterations = 2;\n public readonly databaseLogs = false;\n public readonly isPrivate = true;\n public readonly getModel: GetModelUseCase.Interface;\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n constructor(getModel: GetModelUseCase.Interface) {\n this.getModel = getModel;\n }\n\n async run({\n input,\n controller\n }: TaskDefinition.RunParams<IBulkActionOperationInput, IBulkActionOperationOutput>) {\n try {\n const processTask = new ProcessTask(bulkAction, this.getModel);\n return await processTask.execute({ input, controller });\n } catch (ex) {\n return controller.response.error(\n ex.message ?? \"Error while executing process task\"\n );\n }\n }\n }\n\n const BulkListTask = TaskDefinition.createImplementation({\n implementation: BulkActionListTask,\n dependencies: [GetModelUseCase, ListTasksUseCase, TriggerTaskUseCase, TasksCrud]\n });\n\n const BulkProcessTask = TaskDefinition.createImplementation({\n implementation: BulkActionProcessTask,\n dependencies: [GetModelUseCase]\n });\n\n return createFeature({\n name: `HeadlessCms/BulkActionTasks/${bulkActionName}`,\n register(container) {\n container.register(BulkListTask);\n container.register(BulkProcessTask);\n }\n });\n};\n"],"names":["createBulkActionTasks","bulkAction","bulkActionsConfig","bulkActionName","BulkActionName","batchSize","listTaskId","processTaskId","BulkActionListTask","getModel","listTasks","triggerTask","tasksCrud","input","controller","action","processTasks","ProcessTasksByModel","createTasks","CreateTasksByModel","ex","task","childTasksCleanup","ChildTasksCleanup","console","BulkActionProcessTask","processTask","ProcessTask","BulkListTask","TaskDefinition","GetModelUseCase","ListTasksUseCase","TriggerTaskUseCase","TasksCrud","BulkProcessTask","createFeature","container"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import type { ITask, Context } from "@webiny/background-tasks/api";
1
+ import type { ITask, TasksCrud } from "@webiny/background-tasks/api";
2
2
  import type { IUseCase } from "../../../abstractions/index.js";
3
3
  export interface IChildTasksCleanupExecuteParams {
4
- context: Context;
4
+ tasksCrud: TasksCrud.Interface;
5
5
  task: ITask;
6
6
  }
7
7
  /**
@@ -1,8 +1,8 @@
1
1
  import { TaskLogItemType } from "@webiny/background-tasks/api";
2
2
  class ChildTasksCleanup {
3
3
  async execute(params) {
4
- const { context, task } = params;
5
- const { items: childTasks } = await context.tasks.listTasks({
4
+ const { tasksCrud, task } = params;
5
+ const { items: childTasks } = await tasksCrud.listTasks({
6
6
  where: {
7
7
  parentId: task.id
8
8
  },
@@ -10,22 +10,22 @@ class ChildTasksCleanup {
10
10
  });
11
11
  if (0 === childTasks.length) return;
12
12
  const childTaskIdList = childTasks.map((childTask)=>childTask.id);
13
- const { items: childLogs } = await context.tasks.listLogs({
13
+ const { items: childLogs } = await tasksCrud.listLogs({
14
14
  where: {
15
15
  task_in: childTaskIdList
16
16
  },
17
17
  limit: 10000
18
18
  });
19
- if (0 === childLogs.length) await this.deleteTasks(context, childTaskIdList);
19
+ if (0 === childLogs.length) await this.deleteTasks(tasksCrud, childTaskIdList);
20
20
  const deletedChildTaskLogIdList = [];
21
21
  for (const log of childLogs)if (!log.items.some((item)=>item.type === TaskLogItemType.ERROR)) {
22
- await context.tasks.deleteLog(log.id);
22
+ await tasksCrud.deleteLog(log.id);
23
23
  if (!deletedChildTaskLogIdList.includes(log.task)) deletedChildTaskLogIdList.push(log.task);
24
24
  }
25
- await this.deleteTasks(context, deletedChildTaskLogIdList);
25
+ await this.deleteTasks(tasksCrud, deletedChildTaskLogIdList);
26
26
  }
27
- async deleteTasks(context, taskIds) {
28
- for (const taskId of taskIds)await context.tasks.deleteTask(taskId);
27
+ async deleteTasks(tasksCrud, taskIds) {
28
+ for (const taskId of taskIds)await tasksCrud.deleteTask(taskId);
29
29
  }
30
30
  }
31
31
  export { ChildTasksCleanup };
@@ -1 +1 @@
1
- {"version":3,"file":"features/EntriesBulkAction/internals/ChildTasksCleanup.js","sources":["../../../../src/features/EntriesBulkAction/internals/ChildTasksCleanup.ts"],"sourcesContent":["import type { ITask, Context } from \"@webiny/background-tasks/api\";\nimport { TaskLogItemType } from \"@webiny/background-tasks/api\";\nimport type { IUseCase } from \"~/abstractions/index.js\";\nimport type { HcmsBulkActionsContext } from \"~/types.js\";\n\nexport interface IChildTasksCleanupExecuteParams {\n context: Context;\n task: ITask;\n}\n\n/**\n * Cleanup of the child tasks.\n * This code will remove all the child tasks and their logs, which have no errors in them.\n */\nexport class ChildTasksCleanup implements IUseCase<IChildTasksCleanupExecuteParams, void> {\n public async execute(params: IChildTasksCleanupExecuteParams): Promise<void> {\n const { context, task } = params;\n\n const { items: childTasks } = await context.tasks.listTasks({\n where: {\n parentId: task.id\n },\n // Really doubtful there will be more than 10k of child tasks.\n limit: 10000\n });\n\n if (childTasks.length === 0) {\n return;\n }\n\n const childTaskIdList = childTasks.map(childTask => childTask.id);\n\n const { items: childLogs } = await context.tasks.listLogs({\n where: {\n task_in: childTaskIdList\n },\n limit: 10000\n });\n\n /**\n * No logs found. Proceed with deleting the child tasks.\n */\n if (childLogs.length === 0) {\n await this.deleteTasks(context, childTaskIdList);\n }\n\n const deletedChildTaskLogIdList: string[] = [];\n /**\n * First, we need to remove all the logs which have no errors.\n */\n for (const log of childLogs) {\n if (log.items.some(item => item.type === TaskLogItemType.ERROR)) {\n continue;\n }\n await context.tasks.deleteLog(log.id);\n if (deletedChildTaskLogIdList.includes(log.task)) {\n continue;\n }\n deletedChildTaskLogIdList.push(log.task);\n }\n /**\n * Now we can remove the tasks.\n */\n await this.deleteTasks(context, deletedChildTaskLogIdList);\n }\n\n /**\n * Helper method to delete tasks by ID.\n */\n private async deleteTasks(context: HcmsBulkActionsContext, taskIds: string[]): Promise<void> {\n for (const taskId of taskIds) {\n await context.tasks.deleteTask(taskId);\n }\n }\n}\n"],"names":["ChildTasksCleanup","params","context","task","childTasks","childTaskIdList","childTask","childLogs","deletedChildTaskLogIdList","log","item","TaskLogItemType","taskIds","taskId"],"mappings":";AAcO,MAAMA;IACT,MAAa,QAAQC,MAAuC,EAAiB;QACzE,MAAM,EAAEC,OAAO,EAAEC,IAAI,EAAE,GAAGF;QAE1B,MAAM,EAAE,OAAOG,UAAU,EAAE,GAAG,MAAMF,QAAQ,KAAK,CAAC,SAAS,CAAC;YACxD,OAAO;gBACH,UAAUC,KAAK,EAAE;YACrB;YAEA,OAAO;QACX;QAEA,IAAIC,AAAsB,MAAtBA,WAAW,MAAM,EACjB;QAGJ,MAAMC,kBAAkBD,WAAW,GAAG,CAACE,CAAAA,YAAaA,UAAU,EAAE;QAEhE,MAAM,EAAE,OAAOC,SAAS,EAAE,GAAG,MAAML,QAAQ,KAAK,CAAC,QAAQ,CAAC;YACtD,OAAO;gBACH,SAASG;YACb;YACA,OAAO;QACX;QAKA,IAAIE,AAAqB,MAArBA,UAAU,MAAM,EAChB,MAAM,IAAI,CAAC,WAAW,CAACL,SAASG;QAGpC,MAAMG,4BAAsC,EAAE;QAI9C,KAAK,MAAMC,OAAOF,UACd,KAAIE,IAAI,KAAK,CAAC,IAAI,CAACC,CAAAA,OAAQA,KAAK,IAAI,KAAKC,gBAAgB,KAAK;YAG9D,MAAMT,QAAQ,KAAK,CAAC,SAAS,CAACO,IAAI,EAAE;YACpC,KAAID,0BAA0B,QAAQ,CAACC,IAAI,IAAI,GAG/CD,0BAA0B,IAAI,CAACC,IAAI,IAAI;;QAK3C,MAAM,IAAI,CAAC,WAAW,CAACP,SAASM;IACpC;IAKA,MAAc,YAAYN,OAA+B,EAAEU,OAAiB,EAAiB;QACzF,KAAK,MAAMC,UAAUD,QACjB,MAAMV,QAAQ,KAAK,CAAC,UAAU,CAACW;IAEvC;AACJ"}
1
+ {"version":3,"file":"features/EntriesBulkAction/internals/ChildTasksCleanup.js","sources":["../../../../src/features/EntriesBulkAction/internals/ChildTasksCleanup.ts"],"sourcesContent":["import type { ITask, TasksCrud } from \"@webiny/background-tasks/api\";\nimport { TaskLogItemType } from \"@webiny/background-tasks/api\";\nimport type { IUseCase } from \"~/abstractions/index.js\";\n\nexport interface IChildTasksCleanupExecuteParams {\n tasksCrud: TasksCrud.Interface;\n task: ITask;\n}\n\n/**\n * Cleanup of the child tasks.\n * This code will remove all the child tasks and their logs, which have no errors in them.\n */\nexport class ChildTasksCleanup implements IUseCase<IChildTasksCleanupExecuteParams, void> {\n public async execute(params: IChildTasksCleanupExecuteParams): Promise<void> {\n const { tasksCrud, task } = params;\n\n const { items: childTasks } = await tasksCrud.listTasks({\n where: {\n parentId: task.id\n },\n // Really doubtful there will be more than 10k of child tasks.\n limit: 10000\n });\n\n if (childTasks.length === 0) {\n return;\n }\n\n const childTaskIdList = childTasks.map(childTask => childTask.id);\n\n const { items: childLogs } = await tasksCrud.listLogs({\n where: {\n task_in: childTaskIdList\n },\n limit: 10000\n });\n\n /**\n * No logs found. Proceed with deleting the child tasks.\n */\n if (childLogs.length === 0) {\n await this.deleteTasks(tasksCrud, childTaskIdList);\n }\n\n const deletedChildTaskLogIdList: string[] = [];\n /**\n * First, we need to remove all the logs which have no errors.\n */\n for (const log of childLogs) {\n if (log.items.some(item => item.type === TaskLogItemType.ERROR)) {\n continue;\n }\n await tasksCrud.deleteLog(log.id);\n if (deletedChildTaskLogIdList.includes(log.task)) {\n continue;\n }\n deletedChildTaskLogIdList.push(log.task);\n }\n /**\n * Now we can remove the tasks.\n */\n await this.deleteTasks(tasksCrud, deletedChildTaskLogIdList);\n }\n\n /**\n * Helper method to delete tasks by ID.\n */\n private async deleteTasks(tasksCrud: TasksCrud.Interface, taskIds: string[]): Promise<void> {\n for (const taskId of taskIds) {\n await tasksCrud.deleteTask(taskId);\n }\n }\n}\n"],"names":["ChildTasksCleanup","params","tasksCrud","task","childTasks","childTaskIdList","childTask","childLogs","deletedChildTaskLogIdList","log","item","TaskLogItemType","taskIds","taskId"],"mappings":";AAaO,MAAMA;IACT,MAAa,QAAQC,MAAuC,EAAiB;QACzE,MAAM,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAGF;QAE5B,MAAM,EAAE,OAAOG,UAAU,EAAE,GAAG,MAAMF,UAAU,SAAS,CAAC;YACpD,OAAO;gBACH,UAAUC,KAAK,EAAE;YACrB;YAEA,OAAO;QACX;QAEA,IAAIC,AAAsB,MAAtBA,WAAW,MAAM,EACjB;QAGJ,MAAMC,kBAAkBD,WAAW,GAAG,CAACE,CAAAA,YAAaA,UAAU,EAAE;QAEhE,MAAM,EAAE,OAAOC,SAAS,EAAE,GAAG,MAAML,UAAU,QAAQ,CAAC;YAClD,OAAO;gBACH,SAASG;YACb;YACA,OAAO;QACX;QAKA,IAAIE,AAAqB,MAArBA,UAAU,MAAM,EAChB,MAAM,IAAI,CAAC,WAAW,CAACL,WAAWG;QAGtC,MAAMG,4BAAsC,EAAE;QAI9C,KAAK,MAAMC,OAAOF,UACd,KAAIE,IAAI,KAAK,CAAC,IAAI,CAACC,CAAAA,OAAQA,KAAK,IAAI,KAAKC,gBAAgB,KAAK;YAG9D,MAAMT,UAAU,SAAS,CAACO,IAAI,EAAE;YAChC,KAAID,0BAA0B,QAAQ,CAACC,IAAI,IAAI,GAG/CD,0BAA0B,IAAI,CAACC,IAAI,IAAI;;QAK3C,MAAM,IAAI,CAAC,WAAW,CAACP,WAAWM;IACtC;IAKA,MAAc,YAAYN,SAA8B,EAAEU,OAAiB,EAAiB;QACxF,KAAK,MAAMC,UAAUD,QACjB,MAAMV,UAAU,UAAU,CAACW;IAEnC;AACJ"}
@@ -1,7 +1,7 @@
1
1
  import type { IBulkActionOperationByModelTaskParams } from "../../../types.js";
2
2
  import { EntriesBulkAction } from "../../../features/EntriesBulkAction/abstractions.js";
3
- import { BulkActionContext } from "../../../features/BulkActionContext/index.js";
4
- import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
3
+ import type { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
4
+ import type { TriggerTaskUseCase } from "@webiny/background-tasks/api";
5
5
  /**
6
6
  * The `CreateTasksByModel` class handles the execution of a task to process entries in batches.
7
7
  */
@@ -9,8 +9,8 @@ export declare class CreateTasksByModel {
9
9
  private readonly taskCache;
10
10
  private readonly batchSize;
11
11
  private readonly bulkAction;
12
- private readonly context;
12
+ private readonly triggerTask;
13
13
  private readonly getModel;
14
- constructor(context: BulkActionContext.Interface, getModel: GetModelUseCase.Interface, bulkAction: EntriesBulkAction.Interface, taskDefinition: string, batchSize: number);
14
+ constructor(getModel: GetModelUseCase.Interface, triggerTask: TriggerTaskUseCase.Interface, bulkAction: EntriesBulkAction.Interface, taskDefinition: string, batchSize: number);
15
15
  execute(params: IBulkActionOperationByModelTaskParams): Promise<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskResultAborted | import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskResultError | import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").TaskDefinition.ResultContinue<import("~/types.js").IBulkActionOperationByModelInput>>;
16
16
  }
@@ -2,12 +2,12 @@ import { TaskCache } from "./TaskCache.js";
2
2
  import { BulkActionOperationByModelAction } from "../../../types.js";
3
3
  const MAX_TASK_LIST_LENGTH = 10;
4
4
  class CreateTasksByModel {
5
- constructor(context, getModel, bulkAction, taskDefinition, batchSize){
5
+ constructor(getModel, triggerTask, bulkAction, taskDefinition, batchSize){
6
6
  this.getModel = getModel;
7
7
  this.taskCache = new TaskCache(taskDefinition);
8
8
  this.batchSize = batchSize;
9
9
  this.bulkAction = bulkAction;
10
- this.context = context;
10
+ this.triggerTask = triggerTask;
11
11
  }
12
12
  async execute(params) {
13
13
  const { input, controller } = params;
@@ -24,7 +24,7 @@ class CreateTasksByModel {
24
24
  while(true){
25
25
  if (controller.runtime.isAborted()) return controller.response.aborted();
26
26
  if (controller.runtime.isCloseToTimeout()) {
27
- await this.taskCache.triggerTask(this.context, controller.state.getTask());
27
+ await this.taskCache.triggerTask(this.triggerTask, controller.state.getTask());
28
28
  return controller.response.continue({
29
29
  ...input,
30
30
  action: BulkActionOperationByModelAction.PROCESS_SUBTASKS
@@ -36,14 +36,14 @@ class CreateTasksByModel {
36
36
  action: BulkActionOperationByModelAction.END_TASK
37
37
  });
38
38
  if (this.taskCache.getTasksLength() === MAX_TASK_LIST_LENGTH) {
39
- await this.taskCache.triggerTask(this.context, controller.state.getTask());
39
+ await this.taskCache.triggerTask(this.triggerTask, controller.state.getTask());
40
40
  return controller.response.continue({
41
41
  ...input,
42
42
  action: BulkActionOperationByModelAction.PROCESS_SUBTASKS
43
43
  });
44
44
  }
45
45
  if (0 === entries.length) {
46
- await this.taskCache.triggerTask(this.context, controller.state.getTask());
46
+ await this.taskCache.triggerTask(this.triggerTask, controller.state.getTask());
47
47
  return controller.response.continue({
48
48
  ...input,
49
49
  action: BulkActionOperationByModelAction.PROCESS_SUBTASKS
@@ -58,7 +58,7 @@ class CreateTasksByModel {
58
58
  ids
59
59
  });
60
60
  if (!meta.hasMoreItems || !meta.cursor) {
61
- await this.taskCache.triggerTask(this.context, controller.state.getTask());
61
+ await this.taskCache.triggerTask(this.triggerTask, controller.state.getTask());
62
62
  return controller.response.continue({
63
63
  ...input,
64
64
  action: BulkActionOperationByModelAction.PROCESS_SUBTASKS
@@ -1 +1 @@
1
- {"version":3,"file":"features/EntriesBulkAction/internals/CreateTasksByModel.js","sources":["../../../../src/features/EntriesBulkAction/internals/CreateTasksByModel.ts"],"sourcesContent":["import type { CmsEntryListParams } from \"@webiny/api-headless-cms/types/index.js\";\nimport { TaskCache } from \"./TaskCache.js\";\nimport type { IBulkActionOperationByModelTaskParams } from \"~/types.js\";\nimport { BulkActionOperationByModelAction } from \"~/types.js\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\nimport { BulkActionContext } from \"~/features/BulkActionContext/index.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\n\nconst MAX_TASK_LIST_LENGTH = 10;\n\n/**\n * The `CreateTasksByModel` class handles the execution of a task to process entries in batches.\n */\nexport class CreateTasksByModel {\n private readonly taskCache: TaskCache;\n private readonly batchSize: number;\n private readonly bulkAction: EntriesBulkAction.Interface;\n private readonly context: BulkActionContext.Interface;\n private readonly getModel: GetModelUseCase.Interface;\n\n constructor(\n context: BulkActionContext.Interface,\n getModel: GetModelUseCase.Interface,\n bulkAction: EntriesBulkAction.Interface,\n taskDefinition: string,\n batchSize: number\n ) {\n this.getModel = getModel;\n this.taskCache = new TaskCache(taskDefinition);\n this.batchSize = batchSize;\n this.bulkAction = bulkAction;\n this.context = context;\n }\n\n async execute(params: IBulkActionOperationByModelTaskParams) {\n const { input, controller } = params;\n\n try {\n const modelResult = await this.getModel.execute(input.modelId);\n\n if (modelResult.isFail()) {\n return controller.response.error(`Model with ${input.modelId} not found!`);\n }\n\n const model = modelResult.value;\n\n const listEntriesParams: CmsEntryListParams = {\n where: input.where,\n search: input.search,\n after: input.after,\n limit: this.batchSize\n };\n\n while (true) {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n } else if (controller.runtime.isCloseToTimeout()) {\n await this.taskCache.triggerTask(this.context, controller.state.getTask());\n return controller.response.continue({\n ...input,\n action: BulkActionOperationByModelAction.PROCESS_SUBTASKS\n });\n }\n\n // List entries from the HCMS based on the provided query\n const { entries, meta } = await this.bulkAction.loadData(model, listEntriesParams);\n\n // End the task if no entries match the query\n if (meta.totalCount === 0) {\n return controller.response.continue({\n ...input,\n action: BulkActionOperationByModelAction.END_TASK\n });\n }\n\n // Continue processing if we are reached the task list length limit\n if (this.taskCache.getTasksLength() === MAX_TASK_LIST_LENGTH) {\n await this.taskCache.triggerTask(this.context, controller.state.getTask());\n return controller.response.continue({\n ...input,\n action: BulkActionOperationByModelAction.PROCESS_SUBTASKS\n });\n }\n\n // Continue processing if no entries are returned in the current batch\n if (entries.length === 0) {\n await this.taskCache.triggerTask(this.context, controller.state.getTask());\n return controller.response.continue({\n ...input,\n action: BulkActionOperationByModelAction.PROCESS_SUBTASKS\n });\n }\n\n // Extract entry IDs\n const ids: string[] = [];\n for (let i = 0; i < entries.length; i++) {\n ids.push(entries[i].id);\n }\n\n if (ids.length > 0) {\n // Cache the task with the entry IDs\n this.taskCache.cacheTask({\n modelId: input.modelId,\n identity: input.identity,\n data: input.data,\n ids\n });\n }\n\n // Continue processing if there are no more entries or pagination is complete\n if (!meta.hasMoreItems || !meta.cursor) {\n await this.taskCache.triggerTask(this.context, controller.state.getTask());\n\n return controller.response.continue({\n ...input,\n action: BulkActionOperationByModelAction.PROCESS_SUBTASKS\n });\n }\n\n listEntriesParams.after = meta.cursor;\n }\n } catch (ex) {\n return controller.response.error(ex.message ?? `Error while creating task.`);\n }\n }\n}\n"],"names":["MAX_TASK_LIST_LENGTH","CreateTasksByModel","context","getModel","bulkAction","taskDefinition","batchSize","TaskCache","params","input","controller","modelResult","model","listEntriesParams","BulkActionOperationByModelAction","entries","meta","ids","i","ex"],"mappings":"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"}
1
+ {"version":3,"file":"features/EntriesBulkAction/internals/CreateTasksByModel.js","sources":["../../../../src/features/EntriesBulkAction/internals/CreateTasksByModel.ts"],"sourcesContent":["import type { CmsEntryListParams } from \"@webiny/api-headless-cms/types/index.js\";\nimport { TaskCache } from \"./TaskCache.js\";\nimport type { IBulkActionOperationByModelTaskParams } from \"~/types.js\";\nimport { BulkActionOperationByModelAction } from \"~/types.js\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\nimport type { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport type { TriggerTaskUseCase } from \"@webiny/background-tasks/api\";\n\nconst MAX_TASK_LIST_LENGTH = 10;\n\n/**\n * The `CreateTasksByModel` class handles the execution of a task to process entries in batches.\n */\nexport class CreateTasksByModel {\n private readonly taskCache: TaskCache;\n private readonly batchSize: number;\n private readonly bulkAction: EntriesBulkAction.Interface;\n private readonly triggerTask: TriggerTaskUseCase.Interface;\n private readonly getModel: GetModelUseCase.Interface;\n\n constructor(\n getModel: GetModelUseCase.Interface,\n triggerTask: TriggerTaskUseCase.Interface,\n bulkAction: EntriesBulkAction.Interface,\n taskDefinition: string,\n batchSize: number\n ) {\n this.getModel = getModel;\n this.taskCache = new TaskCache(taskDefinition);\n this.batchSize = batchSize;\n this.bulkAction = bulkAction;\n this.triggerTask = triggerTask;\n }\n\n async execute(params: IBulkActionOperationByModelTaskParams) {\n const { input, controller } = params;\n\n try {\n const modelResult = await this.getModel.execute(input.modelId);\n\n if (modelResult.isFail()) {\n return controller.response.error(`Model with ${input.modelId} not found!`);\n }\n\n const model = modelResult.value;\n\n const listEntriesParams: CmsEntryListParams = {\n where: input.where,\n search: input.search,\n after: input.after,\n limit: this.batchSize\n };\n\n while (true) {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n } else if (controller.runtime.isCloseToTimeout()) {\n await this.taskCache.triggerTask(this.triggerTask, controller.state.getTask());\n return controller.response.continue({\n ...input,\n action: BulkActionOperationByModelAction.PROCESS_SUBTASKS\n });\n }\n\n // List entries from the HCMS based on the provided query\n const { entries, meta } = await this.bulkAction.loadData(model, listEntriesParams);\n\n // End the task if no entries match the query\n if (meta.totalCount === 0) {\n return controller.response.continue({\n ...input,\n action: BulkActionOperationByModelAction.END_TASK\n });\n }\n\n // Continue processing if we are reached the task list length limit\n if (this.taskCache.getTasksLength() === MAX_TASK_LIST_LENGTH) {\n await this.taskCache.triggerTask(this.triggerTask, controller.state.getTask());\n return controller.response.continue({\n ...input,\n action: BulkActionOperationByModelAction.PROCESS_SUBTASKS\n });\n }\n\n // Continue processing if no entries are returned in the current batch\n if (entries.length === 0) {\n await this.taskCache.triggerTask(this.triggerTask, controller.state.getTask());\n return controller.response.continue({\n ...input,\n action: BulkActionOperationByModelAction.PROCESS_SUBTASKS\n });\n }\n\n // Extract entry IDs\n const ids: string[] = [];\n for (let i = 0; i < entries.length; i++) {\n ids.push(entries[i].id);\n }\n\n if (ids.length > 0) {\n // Cache the task with the entry IDs\n this.taskCache.cacheTask({\n modelId: input.modelId,\n identity: input.identity,\n data: input.data,\n ids\n });\n }\n\n // Continue processing if there are no more entries or pagination is complete\n if (!meta.hasMoreItems || !meta.cursor) {\n await this.taskCache.triggerTask(this.triggerTask, controller.state.getTask());\n\n return controller.response.continue({\n ...input,\n action: BulkActionOperationByModelAction.PROCESS_SUBTASKS\n });\n }\n\n listEntriesParams.after = meta.cursor;\n }\n } catch (ex) {\n return controller.response.error(ex.message ?? `Error while creating task.`);\n }\n }\n}\n"],"names":["MAX_TASK_LIST_LENGTH","CreateTasksByModel","getModel","triggerTask","bulkAction","taskDefinition","batchSize","TaskCache","params","input","controller","modelResult","model","listEntriesParams","BulkActionOperationByModelAction","entries","meta","ids","i","ex"],"mappings":"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"}
@@ -12,5 +12,5 @@ export declare class ProcessTask {
12
12
  private getModel;
13
13
  private readonly result;
14
14
  constructor(bulkAction: EntriesBulkAction.Interface, getModel: GetModelUseCase.Interface);
15
- execute({ input, controller }: IBulkActionOperationTaskParams): Promise<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskResultAborted | import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").TaskDefinition.ResultContinue<import("~/types.js").IBulkActionOperationInput> | import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskResultError | import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").TaskDefinition.ResultDone<import("~/types.js").IBulkActionOperationOutput>>;
15
+ execute({ input, controller }: IBulkActionOperationTaskParams): Promise<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskResultAborted | import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskResultError | import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").TaskDefinition.ResultContinue<import("~/types.js").IBulkActionOperationInput> | import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").TaskDefinition.ResultDone<import("~/types.js").IBulkActionOperationOutput>>;
16
16
  }
@@ -1,13 +1,13 @@
1
+ import type { ListTasksUseCase } from "@webiny/background-tasks/api";
1
2
  import type { IBulkActionOperationByModelTaskParams } from "../../../types.js";
2
- import { BulkActionContext } from "../../../features/BulkActionContext/index.js";
3
3
  /**
4
4
  * The `ProcessTasksByModel` class is responsible for processing tasks for a specific model.
5
5
  * It checks for any running or pending tasks from the parent task and continues or completes
6
6
  * the task based on the status.
7
7
  */
8
8
  export declare class ProcessTasksByModel {
9
- private context;
9
+ private readonly listTasks;
10
10
  private readonly taskDefinition;
11
- constructor(context: BulkActionContext.Interface, taskDefinition: string);
11
+ constructor(listTasks: ListTasksUseCase.Interface, taskDefinition: string);
12
12
  execute({ input, controller }: IBulkActionOperationByModelTaskParams): Promise<import("@webiny/api-core/features/task/TaskDefinition").ITaskResultAborted | import("@webiny/api-core/features/task/TaskDefinition").ITaskResultError | import("@webiny/api-core/features/task/TaskDefinition").TaskDefinition.ResultContinue<import("~/types.js").IBulkActionOperationByModelInput>>;
13
13
  }
@@ -1,8 +1,8 @@
1
1
  import { TaskDataStatus } from "@webiny/background-tasks/api";
2
2
  import { BulkActionOperationByModelAction } from "../../../types.js";
3
3
  class ProcessTasksByModel {
4
- constructor(context, taskDefinition){
5
- this.context = context;
4
+ constructor(listTasks, taskDefinition){
5
+ this.listTasks = listTasks;
6
6
  this.taskDefinition = taskDefinition;
7
7
  }
8
8
  async execute({ input, controller }) {
@@ -12,7 +12,7 @@ class ProcessTasksByModel {
12
12
  ...input,
13
13
  action: BulkActionOperationByModelAction.PROCESS_SUBTASKS
14
14
  });
15
- const { items } = await this.context.tasks.listTasks({
15
+ const { items } = await this.listTasks.execute({
16
16
  where: {
17
17
  parentId: controller.state.getTask().id,
18
18
  definitionId: this.taskDefinition,
@@ -1 +1 @@
1
- {"version":3,"file":"features/EntriesBulkAction/internals/ProcessTasksByModel.js","sources":["../../../../src/features/EntriesBulkAction/internals/ProcessTasksByModel.ts"],"sourcesContent":["import { TaskDataStatus } from \"@webiny/background-tasks/api\";\nimport type { IBulkActionOperationByModelTaskParams } from \"~/types.js\";\nimport { BulkActionOperationByModelAction } from \"~/types.js\";\nimport { BulkActionContext } from \"~/features/BulkActionContext/index.js\";\n\n/**\n * The `ProcessTasksByModel` class is responsible for processing tasks for a specific model.\n * It checks for any running or pending tasks from the parent task and continues or completes\n * the task based on the status.\n */\nexport class ProcessTasksByModel {\n private context: BulkActionContext.Interface;\n private readonly taskDefinition: string;\n\n constructor(context: BulkActionContext.Interface, taskDefinition: string) {\n this.context = context;\n this.taskDefinition = taskDefinition;\n }\n\n async execute({ input, controller }: IBulkActionOperationByModelTaskParams) {\n try {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n } else if (controller.runtime.isCloseToTimeout()) {\n return controller.response.continue({\n ...input,\n action: BulkActionOperationByModelAction.PROCESS_SUBTASKS\n });\n }\n\n const { items } = await this.context.tasks.listTasks({\n where: {\n parentId: controller.state.getTask().id,\n definitionId: this.taskDefinition,\n taskStatus_in: [TaskDataStatus.RUNNING, TaskDataStatus.PENDING]\n },\n limit: 1\n });\n\n // If there are running or pending tasks, continue with a wait.\n if (items.length > 0) {\n return controller.response.continue(\n {\n ...input,\n action: BulkActionOperationByModelAction.PROCESS_SUBTASKS\n },\n {\n seconds: 120\n }\n );\n }\n\n return controller.response.continue({\n ...input,\n action: BulkActionOperationByModelAction.CHECK_MORE_SUBTASKS\n });\n } catch (ex) {\n return controller.response.error(\n ex.message ?? `Error while processing task \"${this.taskDefinition}\"`\n );\n }\n }\n}\n"],"names":["ProcessTasksByModel","context","taskDefinition","input","controller","BulkActionOperationByModelAction","items","TaskDataStatus","ex"],"mappings":";;AAUO,MAAMA;IAIT,YAAYC,OAAoC,EAAEC,cAAsB,CAAE;QACtE,IAAI,CAAC,OAAO,GAAGD;QACf,IAAI,CAAC,cAAc,GAAGC;IAC1B;IAEA,MAAM,QAAQ,EAAEC,KAAK,EAAEC,UAAU,EAAyC,EAAE;QACxE,IAAI;YACA,IAAIA,WAAW,OAAO,CAAC,SAAS,IAC5B,OAAOA,WAAW,QAAQ,CAAC,OAAO;YAC/B,IAAIA,WAAW,OAAO,CAAC,gBAAgB,IAC1C,OAAOA,WAAW,QAAQ,CAAC,QAAQ,CAAC;gBAChC,GAAGD,KAAK;gBACR,QAAQE,iCAAiC,gBAAgB;YAC7D;YAGJ,MAAM,EAAEC,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;gBACjD,OAAO;oBACH,UAAUF,WAAW,KAAK,CAAC,OAAO,GAAG,EAAE;oBACvC,cAAc,IAAI,CAAC,cAAc;oBACjC,eAAe;wBAACG,eAAe,OAAO;wBAAEA,eAAe,OAAO;qBAAC;gBACnE;gBACA,OAAO;YACX;YAGA,IAAID,MAAM,MAAM,GAAG,GACf,OAAOF,WAAW,QAAQ,CAAC,QAAQ,CAC/B;gBACI,GAAGD,KAAK;gBACR,QAAQE,iCAAiC,gBAAgB;YAC7D,GACA;gBACI,SAAS;YACb;YAIR,OAAOD,WAAW,QAAQ,CAAC,QAAQ,CAAC;gBAChC,GAAGD,KAAK;gBACR,QAAQE,iCAAiC,mBAAmB;YAChE;QACJ,EAAE,OAAOG,IAAI;YACT,OAAOJ,WAAW,QAAQ,CAAC,KAAK,CAC5BI,GAAG,OAAO,IAAI,CAAC,6BAA6B,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QAE5E;IACJ;AACJ"}
1
+ {"version":3,"file":"features/EntriesBulkAction/internals/ProcessTasksByModel.js","sources":["../../../../src/features/EntriesBulkAction/internals/ProcessTasksByModel.ts"],"sourcesContent":["import { TaskDataStatus } from \"@webiny/background-tasks/api\";\nimport type { ListTasksUseCase } from \"@webiny/background-tasks/api\";\nimport type { IBulkActionOperationByModelTaskParams } from \"~/types.js\";\nimport { BulkActionOperationByModelAction } from \"~/types.js\";\n\n/**\n * The `ProcessTasksByModel` class is responsible for processing tasks for a specific model.\n * It checks for any running or pending tasks from the parent task and continues or completes\n * the task based on the status.\n */\nexport class ProcessTasksByModel {\n private readonly listTasks: ListTasksUseCase.Interface;\n private readonly taskDefinition: string;\n\n constructor(listTasks: ListTasksUseCase.Interface, taskDefinition: string) {\n this.listTasks = listTasks;\n this.taskDefinition = taskDefinition;\n }\n\n async execute({ input, controller }: IBulkActionOperationByModelTaskParams) {\n try {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n } else if (controller.runtime.isCloseToTimeout()) {\n return controller.response.continue({\n ...input,\n action: BulkActionOperationByModelAction.PROCESS_SUBTASKS\n });\n }\n\n const { items } = await this.listTasks.execute({\n where: {\n parentId: controller.state.getTask().id,\n definitionId: this.taskDefinition,\n taskStatus_in: [TaskDataStatus.RUNNING, TaskDataStatus.PENDING]\n },\n limit: 1\n });\n\n // If there are running or pending tasks, continue with a wait.\n if (items.length > 0) {\n return controller.response.continue(\n {\n ...input,\n action: BulkActionOperationByModelAction.PROCESS_SUBTASKS\n },\n {\n seconds: 120\n }\n );\n }\n\n return controller.response.continue({\n ...input,\n action: BulkActionOperationByModelAction.CHECK_MORE_SUBTASKS\n });\n } catch (ex) {\n return controller.response.error(\n ex.message ?? `Error while processing task \"${this.taskDefinition}\"`\n );\n }\n }\n}\n"],"names":["ProcessTasksByModel","listTasks","taskDefinition","input","controller","BulkActionOperationByModelAction","items","TaskDataStatus","ex"],"mappings":";;AAUO,MAAMA;IAIT,YAAYC,SAAqC,EAAEC,cAAsB,CAAE;QACvE,IAAI,CAAC,SAAS,GAAGD;QACjB,IAAI,CAAC,cAAc,GAAGC;IAC1B;IAEA,MAAM,QAAQ,EAAEC,KAAK,EAAEC,UAAU,EAAyC,EAAE;QACxE,IAAI;YACA,IAAIA,WAAW,OAAO,CAAC,SAAS,IAC5B,OAAOA,WAAW,QAAQ,CAAC,OAAO;YAC/B,IAAIA,WAAW,OAAO,CAAC,gBAAgB,IAC1C,OAAOA,WAAW,QAAQ,CAAC,QAAQ,CAAC;gBAChC,GAAGD,KAAK;gBACR,QAAQE,iCAAiC,gBAAgB;YAC7D;YAGJ,MAAM,EAAEC,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC3C,OAAO;oBACH,UAAUF,WAAW,KAAK,CAAC,OAAO,GAAG,EAAE;oBACvC,cAAc,IAAI,CAAC,cAAc;oBACjC,eAAe;wBAACG,eAAe,OAAO;wBAAEA,eAAe,OAAO;qBAAC;gBACnE;gBACA,OAAO;YACX;YAGA,IAAID,MAAM,MAAM,GAAG,GACf,OAAOF,WAAW,QAAQ,CAAC,QAAQ,CAC/B;gBACI,GAAGD,KAAK;gBACR,QAAQE,iCAAiC,gBAAgB;YAC7D,GACA;gBACI,SAAS;YACb;YAIR,OAAOD,WAAW,QAAQ,CAAC,QAAQ,CAAC;gBAChC,GAAGD,KAAK;gBACR,QAAQE,iCAAiC,mBAAmB;YAChE;QACJ,EAAE,OAAOG,IAAI;YACT,OAAOJ,WAAW,QAAQ,CAAC,KAAK,CAC5BI,GAAG,OAAO,IAAI,CAAC,6BAA6B,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QAE5E;IACJ;AACJ"}
@@ -1,5 +1,5 @@
1
1
  import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
2
- import type { HcmsBulkActionsContext } from "../../../types.js";
2
+ import type { TriggerTaskUseCase } from "@webiny/background-tasks/api";
3
3
  /**
4
4
  * TaskCache class for managing and triggering cached tasks.
5
5
  * @template TTask - Task input data.
@@ -14,11 +14,11 @@ export declare class TaskCache<TTask extends TaskDefinition.TaskInput = TaskDefi
14
14
  */
15
15
  cacheTask(item: TTask): void;
16
16
  /**
17
- * Triggers all cached tasks using the provided context and parent task.
18
- * @param {HcmsBulkActionsContext} context - The context used to trigger the tasks.
17
+ * Triggers all cached tasks using the provided TriggerTaskUseCase and parent task.
18
+ * @param {TriggerTaskUseCase.Interface} triggerTask - The use case used to trigger the tasks.
19
19
  * @param {ITask} parent - The parent task to associate with the triggered tasks.
20
20
  */
21
- triggerTask(context: HcmsBulkActionsContext, parent: TaskDefinition.Task): Promise<void>;
21
+ triggerTask(triggerTask: TriggerTaskUseCase.Interface, parent: TaskDefinition.Task): Promise<void>;
22
22
  /**
23
23
  * Retrieves the cached tasks length.
24
24
  * @returns number
@@ -6,11 +6,11 @@ class TaskCache {
6
6
  cacheTask(item) {
7
7
  this.taskCache.push(item);
8
8
  }
9
- async triggerTask(context, parent) {
9
+ async triggerTask(triggerTask, parent) {
10
10
  const tasks = this.getTasks();
11
11
  if (0 === tasks.length) return;
12
12
  for (const task of tasks)try {
13
- await context.tasks.trigger({
13
+ await triggerTask.execute({
14
14
  definition: this.taskDefinition,
15
15
  parent,
16
16
  input: task
@@ -1 +1 @@
1
- {"version":3,"file":"features/EntriesBulkAction/internals/TaskCache.js","sources":["../../../../src/features/EntriesBulkAction/internals/TaskCache.ts"],"sourcesContent":["import { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport type { HcmsBulkActionsContext } from \"~/types.js\";\n\n/**\n * TaskCache class for managing and triggering cached tasks.\n * @template TTask - Task input data.\n */\nexport class TaskCache<TTask extends TaskDefinition.TaskInput = TaskDefinition.TaskInput> {\n private readonly taskDefinition: string;\n private taskCache: TTask[] = [];\n\n constructor(taskDefinition: string) {\n this.taskDefinition = taskDefinition;\n }\n\n /**\n * Adds a task to the cache.\n * @param {TTask} item - The task input data to be cached.\n */\n cacheTask(item: TTask) {\n this.taskCache.push(item);\n }\n\n /**\n * Triggers all cached tasks using the provided context and parent task.\n * @param {HcmsBulkActionsContext} context - The context used to trigger the tasks.\n * @param {ITask} parent - The parent task to associate with the triggered tasks.\n */\n async triggerTask(context: HcmsBulkActionsContext, parent: TaskDefinition.Task) {\n const tasks = this.getTasks();\n\n if (tasks.length === 0) {\n return;\n }\n\n for (const task of tasks) {\n try {\n await context.tasks.trigger<TTask>({\n definition: this.taskDefinition,\n parent,\n input: task\n });\n } catch (error) {\n console.error(`Error triggering task.`, error);\n }\n }\n\n // Clear the cache after processing\n this.clearTasks();\n }\n\n /**\n * Retrieves the cached tasks length.\n * @returns number\n */\n getTasksLength() {\n return this.getTasks().length;\n }\n\n /**\n * Retrieves the cached tasks.\n * @returns {TTask[]} The list of cached tasks.\n */\n private getTasks() {\n return this.taskCache;\n }\n\n /**\n * Clears all cached tasks.\n */\n private clearTasks() {\n this.taskCache = [];\n }\n}\n"],"names":["TaskCache","taskDefinition","item","context","parent","tasks","task","error","console"],"mappings":"AAOO,MAAMA;IAIT,YAAYC,cAAsB,CAAE;aAF5B,SAAS,GAAY,EAAE;QAG3B,IAAI,CAAC,cAAc,GAAGA;IAC1B;IAMA,UAAUC,IAAW,EAAE;QACnB,IAAI,CAAC,SAAS,CAAC,IAAI,CAACA;IACxB;IAOA,MAAM,YAAYC,OAA+B,EAAEC,MAA2B,EAAE;QAC5E,MAAMC,QAAQ,IAAI,CAAC,QAAQ;QAE3B,IAAIA,AAAiB,MAAjBA,MAAM,MAAM,EACZ;QAGJ,KAAK,MAAMC,QAAQD,MACf,IAAI;YACA,MAAMF,QAAQ,KAAK,CAAC,OAAO,CAAQ;gBAC/B,YAAY,IAAI,CAAC,cAAc;gBAC/BC;gBACA,OAAOE;YACX;QACJ,EAAE,OAAOC,OAAO;YACZC,QAAQ,KAAK,CAAC,0BAA0BD;QAC5C;QAIJ,IAAI,CAAC,UAAU;IACnB;IAMA,iBAAiB;QACb,OAAO,IAAI,CAAC,QAAQ,GAAG,MAAM;IACjC;IAMQ,WAAW;QACf,OAAO,IAAI,CAAC,SAAS;IACzB;IAKQ,aAAa;QACjB,IAAI,CAAC,SAAS,GAAG,EAAE;IACvB;AACJ"}
1
+ {"version":3,"file":"features/EntriesBulkAction/internals/TaskCache.js","sources":["../../../../src/features/EntriesBulkAction/internals/TaskCache.ts"],"sourcesContent":["import { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport type { TriggerTaskUseCase } from \"@webiny/background-tasks/api\";\n\n/**\n * TaskCache class for managing and triggering cached tasks.\n * @template TTask - Task input data.\n */\nexport class TaskCache<TTask extends TaskDefinition.TaskInput = TaskDefinition.TaskInput> {\n private readonly taskDefinition: string;\n private taskCache: TTask[] = [];\n\n constructor(taskDefinition: string) {\n this.taskDefinition = taskDefinition;\n }\n\n /**\n * Adds a task to the cache.\n * @param {TTask} item - The task input data to be cached.\n */\n cacheTask(item: TTask) {\n this.taskCache.push(item);\n }\n\n /**\n * Triggers all cached tasks using the provided TriggerTaskUseCase and parent task.\n * @param {TriggerTaskUseCase.Interface} triggerTask - The use case used to trigger the tasks.\n * @param {ITask} parent - The parent task to associate with the triggered tasks.\n */\n async triggerTask(triggerTask: TriggerTaskUseCase.Interface, parent: TaskDefinition.Task) {\n const tasks = this.getTasks();\n\n if (tasks.length === 0) {\n return;\n }\n\n for (const task of tasks) {\n try {\n await triggerTask.execute<TTask>({\n definition: this.taskDefinition,\n parent,\n input: task\n });\n } catch (error) {\n console.error(`Error triggering task.`, error);\n }\n }\n\n // Clear the cache after processing\n this.clearTasks();\n }\n\n /**\n * Retrieves the cached tasks length.\n * @returns number\n */\n getTasksLength() {\n return this.getTasks().length;\n }\n\n /**\n * Retrieves the cached tasks.\n * @returns {TTask[]} The list of cached tasks.\n */\n private getTasks() {\n return this.taskCache;\n }\n\n /**\n * Clears all cached tasks.\n */\n private clearTasks() {\n this.taskCache = [];\n }\n}\n"],"names":["TaskCache","taskDefinition","item","triggerTask","parent","tasks","task","error","console"],"mappings":"AAOO,MAAMA;IAIT,YAAYC,cAAsB,CAAE;aAF5B,SAAS,GAAY,EAAE;QAG3B,IAAI,CAAC,cAAc,GAAGA;IAC1B;IAMA,UAAUC,IAAW,EAAE;QACnB,IAAI,CAAC,SAAS,CAAC,IAAI,CAACA;IACxB;IAOA,MAAM,YAAYC,WAAyC,EAAEC,MAA2B,EAAE;QACtF,MAAMC,QAAQ,IAAI,CAAC,QAAQ;QAE3B,IAAIA,AAAiB,MAAjBA,MAAM,MAAM,EACZ;QAGJ,KAAK,MAAMC,QAAQD,MACf,IAAI;YACA,MAAMF,YAAY,OAAO,CAAQ;gBAC7B,YAAY,IAAI,CAAC,cAAc;gBAC/BC;gBACA,OAAOE;YACX;QACJ,EAAE,OAAOC,OAAO;YACZC,QAAQ,KAAK,CAAC,0BAA0BD;QAC5C;QAIJ,IAAI,CAAC,UAAU;IACnB;IAMA,iBAAiB;QACb,OAAO,IAAI,CAAC,QAAQ,GAAG,MAAM;IACjC;IAMQ,WAAW;QACf,OAAO,IAAI,CAAC,SAAS;IACzB;IAKQ,aAAa;QACjB,IAAI,CAAC,SAAS,GAAG,EAAE;IACvB;AACJ"}
@@ -1,19 +1,22 @@
1
- import { CmsGraphQLSchemaPlugin, isHeadlessCmsReady } from "@webiny/api-headless-cms";
2
- import { Response } from "@webiny/handler-graphql";
1
+ import { CmsGraphQLSchemaFactory, CmsGraphQLSchemaPlugin, isHeadlessCmsReady } from "@webiny/api-headless-cms";
2
+ import { ListModelsUseCase } from "@webiny/api-headless-cms/features/contentModel/ListModels/index.js";
3
+ import { Response } from "@webiny/api-graphql";
3
4
  import { CMS_MODEL_SINGLETON_TAG } from "@webiny/api-headless-cms/constants.js";
4
5
  import { BulkActionName } from "../domain/BulkActionName.js";
6
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
7
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/abstractions.js";
8
+ import { TriggerTaskUseCase } from "@webiny/background-tasks/api";
5
9
  const createBulkActionGraphQL = async (context, bulkAction)=>{
6
- const tenant = context.tenancy.getCurrentTenant();
10
+ const tenant = context.container.resolve(TenantContext).getTenant();
7
11
  if (!await isHeadlessCmsReady(context)) return;
8
- const models = await context.security.withoutAuthorization(async ()=>{
9
- const allModels = await context.cms.listModels();
10
- return allModels.filter((model)=>{
11
- if (model.isPrivate) return false;
12
- const tags = Array.isArray(model.tags) ? model.tags : [];
13
- if (tags.includes(CMS_MODEL_SINGLETON_TAG)) return false;
14
- if (bulkAction.modelIds?.length) return bulkAction.modelIds.includes(model.modelId);
15
- return true;
16
- });
12
+ const modelsResult = await context.container.resolve(IdentityContext).withoutAuthorization(async ()=>context.container.resolve(ListModelsUseCase).execute());
13
+ if (modelsResult.isFail()) return;
14
+ const models = modelsResult.value.filter((model)=>{
15
+ if (model.isPrivate) return false;
16
+ const tags = Array.isArray(model.tags) ? model.tags : [];
17
+ if (tags.includes(CMS_MODEL_SINGLETON_TAG)) return false;
18
+ if (bulkAction.modelIds?.length) return bulkAction.modelIds.includes(model.modelId);
19
+ return true;
17
20
  });
18
21
  const plugins = [];
19
22
  models.forEach((model)=>{
@@ -26,8 +29,8 @@ const createBulkActionGraphQL = async (context, bulkAction)=>{
26
29
  resolvers: {
27
30
  Mutation: {
28
31
  [`bulkAction${model.singularApiName}`]: async (_, args, context)=>{
29
- const identity = context.security.getIdentity();
30
- const response = await context.tasks.trigger({
32
+ const identity = context.container.resolve(IdentityContext).getIdentity();
33
+ const response = await context.container.resolve(TriggerTaskUseCase).execute({
31
34
  definition: `hcmsBulkList${args.action}Entries`,
32
35
  input: {
33
36
  modelId: model.modelId,
@@ -43,14 +46,14 @@ const createBulkActionGraphQL = async (context, bulkAction)=>{
43
46
  }
44
47
  }
45
48
  },
46
- isApplicable: (context)=>context.tenancy.getCurrentTenant().id === tenant.id
49
+ isApplicable: (context)=>context.container.resolve(TenantContext).getTenant().id === tenant.id
47
50
  });
48
51
  plugin.name = `headless-cms.graphql.schema.bulkAction.${model.modelId}.${bulkAction.name}`;
49
52
  plugins.push(plugin);
50
53
  });
51
- context.plugins.register([
52
- ...plugins
53
- ]);
54
+ context.container.registerInstance(CmsGraphQLSchemaFactory, {
55
+ execute: ()=>plugins
56
+ });
54
57
  };
55
58
  export { createBulkActionGraphQL };
56
59
 
@@ -1 +1 @@
1
- {"version":3,"file":"graphql/createBulkActionGraphQL.js","sources":["../../src/graphql/createBulkActionGraphQL.ts"],"sourcesContent":["import type { HcmsBulkActionsContext } from \"~/types.js\";\nimport { CmsGraphQLSchemaPlugin, isHeadlessCmsReady } from \"@webiny/api-headless-cms\";\nimport { Response } from \"@webiny/handler-graphql\";\nimport { CMS_MODEL_SINGLETON_TAG } from \"@webiny/api-headless-cms/constants.js\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\nimport { BulkActionName } from \"~/domain/BulkActionName.js\";\n\nexport const createBulkActionGraphQL = async (\n context: HcmsBulkActionsContext,\n bulkAction: EntriesBulkAction.Interface\n) => {\n const tenant = context.tenancy.getCurrentTenant();\n\n // TODO: once we have GraphSchema plugin via an abstraction, we'll be able to remove this.\n if (!(await isHeadlessCmsReady(context))) {\n return;\n }\n\n const models = await context.security.withoutAuthorization(async () => {\n const allModels = await context.cms.listModels();\n return allModels.filter(model => {\n if (model.isPrivate) {\n return false;\n }\n const tags = Array.isArray(model.tags) ? model.tags : [];\n if (tags.includes(CMS_MODEL_SINGLETON_TAG)) {\n return false;\n }\n if (bulkAction.modelIds?.length) {\n return bulkAction.modelIds.includes(model.modelId);\n }\n return true;\n });\n });\n\n const plugins: CmsGraphQLSchemaPlugin<HcmsBulkActionsContext>[] = [];\n\n models.forEach(model => {\n const plugin = new CmsGraphQLSchemaPlugin<HcmsBulkActionsContext>({\n typeDefs: /* GraphQL */ `\n extend enum BulkAction${model.singularApiName}Name {\n ${BulkActionName.from(bulkAction.name)}\n }\n `,\n resolvers: {\n Mutation: {\n [`bulkAction${model.singularApiName}`]: async (_, args, context) => {\n const identity = context.security.getIdentity();\n\n const response = await context.tasks.trigger({\n definition: `hcmsBulkList${args.action}Entries`,\n input: {\n modelId: model.modelId,\n where: args.where,\n search: args.search,\n data: args.data,\n identity\n }\n });\n\n return new Response({\n id: response.value.id\n });\n }\n }\n },\n isApplicable: context => context.tenancy.getCurrentTenant().id === tenant.id\n });\n\n plugin.name = `headless-cms.graphql.schema.bulkAction.${model.modelId}.${bulkAction.name}`;\n plugins.push(plugin);\n });\n\n context.plugins.register([...plugins]);\n};\n"],"names":["createBulkActionGraphQL","context","bulkAction","tenant","isHeadlessCmsReady","models","allModels","model","tags","Array","CMS_MODEL_SINGLETON_TAG","plugins","plugin","CmsGraphQLSchemaPlugin","BulkActionName","_","args","identity","response","Response"],"mappings":";;;;AAOO,MAAMA,0BAA0B,OACnCC,SACAC;IAEA,MAAMC,SAASF,QAAQ,OAAO,CAAC,gBAAgB;IAG/C,IAAI,CAAE,MAAMG,mBAAmBH,UAC3B;IAGJ,MAAMI,SAAS,MAAMJ,QAAQ,QAAQ,CAAC,oBAAoB,CAAC;QACvD,MAAMK,YAAY,MAAML,QAAQ,GAAG,CAAC,UAAU;QAC9C,OAAOK,UAAU,MAAM,CAACC,CAAAA;YACpB,IAAIA,MAAM,SAAS,EACf,OAAO;YAEX,MAAMC,OAAOC,MAAM,OAAO,CAACF,MAAM,IAAI,IAAIA,MAAM,IAAI,GAAG,EAAE;YACxD,IAAIC,KAAK,QAAQ,CAACE,0BACd,OAAO;YAEX,IAAIR,WAAW,QAAQ,EAAE,QACrB,OAAOA,WAAW,QAAQ,CAAC,QAAQ,CAACK,MAAM,OAAO;YAErD,OAAO;QACX;IACJ;IAEA,MAAMI,UAA4D,EAAE;IAEpEN,OAAO,OAAO,CAACE,CAAAA;QACX,MAAMK,SAAS,IAAIC,uBAA+C;YAC9D,UAAwB,CAAC;2CACM,EAAEN,MAAM,eAAe,CAAC;wBAC3C,EAAEO,eAAe,IAAI,CAACZ,WAAW,IAAI,EAAE;;gBAE/C,CAAC;YACL,WAAW;gBACP,UAAU;oBACN,CAAC,CAAC,UAAU,EAAEK,MAAM,eAAe,EAAE,CAAC,EAAE,OAAOQ,GAAGC,MAAMf;wBACpD,MAAMgB,WAAWhB,QAAQ,QAAQ,CAAC,WAAW;wBAE7C,MAAMiB,WAAW,MAAMjB,QAAQ,KAAK,CAAC,OAAO,CAAC;4BACzC,YAAY,CAAC,YAAY,EAAEe,KAAK,MAAM,CAAC,OAAO,CAAC;4BAC/C,OAAO;gCACH,SAAST,MAAM,OAAO;gCACtB,OAAOS,KAAK,KAAK;gCACjB,QAAQA,KAAK,MAAM;gCACnB,MAAMA,KAAK,IAAI;gCACfC;4BACJ;wBACJ;wBAEA,OAAO,IAAIE,SAAS;4BAChB,IAAID,SAAS,KAAK,CAAC,EAAE;wBACzB;oBACJ;gBACJ;YACJ;YACA,cAAcjB,CAAAA,UAAWA,QAAQ,OAAO,CAAC,gBAAgB,GAAG,EAAE,KAAKE,OAAO,EAAE;QAChF;QAEAS,OAAO,IAAI,GAAG,CAAC,uCAAuC,EAAEL,MAAM,OAAO,CAAC,CAAC,EAAEL,WAAW,IAAI,EAAE;QAC1FS,QAAQ,IAAI,CAACC;IACjB;IAEAX,QAAQ,OAAO,CAAC,QAAQ,CAAC;WAAIU;KAAQ;AACzC"}
1
+ {"version":3,"file":"graphql/createBulkActionGraphQL.js","sources":["../../src/graphql/createBulkActionGraphQL.ts"],"sourcesContent":["import type { HcmsBulkActionsContext } from \"~/types.js\";\nimport {\n CmsGraphQLSchemaPlugin,\n CmsGraphQLSchemaFactory,\n isHeadlessCmsReady\n} from \"@webiny/api-headless-cms\";\nimport { ListModelsUseCase } from \"@webiny/api-headless-cms/features/contentModel/ListModels/index.js\";\nimport { Response } from \"@webiny/api-graphql\";\nimport { CMS_MODEL_SINGLETON_TAG } from \"@webiny/api-headless-cms/constants.js\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\nimport { BulkActionName } from \"~/domain/BulkActionName.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/abstractions.js\";\nimport { TriggerTaskUseCase } from \"@webiny/background-tasks/api\";\n\nexport const createBulkActionGraphQL = async (\n context: HcmsBulkActionsContext,\n bulkAction: EntriesBulkAction.Interface\n) => {\n const tenant = context.container.resolve(TenantContext).getTenant();\n\n if (!(await isHeadlessCmsReady(context))) {\n return;\n }\n\n const modelsResult = await context.container\n .resolve(IdentityContext)\n .withoutAuthorization(async () => {\n return context.container.resolve(ListModelsUseCase).execute();\n });\n if (modelsResult.isFail()) {\n return;\n }\n const models = modelsResult.value.filter(model => {\n if (model.isPrivate) {\n return false;\n }\n const tags = Array.isArray(model.tags) ? model.tags : [];\n if (tags.includes(CMS_MODEL_SINGLETON_TAG)) {\n return false;\n }\n if (bulkAction.modelIds?.length) {\n return bulkAction.modelIds.includes(model.modelId);\n }\n return true;\n });\n\n const plugins: CmsGraphQLSchemaPlugin<HcmsBulkActionsContext>[] = [];\n\n models.forEach(model => {\n const plugin = new CmsGraphQLSchemaPlugin<HcmsBulkActionsContext>({\n typeDefs: /* GraphQL */ `\n extend enum BulkAction${model.singularApiName}Name {\n ${BulkActionName.from(bulkAction.name)}\n }\n `,\n resolvers: {\n Mutation: {\n [`bulkAction${model.singularApiName}`]: async (_, args, context) => {\n const identity = context.container.resolve(IdentityContext).getIdentity();\n\n const response = await context.container\n .resolve(TriggerTaskUseCase)\n .execute({\n definition: `hcmsBulkList${args.action}Entries`,\n input: {\n modelId: model.modelId,\n where: args.where,\n search: args.search,\n data: args.data,\n identity\n }\n });\n\n return new Response({\n id: response.value.id\n });\n }\n }\n },\n isApplicable: context =>\n context.container.resolve(TenantContext).getTenant().id === tenant.id\n });\n\n plugin.name = `headless-cms.graphql.schema.bulkAction.${model.modelId}.${bulkAction.name}`;\n plugins.push(plugin);\n });\n\n context.container.registerInstance(CmsGraphQLSchemaFactory, {\n execute: () => plugins\n });\n};\n"],"names":["createBulkActionGraphQL","context","bulkAction","tenant","TenantContext","isHeadlessCmsReady","modelsResult","IdentityContext","ListModelsUseCase","models","model","tags","Array","CMS_MODEL_SINGLETON_TAG","plugins","plugin","CmsGraphQLSchemaPlugin","BulkActionName","_","args","identity","response","TriggerTaskUseCase","Response","CmsGraphQLSchemaFactory"],"mappings":";;;;;;;;AAeO,MAAMA,0BAA0B,OACnCC,SACAC;IAEA,MAAMC,SAASF,QAAQ,SAAS,CAAC,OAAO,CAACG,eAAe,SAAS;IAEjE,IAAI,CAAE,MAAMC,mBAAmBJ,UAC3B;IAGJ,MAAMK,eAAe,MAAML,QAAQ,SAAS,CACvC,OAAO,CAACM,iBACR,oBAAoB,CAAC,UACXN,QAAQ,SAAS,CAAC,OAAO,CAACO,mBAAmB,OAAO;IAEnE,IAAIF,aAAa,MAAM,IACnB;IAEJ,MAAMG,SAASH,aAAa,KAAK,CAAC,MAAM,CAACI,CAAAA;QACrC,IAAIA,MAAM,SAAS,EACf,OAAO;QAEX,MAAMC,OAAOC,MAAM,OAAO,CAACF,MAAM,IAAI,IAAIA,MAAM,IAAI,GAAG,EAAE;QACxD,IAAIC,KAAK,QAAQ,CAACE,0BACd,OAAO;QAEX,IAAIX,WAAW,QAAQ,EAAE,QACrB,OAAOA,WAAW,QAAQ,CAAC,QAAQ,CAACQ,MAAM,OAAO;QAErD,OAAO;IACX;IAEA,MAAMI,UAA4D,EAAE;IAEpEL,OAAO,OAAO,CAACC,CAAAA;QACX,MAAMK,SAAS,IAAIC,uBAA+C;YAC9D,UAAwB,CAAC;2CACM,EAAEN,MAAM,eAAe,CAAC;wBAC3C,EAAEO,eAAe,IAAI,CAACf,WAAW,IAAI,EAAE;;gBAE/C,CAAC;YACL,WAAW;gBACP,UAAU;oBACN,CAAC,CAAC,UAAU,EAAEQ,MAAM,eAAe,EAAE,CAAC,EAAE,OAAOQ,GAAGC,MAAMlB;wBACpD,MAAMmB,WAAWnB,QAAQ,SAAS,CAAC,OAAO,CAACM,iBAAiB,WAAW;wBAEvE,MAAMc,WAAW,MAAMpB,QAAQ,SAAS,CACnC,OAAO,CAACqB,oBACR,OAAO,CAAC;4BACL,YAAY,CAAC,YAAY,EAAEH,KAAK,MAAM,CAAC,OAAO,CAAC;4BAC/C,OAAO;gCACH,SAAST,MAAM,OAAO;gCACtB,OAAOS,KAAK,KAAK;gCACjB,QAAQA,KAAK,MAAM;gCACnB,MAAMA,KAAK,IAAI;gCACfC;4BACJ;wBACJ;wBAEJ,OAAO,IAAIG,SAAS;4BAChB,IAAIF,SAAS,KAAK,CAAC,EAAE;wBACzB;oBACJ;gBACJ;YACJ;YACA,cAAcpB,CAAAA,UACVA,QAAQ,SAAS,CAAC,OAAO,CAACG,eAAe,SAAS,GAAG,EAAE,KAAKD,OAAO,EAAE;QAC7E;QAEAY,OAAO,IAAI,GAAG,CAAC,uCAAuC,EAAEL,MAAM,OAAO,CAAC,CAAC,EAAER,WAAW,IAAI,EAAE;QAC1FY,QAAQ,IAAI,CAACC;IACjB;IAEAd,QAAQ,SAAS,CAAC,gBAAgB,CAACuB,yBAAyB;QACxD,SAAS,IAAMV;IACnB;AACJ"}
@@ -1,3 +1,8 @@
1
1
  import type { HcmsBulkActionsContext } from "../types.js";
2
- import { BeforeHandlerPlugin } from "@webiny/handler/plugins/BeforeHandlerPlugin.js";
3
- export declare const createDefaultGraphQL: () => BeforeHandlerPlugin<HcmsBulkActionsContext>;
2
+ /**
3
+ * Registers the "default" bulk-action GraphQL for every public model: the shared response types plus,
4
+ * per model, an empty `BulkAction<Model>Name` enum + `bulkAction<Model>` mutation skeleton (each
5
+ * action extends the enum via createBulkActionGraphQL). Run per-request from the bulk-actions
6
+ * RequestContextInitializer (models are only known at request time).
7
+ */
8
+ export declare const registerDefaultBulkActionGraphQL: (context: HcmsBulkActionsContext) => Promise<void>;
@@ -1,35 +1,35 @@
1
- import { CmsGraphQLSchemaPlugin, isHeadlessCmsReady } from "@webiny/api-headless-cms";
1
+ import { CmsGraphQLSchemaFactory, CmsGraphQLSchemaPlugin, isHeadlessCmsReady } from "@webiny/api-headless-cms";
2
+ import { ListModelsUseCase } from "@webiny/api-headless-cms/features/contentModel/ListModels/index.js";
2
3
  import { CMS_MODEL_SINGLETON_TAG } from "@webiny/api-headless-cms/constants.js";
3
- import { BeforeHandlerPlugin } from "@webiny/handler/plugins/BeforeHandlerPlugin.js";
4
- const createDefaultGraphQL = ()=>new BeforeHandlerPlugin(async (context)=>{
5
- const tenant = context.tenancy.getCurrentTenant();
6
- if (!await isHeadlessCmsReady(context)) return;
7
- const defaultPlugin = new CmsGraphQLSchemaPlugin({
8
- typeDefs: `
9
- type BulkActionResponseData {
10
- id: String
11
- }
4
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
5
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/abstractions.js";
6
+ const registerDefaultBulkActionGraphQL = async (context)=>{
7
+ const tenant = context.container.resolve(TenantContext).getTenant();
8
+ if (!await isHeadlessCmsReady(context)) return;
9
+ const defaultPlugin = new CmsGraphQLSchemaPlugin({
10
+ typeDefs: `
11
+ type BulkActionResponseData {
12
+ id: String
13
+ }
12
14
 
13
- type BulkActionResponse {
14
- data: BulkActionResponseData
15
- error: CmsError
16
- }
17
- `
18
- });
19
- defaultPlugin.name = "headless-cms.graphql.schema.bulkAction.default";
20
- const models = await context.security.withoutAuthorization(async ()=>{
21
- const allModels = await context.cms.listModels();
22
- return allModels.filter((model)=>{
23
- if (model.isPrivate) return false;
24
- const tags = Array.isArray(model.tags) ? model.tags : [];
25
- if (tags.includes(CMS_MODEL_SINGLETON_TAG)) return false;
26
- return true;
27
- });
28
- });
29
- const modelPlugins = [];
30
- models.forEach((model)=>{
31
- const plugin = new CmsGraphQLSchemaPlugin({
32
- typeDefs: `
15
+ type BulkActionResponse {
16
+ data: BulkActionResponseData
17
+ error: CmsError
18
+ }
19
+ `
20
+ });
21
+ defaultPlugin.name = "headless-cms.graphql.schema.bulkAction.default";
22
+ const modelsResult = await context.container.resolve(IdentityContext).withoutAuthorization(async ()=>context.container.resolve(ListModelsUseCase).execute());
23
+ if (modelsResult.isFail()) return;
24
+ const models = modelsResult.value.filter((model)=>{
25
+ if (model.isPrivate) return false;
26
+ const tags = Array.isArray(model.tags) ? model.tags : [];
27
+ return !tags.includes(CMS_MODEL_SINGLETON_TAG);
28
+ });
29
+ const modelPlugins = [];
30
+ models.forEach((model)=>{
31
+ const plugin = new CmsGraphQLSchemaPlugin({
32
+ typeDefs: `
33
33
  enum BulkAction${model.singularApiName}Name {
34
34
  _empty
35
35
  }
@@ -43,16 +43,18 @@ const createDefaultGraphQL = ()=>new BeforeHandlerPlugin(async (context)=>{
43
43
  ): BulkActionResponse
44
44
  }
45
45
  `,
46
- isApplicable: (context)=>context.tenancy.getCurrentTenant().id === tenant.id
47
- });
48
- plugin.name = `headless-cms.graphql.schema.bulkAction.default.${model.modelId}`;
49
- modelPlugins.push(plugin);
46
+ isApplicable: (context)=>context.container.resolve(TenantContext).getTenant().id === tenant.id
50
47
  });
51
- context.plugins.register([
52
- defaultPlugin,
53
- ...modelPlugins
54
- ]);
48
+ plugin.name = `headless-cms.graphql.schema.bulkAction.default.${model.modelId}`;
49
+ modelPlugins.push(plugin);
50
+ });
51
+ context.container.registerInstance(CmsGraphQLSchemaFactory, {
52
+ execute: ()=>[
53
+ defaultPlugin,
54
+ ...modelPlugins
55
+ ]
55
56
  });
56
- export { createDefaultGraphQL };
57
+ };
58
+ export { registerDefaultBulkActionGraphQL };
57
59
 
58
60
  //# sourceMappingURL=createDefaultGraphQL.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"graphql/createDefaultGraphQL.js","sources":["../../src/graphql/createDefaultGraphQL.ts"],"sourcesContent":["import type { HcmsBulkActionsContext } from \"~/types.js\";\nimport { CmsGraphQLSchemaPlugin, isHeadlessCmsReady } from \"@webiny/api-headless-cms\";\nimport { CMS_MODEL_SINGLETON_TAG } from \"@webiny/api-headless-cms/constants.js\";\nimport { BeforeHandlerPlugin } from \"@webiny/handler/plugins/BeforeHandlerPlugin.js\";\n\nexport const createDefaultGraphQL = () => {\n return new BeforeHandlerPlugin<HcmsBulkActionsContext>(async context => {\n const tenant = context.tenancy.getCurrentTenant();\n\n if (!(await isHeadlessCmsReady(context))) {\n return;\n }\n\n const defaultPlugin = new CmsGraphQLSchemaPlugin({\n typeDefs: /* GraphQL */ `\n type BulkActionResponseData {\n id: String\n }\n\n type BulkActionResponse {\n data: BulkActionResponseData\n error: CmsError\n }\n `\n });\n defaultPlugin.name = `headless-cms.graphql.schema.bulkAction.default`;\n\n const models = await context.security.withoutAuthorization(async () => {\n const allModels = await context.cms.listModels();\n return allModels.filter(model => {\n if (model.isPrivate) {\n return false;\n }\n const tags = Array.isArray(model.tags) ? model.tags : [];\n if (tags.includes(CMS_MODEL_SINGLETON_TAG)) {\n return false;\n }\n return true;\n });\n });\n\n const modelPlugins: CmsGraphQLSchemaPlugin<HcmsBulkActionsContext>[] = [];\n\n models.forEach(model => {\n const plugin = new CmsGraphQLSchemaPlugin({\n typeDefs: /* GraphQL */ `\n enum BulkAction${model.singularApiName}Name {\n _empty\n }\n \n extend type Mutation {\n bulkAction${model.singularApiName}(\n action: BulkAction${model.singularApiName}Name!\n where: ${model.singularApiName}ListWhereInput\n search: String\n data: JSON\n ): BulkActionResponse\n }\n `,\n isApplicable: context => context.tenancy.getCurrentTenant().id === tenant.id\n });\n\n plugin.name = `headless-cms.graphql.schema.bulkAction.default.${model.modelId}`;\n modelPlugins.push(plugin);\n });\n\n context.plugins.register([defaultPlugin, ...modelPlugins]);\n });\n};\n"],"names":["createDefaultGraphQL","BeforeHandlerPlugin","context","tenant","isHeadlessCmsReady","defaultPlugin","CmsGraphQLSchemaPlugin","models","allModels","model","tags","Array","CMS_MODEL_SINGLETON_TAG","modelPlugins","plugin"],"mappings":";;;AAKO,MAAMA,uBAAuB,IACzB,IAAIC,oBAA4C,OAAMC;QACzD,MAAMC,SAASD,QAAQ,OAAO,CAAC,gBAAgB;QAE/C,IAAI,CAAE,MAAME,mBAAmBF,UAC3B;QAGJ,MAAMG,gBAAgB,IAAIC,uBAAuB;YAC7C,UAAwB,CAAC;;;;;;;;;YASzB,CAAC;QACL;QACAD,cAAc,IAAI,GAAG;QAErB,MAAME,SAAS,MAAML,QAAQ,QAAQ,CAAC,oBAAoB,CAAC;YACvD,MAAMM,YAAY,MAAMN,QAAQ,GAAG,CAAC,UAAU;YAC9C,OAAOM,UAAU,MAAM,CAACC,CAAAA;gBACpB,IAAIA,MAAM,SAAS,EACf,OAAO;gBAEX,MAAMC,OAAOC,MAAM,OAAO,CAACF,MAAM,IAAI,IAAIA,MAAM,IAAI,GAAG,EAAE;gBACxD,IAAIC,KAAK,QAAQ,CAACE,0BACd,OAAO;gBAEX,OAAO;YACX;QACJ;QAEA,MAAMC,eAAiE,EAAE;QAEzEN,OAAO,OAAO,CAACE,CAAAA;YACX,MAAMK,SAAS,IAAIR,uBAAuB;gBACtC,UAAwB,CAAC;mCACN,EAAEG,MAAM,eAAe,CAAC;;;;;kCAKzB,EAAEA,MAAM,eAAe,CAAC;8CACZ,EAAEA,MAAM,eAAe,CAAC;mCACnC,EAAEA,MAAM,eAAe,CAAC;;;;;gBAK3C,CAAC;gBACD,cAAcP,CAAAA,UAAWA,QAAQ,OAAO,CAAC,gBAAgB,GAAG,EAAE,KAAKC,OAAO,EAAE;YAChF;YAEAW,OAAO,IAAI,GAAG,CAAC,+CAA+C,EAAEL,MAAM,OAAO,EAAE;YAC/EI,aAAa,IAAI,CAACC;QACtB;QAEAZ,QAAQ,OAAO,CAAC,QAAQ,CAAC;YAACG;eAAkBQ;SAAa;IAC7D"}
1
+ {"version":3,"file":"graphql/createDefaultGraphQL.js","sources":["../../src/graphql/createDefaultGraphQL.ts"],"sourcesContent":["import type { HcmsBulkActionsContext } from \"~/types.js\";\nimport {\n CmsGraphQLSchemaPlugin,\n CmsGraphQLSchemaFactory,\n isHeadlessCmsReady\n} from \"@webiny/api-headless-cms\";\nimport { ListModelsUseCase } from \"@webiny/api-headless-cms/features/contentModel/ListModels/index.js\";\nimport { CMS_MODEL_SINGLETON_TAG } from \"@webiny/api-headless-cms/constants.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/abstractions.js\";\n\n/**\n * Registers the \"default\" bulk-action GraphQL for every public model: the shared response types plus,\n * per model, an empty `BulkAction<Model>Name` enum + `bulkAction<Model>` mutation skeleton (each\n * action extends the enum via createBulkActionGraphQL). Run per-request from the bulk-actions\n * RequestContextInitializer (models are only known at request time).\n */\nexport const registerDefaultBulkActionGraphQL = async (context: HcmsBulkActionsContext) => {\n const tenant = context.container.resolve(TenantContext).getTenant();\n\n if (!(await isHeadlessCmsReady(context))) {\n return;\n }\n\n const defaultPlugin = new CmsGraphQLSchemaPlugin({\n typeDefs: /* GraphQL */ `\n type BulkActionResponseData {\n id: String\n }\n\n type BulkActionResponse {\n data: BulkActionResponseData\n error: CmsError\n }\n `\n });\n defaultPlugin.name = `headless-cms.graphql.schema.bulkAction.default`;\n\n const modelsResult = await context.container\n .resolve(IdentityContext)\n .withoutAuthorization(async () => {\n return context.container.resolve(ListModelsUseCase).execute();\n });\n if (modelsResult.isFail()) {\n return;\n }\n const models = modelsResult.value.filter(model => {\n if (model.isPrivate) {\n return false;\n }\n const tags = Array.isArray(model.tags) ? model.tags : [];\n return !tags.includes(CMS_MODEL_SINGLETON_TAG);\n });\n\n const modelPlugins: CmsGraphQLSchemaPlugin<HcmsBulkActionsContext>[] = [];\n\n models.forEach(model => {\n const plugin = new CmsGraphQLSchemaPlugin({\n typeDefs: /* GraphQL */ `\n enum BulkAction${model.singularApiName}Name {\n _empty\n }\n \n extend type Mutation {\n bulkAction${model.singularApiName}(\n action: BulkAction${model.singularApiName}Name!\n where: ${model.singularApiName}ListWhereInput\n search: String\n data: JSON\n ): BulkActionResponse\n }\n `,\n isApplicable: context =>\n context.container.resolve(TenantContext).getTenant().id === tenant.id\n });\n\n plugin.name = `headless-cms.graphql.schema.bulkAction.default.${model.modelId}`;\n modelPlugins.push(plugin);\n });\n\n context.container.registerInstance(CmsGraphQLSchemaFactory, {\n execute: () => [defaultPlugin, ...modelPlugins]\n });\n};\n"],"names":["registerDefaultBulkActionGraphQL","context","tenant","TenantContext","isHeadlessCmsReady","defaultPlugin","CmsGraphQLSchemaPlugin","modelsResult","IdentityContext","ListModelsUseCase","models","model","tags","Array","CMS_MODEL_SINGLETON_TAG","modelPlugins","plugin","CmsGraphQLSchemaFactory"],"mappings":";;;;;AAiBO,MAAMA,mCAAmC,OAAOC;IACnD,MAAMC,SAASD,QAAQ,SAAS,CAAC,OAAO,CAACE,eAAe,SAAS;IAEjE,IAAI,CAAE,MAAMC,mBAAmBH,UAC3B;IAGJ,MAAMI,gBAAgB,IAAIC,uBAAuB;QAC7C,UAAwB,CAAC;;;;;;;;;QASzB,CAAC;IACL;IACAD,cAAc,IAAI,GAAG;IAErB,MAAME,eAAe,MAAMN,QAAQ,SAAS,CACvC,OAAO,CAACO,iBACR,oBAAoB,CAAC,UACXP,QAAQ,SAAS,CAAC,OAAO,CAACQ,mBAAmB,OAAO;IAEnE,IAAIF,aAAa,MAAM,IACnB;IAEJ,MAAMG,SAASH,aAAa,KAAK,CAAC,MAAM,CAACI,CAAAA;QACrC,IAAIA,MAAM,SAAS,EACf,OAAO;QAEX,MAAMC,OAAOC,MAAM,OAAO,CAACF,MAAM,IAAI,IAAIA,MAAM,IAAI,GAAG,EAAE;QACxD,OAAO,CAACC,KAAK,QAAQ,CAACE;IAC1B;IAEA,MAAMC,eAAiE,EAAE;IAEzEL,OAAO,OAAO,CAACC,CAAAA;QACX,MAAMK,SAAS,IAAIV,uBAAuB;YACtC,UAAwB,CAAC;mCACF,EAAEK,MAAM,eAAe,CAAC;;;;;kCAKzB,EAAEA,MAAM,eAAe,CAAC;8CACZ,EAAEA,MAAM,eAAe,CAAC;mCACnC,EAAEA,MAAM,eAAe,CAAC;;;;;gBAK3C,CAAC;YACL,cAAcV,CAAAA,UACVA,QAAQ,SAAS,CAAC,OAAO,CAACE,eAAe,SAAS,GAAG,EAAE,KAAKD,OAAO,EAAE;QAC7E;QAEAc,OAAO,IAAI,GAAG,CAAC,+CAA+C,EAAEL,MAAM,OAAO,EAAE;QAC/EI,aAAa,IAAI,CAACC;IACtB;IAEAf,QAAQ,SAAS,CAAC,gBAAgB,CAACgB,yBAAyB;QACxD,SAAS,IAAM;gBAACZ;mBAAkBU;aAAa;IACnD;AACJ"}
package/index.d.ts CHANGED
@@ -1,8 +1,4 @@
1
- import type { HcmsBulkActionsContext } from "./types.js";
2
1
  export type * from "./abstractions/index.js";
3
- export { createHandlers } from "./handlers/index.js";
4
- export { createEmptyTrashBinsTask } from "./tasks/index.js";
5
- interface BulkActionsConfig {
6
- batchSize?: number;
7
- }
8
- export declare const createHcmsBulkActions: (config?: BulkActionsConfig) => ((import("@webiny/handler-aws/index.js").EventBridgeEventHandler<"WebinyEmptyTrashBin", Record<string, any>, any> | import("@webiny/handler/index.js").HandlerOnRequestPlugin<import("@webiny/handler/types.js").Context>)[] | import("@webiny/handler/index.js").BeforeHandlerPlugin<HcmsBulkActionsContext> | import("@webiny/api").ContextPlugin<import("@webiny/api/types.js").Context>)[];
2
+ export { BulkActionsEventBridgeLambdaHandler } from "./BulkActionsEventBridgeLambdaHandler.js";
3
+ export { HcmsBulkActionsFeature } from "./HcmsBulkActionsFeature.js";
4
+ export type { HcmsBulkActionsFeatureConfig } from "./HcmsBulkActionsFeature.js";
package/index.js CHANGED
@@ -1,46 +1,2 @@
1
- import { createHandlers } from "./handlers/index.js";
2
- import { createBeforeHandlerPlugin } from "@webiny/handler/plugins/BeforeHandlerPlugin.js";
3
- import { EntriesBulkAction, EntriesBulkActionConfig } from "./features/EntriesBulkAction/abstractions.js";
4
- import { BulkActionContext } from "./features/BulkActionContext/index.js";
5
- import { createBulkActionTasks } from "./features/EntriesBulkAction/createBulkActionTasks.js";
6
- import { createDefaultGraphQL } from "./graphql/createDefaultGraphQL.js";
7
- import { createBulkActionGraphQL } from "./graphql/createBulkActionGraphQL.js";
8
- import { createContextPlugin } from "@webiny/api";
9
- import { DeleteEntriesBulkActionFeature } from "./features/DeleteEntriesBulkAction/feature.js";
10
- import { MoveToFolderBulkActionFeature } from "./features/MoveToFolderBulkAction/feature.js";
11
- import { MoveToTrashBulkActionFeature } from "./features/MoveToTrashBulkAction/feature.js";
12
- import { PublishEntriesBulkActionFeature } from "./features/PublishEntriesBulkAction/feature.js";
13
- import { UnpublishEntriesBulkActionFeature } from "./features/UnpublishEntriesBulkAction/feature.js";
14
- import { RestoreEntriesBulkActionFeature } from "./features/RestoreEntriesBulkAction/feature.js";
15
- const createHcmsBulkActions = (config)=>{
16
- const batchSize = config?.batchSize ?? 100;
17
- return [
18
- createHandlers(),
19
- createDefaultGraphQL(),
20
- createContextPlugin((context)=>{
21
- context.container.registerInstance(EntriesBulkActionConfig, {
22
- batchSize
23
- });
24
- DeleteEntriesBulkActionFeature.register(context.container);
25
- MoveToFolderBulkActionFeature.register(context.container);
26
- MoveToTrashBulkActionFeature.register(context.container);
27
- PublishEntriesBulkActionFeature.register(context.container);
28
- UnpublishEntriesBulkActionFeature.register(context.container);
29
- RestoreEntriesBulkActionFeature.register(context.container);
30
- }),
31
- createBeforeHandlerPlugin(async (context)=>{
32
- context.container.registerInstance(BulkActionContext, context);
33
- const bulkActions = context.container.resolveAll(EntriesBulkAction);
34
- const bulkActionsConfig = context.container.resolve(EntriesBulkActionConfig);
35
- for (const bulkAction of bulkActions){
36
- const feature = createBulkActionTasks(bulkAction, bulkActionsConfig);
37
- feature.register(context.container);
38
- await createBulkActionGraphQL(context, bulkAction);
39
- }
40
- })
41
- ];
42
- };
43
- export { createEmptyTrashBinsTask } from "./tasks/index.js";
44
- export { createHandlers, createHcmsBulkActions };
45
-
46
- //# sourceMappingURL=index.js.map
1
+ export { BulkActionsEventBridgeLambdaHandler } from "./BulkActionsEventBridgeLambdaHandler.js";
2
+ export { HcmsBulkActionsFeature } from "./HcmsBulkActionsFeature.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-headless-cms-bulk-actions",
3
- "version": "6.4.5",
3
+ "version": "6.6.0-alpha.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -17,23 +17,28 @@
17
17
  },
18
18
  "license": "MIT",
19
19
  "dependencies": {
20
- "@webiny/api-headless-cms": "6.4.5",
21
- "@webiny/background-tasks": "6.4.5",
22
- "@webiny/feature": "6.4.5",
23
- "@webiny/handler": "6.4.5",
24
- "@webiny/handler-aws": "6.4.5",
25
- "@webiny/utils": "6.4.5"
20
+ "@webiny/api-graphql": "6.6.0-alpha.0",
21
+ "@webiny/api-headless-cms": "6.6.0-alpha.0",
22
+ "@webiny/aws-sdk": "6.6.0-alpha.0",
23
+ "@webiny/background-tasks": "6.6.0-alpha.0",
24
+ "@webiny/event-handler-aws": "6.6.0-alpha.0",
25
+ "@webiny/event-handler-core": "6.6.0-alpha.0",
26
+ "@webiny/feature": "6.6.0-alpha.0",
27
+ "@webiny/handler": "6.6.0-alpha.0",
28
+ "@webiny/utils": "6.6.0-alpha.0"
26
29
  },
27
30
  "devDependencies": {
28
- "@webiny/api": "6.4.5",
29
- "@webiny/api-core": "6.4.5",
30
- "@webiny/build-tools": "6.4.5",
31
- "@webiny/handler-graphql": "6.4.5",
32
- "@webiny/plugins": "6.4.5",
33
- "@webiny/project-utils": "6.4.5",
34
- "@webiny/wcp": "6.4.5",
31
+ "@webiny/api": "6.6.0-alpha.0",
32
+ "@webiny/api-core": "6.6.0-alpha.0",
33
+ "@webiny/api-graphql": "6.6.0-alpha.0",
34
+ "@webiny/api-headless-cms-testing": "6.6.0-alpha.0",
35
+ "@webiny/build-tools": "6.6.0-alpha.0",
36
+ "@webiny/di": "1.0.2",
37
+ "@webiny/plugins": "6.6.0-alpha.0",
38
+ "@webiny/project-utils": "6.6.0-alpha.0",
39
+ "@webiny/wcp": "6.6.0-alpha.0",
35
40
  "graphql": "16.14.2",
36
- "typescript": "6.0.3",
41
+ "typescript": "7.0.2",
37
42
  "vitest": "4.1.10"
38
43
  },
39
44
  "publishConfig": {
@@ -17,7 +17,7 @@ declare class EmptyTrashBinTask implements TaskDefinition.Interface<IEmptyTrashB
17
17
  readonly description = "Delete all entries in the trash bin for each model in the system.";
18
18
  readonly maxIterations = 120;
19
19
  readonly databaseLogs = false;
20
- readonly selfCleanup: ("onSuccess" | "onAbort")[];
20
+ readonly selfCleanup: ("onAbort" | "onSuccess")[];
21
21
  constructor(tenantContext: TenantContext.Interface, listTenants: ListTenantsUseCase.Interface, listModels: ListModelsUseCase.Interface, listDeletedEntries: ListDeletedEntriesUseCase.Interface, deleteEntry: DeleteEntryUseCase.Interface);
22
22
  run(params: TaskDefinition.RunParams<IEmptyTrashBinsInput, IEmptyTrashBinsOutput>): Promise<TaskDefinition.Result<IEmptyTrashBinsInput, IEmptyTrashBinsOutput>>;
23
23
  }
@@ -1,5 +0,0 @@
1
- import type { HcmsBulkActionsContext } from "../../types.js";
2
- export declare const BulkActionContext: import("@webiny/di").Abstraction<HcmsBulkActionsContext>;
3
- export declare namespace BulkActionContext {
4
- type Interface = HcmsBulkActionsContext;
5
- }
@@ -1,5 +0,0 @@
1
- import { createAbstraction } from "@webiny/feature/api";
2
- const BulkActionContext = createAbstraction("BulkActionContext");
3
- export { BulkActionContext };
4
-
5
- //# sourceMappingURL=abstractions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"features/BulkActionContext/abstractions.js","sources":["../../../src/features/BulkActionContext/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { HcmsBulkActionsContext } from \"~/types.js\";\n\n// TODO: this is a bridge for legacy context; needs review and refactor of code that uses it.\n\nexport const BulkActionContext = createAbstraction<HcmsBulkActionsContext>(\"BulkActionContext\");\n\nexport namespace BulkActionContext {\n export type Interface = HcmsBulkActionsContext;\n}\n"],"names":["BulkActionContext","createAbstraction"],"mappings":";AAKO,MAAMA,oBAAoBC,kBAA0C"}
@@ -1 +0,0 @@
1
- export * from "./abstractions.js";
@@ -1 +0,0 @@
1
- export * from "./abstractions.js";
@@ -1 +0,0 @@
1
- export declare const createEventBridgeHandler: () => import("@webiny/handler-aws").EventBridgeEventHandler<"WebinyEmptyTrashBin", Record<string, any>, any>;
@@ -1,28 +0,0 @@
1
- import { createEventBridgeEventHandler } from "@webiny/handler-aws";
2
- const DETAIL_TYPE = "WebinyEmptyTrashBin";
3
- const createEventBridgeHandler = ()=>{
4
- const handler = createEventBridgeEventHandler(async ({ context: ctx, payload, next })=>{
5
- try {
6
- if (payload["detail-type"] !== DETAIL_TYPE) return next();
7
- const context = ctx;
8
- if (!context.tasks || !context.tenancy) return void console.error("Missing tasks or tenancy definition on context.");
9
- await context.tenancy.withRootTenant(async ()=>{
10
- await context.tasks.trigger({
11
- definition: "hcmsEntriesEmptyTrashBins"
12
- });
13
- });
14
- return;
15
- } catch (ex) {
16
- console.error("[EVENT_BRIDGE_HANDLER_EMPTY_TRASH_BIN] => ", JSON.stringify({
17
- message: ex.message,
18
- code: ex.code,
19
- data: ex.data
20
- }));
21
- }
22
- });
23
- handler.name = handler.type + ".cmsBulkActions";
24
- return handler;
25
- };
26
- export { createEventBridgeHandler };
27
-
28
- //# sourceMappingURL=eventBridgeEventHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handlers/eventBridgeEventHandler.js","sources":["../../src/handlers/eventBridgeEventHandler.ts"],"sourcesContent":["import { createEventBridgeEventHandler } from \"@webiny/handler-aws\";\nimport type { HcmsBulkActionsContext } from \"~/types.js\";\n\nconst DETAIL_TYPE = \"WebinyEmptyTrashBin\";\n\nexport const createEventBridgeHandler = () => {\n const handler = createEventBridgeEventHandler<typeof DETAIL_TYPE, Record<string, any>>(\n async ({ context: ctx, payload, next }) => {\n try {\n /**\n * If we receive an event that is not \"WebinyEmptyTrashBin\", we should exit.\n */\n if (payload[\"detail-type\"] !== DETAIL_TYPE) {\n return next();\n }\n\n const context = ctx as unknown as HcmsBulkActionsContext;\n\n if (!context.tasks || !context.tenancy) {\n console.error(\"Missing tasks or tenancy definition on context.\");\n return;\n }\n\n /**\n * Since the event is at the infrastructure level, it has no knowledge about tenancy.\n * We trigger the `hcmsEntriesEmptyTrashBins` using root tenant.\n */\n await context.tenancy.withRootTenant(async () => {\n await context.tasks.trigger({\n definition: \"hcmsEntriesEmptyTrashBins\"\n });\n });\n\n return;\n } catch (ex) {\n console.error(\n \"[EVENT_BRIDGE_HANDLER_EMPTY_TRASH_BIN] => \",\n JSON.stringify({\n message: ex.message,\n code: ex.code,\n data: ex.data\n })\n );\n }\n }\n );\n\n // Assign a human-readable name for easier debugging.\n handler.name = handler.type + \".cmsBulkActions\";\n\n return handler;\n};\n"],"names":["DETAIL_TYPE","createEventBridgeHandler","handler","createEventBridgeEventHandler","ctx","payload","next","context","console","ex","JSON"],"mappings":";AAGA,MAAMA,cAAc;AAEb,MAAMC,2BAA2B;IACpC,MAAMC,UAAUC,8BACZ,OAAO,EAAE,SAASC,GAAG,EAAEC,OAAO,EAAEC,IAAI,EAAE;QAClC,IAAI;YAIA,IAAID,OAAO,CAAC,cAAc,KAAKL,aAC3B,OAAOM;YAGX,MAAMC,UAAUH;YAEhB,IAAI,CAACG,QAAQ,KAAK,IAAI,CAACA,QAAQ,OAAO,EAAE,YACpCC,QAAQ,KAAK,CAAC;YAQlB,MAAMD,QAAQ,OAAO,CAAC,cAAc,CAAC;gBACjC,MAAMA,QAAQ,KAAK,CAAC,OAAO,CAAC;oBACxB,YAAY;gBAChB;YACJ;YAEA;QACJ,EAAE,OAAOE,IAAI;YACTD,QAAQ,KAAK,CACT,8CACAE,KAAK,SAAS,CAAC;gBACX,SAASD,GAAG,OAAO;gBACnB,MAAMA,GAAG,IAAI;gBACb,MAAMA,GAAG,IAAI;YACjB;QAER;IACJ;IAIJP,QAAQ,IAAI,GAAGA,QAAQ,IAAI,GAAG;IAE9B,OAAOA;AACX"}
@@ -1 +0,0 @@
1
- export declare const createHandlers: () => (import("@webiny/handler-aws/index.js").EventBridgeEventHandler<"WebinyEmptyTrashBin", Record<string, any>, any> | import("@webiny/handler/index.js").HandlerOnRequestPlugin<import("@webiny/handler/types.js").Context>)[];
package/handlers/index.js DELETED
@@ -1,9 +0,0 @@
1
- import { createEventBridgeHandler } from "./eventBridgeEventHandler.js";
2
- import { setupEventsTenant } from "./setupEventsTenant.js";
3
- const createHandlers = ()=>[
4
- setupEventsTenant(),
5
- createEventBridgeHandler()
6
- ];
7
- export { createHandlers };
8
-
9
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handlers/index.js","sources":["../../src/handlers/index.ts"],"sourcesContent":["import { createEventBridgeHandler } from \"./eventBridgeEventHandler.js\";\nimport { setupEventsTenant } from \"./setupEventsTenant.js\";\n\nexport const createHandlers = () => {\n return [setupEventsTenant(), createEventBridgeHandler()];\n};\n"],"names":["createHandlers","setupEventsTenant","createEventBridgeHandler"],"mappings":";;AAGO,MAAMA,iBAAiB,IACnB;QAACC;QAAqBC;KAA2B"}
@@ -1 +0,0 @@
1
- export declare const setupEventsTenant: () => import("@webiny/handler").HandlerOnRequestPlugin<import("@webiny/handler/types").Context>;
@@ -1,10 +0,0 @@
1
- import { createHandlerOnRequest } from "@webiny/handler";
2
- const setupEventsTenant = ()=>createHandlerOnRequest(async (request)=>{
3
- request.headers = {
4
- ...request.headers,
5
- "x-tenant": request.headers["x-tenant"] || "root"
6
- };
7
- });
8
- export { setupEventsTenant };
9
-
10
- //# sourceMappingURL=setupEventsTenant.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handlers/setupEventsTenant.js","sources":["../../src/handlers/setupEventsTenant.ts"],"sourcesContent":["import { createHandlerOnRequest } from \"@webiny/handler\";\n\nexport const setupEventsTenant = () => {\n return createHandlerOnRequest(async request => {\n request.headers = {\n ...request.headers,\n \"x-tenant\": request.headers[\"x-tenant\"] || \"root\"\n };\n\n return;\n });\n};\n"],"names":["setupEventsTenant","createHandlerOnRequest","request"],"mappings":";AAEO,MAAMA,oBAAoB,IACtBC,uBAAuB,OAAMC;QAChCA,QAAQ,OAAO,GAAG;YACd,GAAGA,QAAQ,OAAO;YAClB,YAAYA,QAAQ,OAAO,CAAC,WAAW,IAAI;QAC/C;IAGJ"}
package/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { createHandlers } from \"~/handlers/index.js\";\nimport { createBeforeHandlerPlugin } from \"@webiny/handler/plugins/BeforeHandlerPlugin.js\";\nimport {\n EntriesBulkAction,\n EntriesBulkActionConfig\n} from \"~/features/EntriesBulkAction/abstractions.js\";\nimport { BulkActionContext } from \"~/features/BulkActionContext/index.js\";\nimport { createBulkActionTasks } from \"~/features/EntriesBulkAction/createBulkActionTasks.js\";\nimport { createDefaultGraphQL } from \"~/graphql/createDefaultGraphQL.js\";\nimport { createBulkActionGraphQL } from \"~/graphql/createBulkActionGraphQL.js\";\nimport { createContextPlugin } from \"@webiny/api\";\nimport { DeleteEntriesBulkActionFeature } from \"~/features/DeleteEntriesBulkAction/feature.js\";\nimport { MoveToFolderBulkActionFeature } from \"~/features/MoveToFolderBulkAction/feature.js\";\nimport { MoveToTrashBulkActionFeature } from \"~/features/MoveToTrashBulkAction/feature.js\";\nimport { PublishEntriesBulkActionFeature } from \"~/features/PublishEntriesBulkAction/feature.js\";\nimport { UnpublishEntriesBulkActionFeature } from \"~/features/UnpublishEntriesBulkAction/feature.js\";\nimport { RestoreEntriesBulkActionFeature } from \"~/features/RestoreEntriesBulkAction/feature.js\";\nimport type { HcmsBulkActionsContext } from \"~/types.js\";\n\nexport type * from \"./abstractions/index.js\";\nexport { createHandlers } from \"./handlers/index.js\";\nexport { createEmptyTrashBinsTask } from \"./tasks/index.js\";\n\ninterface BulkActionsConfig {\n batchSize?: number;\n}\n\nexport const createHcmsBulkActions = (config?: BulkActionsConfig) => {\n const batchSize = config?.batchSize ?? 100;\n\n return [\n createHandlers(),\n createDefaultGraphQL(),\n // Register bulk action features\n createContextPlugin(context => {\n // Bulk action config is shared among all bulk actions.\n context.container.registerInstance(EntriesBulkActionConfig, { batchSize });\n\n DeleteEntriesBulkActionFeature.register(context.container);\n MoveToFolderBulkActionFeature.register(context.container);\n MoveToTrashBulkActionFeature.register(context.container);\n PublishEntriesBulkActionFeature.register(context.container);\n UnpublishEntriesBulkActionFeature.register(context.container);\n RestoreEntriesBulkActionFeature.register(context.container);\n }),\n // Set up bulk actions after the context is bootstrapped, but before actual handler processing\n createBeforeHandlerPlugin<HcmsBulkActionsContext>(async context => {\n context.container.registerInstance(BulkActionContext, context);\n\n const bulkActions = context.container.resolveAll(EntriesBulkAction);\n const bulkActionsConfig = context.container.resolve(EntriesBulkActionConfig);\n\n // 2. For each EntriesBulkAction, create and register tasks + GraphQL schema\n for (const bulkAction of bulkActions) {\n // Register tasks implementation\n const feature = createBulkActionTasks(bulkAction, bulkActionsConfig);\n feature.register(context.container);\n // Register GraphQL schema\n await createBulkActionGraphQL(context, bulkAction);\n }\n })\n ];\n};\n"],"names":["createHcmsBulkActions","config","batchSize","createHandlers","createDefaultGraphQL","createContextPlugin","context","EntriesBulkActionConfig","DeleteEntriesBulkActionFeature","MoveToFolderBulkActionFeature","MoveToTrashBulkActionFeature","PublishEntriesBulkActionFeature","UnpublishEntriesBulkActionFeature","RestoreEntriesBulkActionFeature","createBeforeHandlerPlugin","BulkActionContext","bulkActions","EntriesBulkAction","bulkActionsConfig","bulkAction","feature","createBulkActionTasks","createBulkActionGraphQL"],"mappings":";;;;;;;;;;;;;;AA2BO,MAAMA,wBAAwB,CAACC;IAClC,MAAMC,YAAYD,QAAQ,aAAa;IAEvC,OAAO;QACHE;QACAC;QAEAC,oBAAoBC,CAAAA;YAEhBA,QAAQ,SAAS,CAAC,gBAAgB,CAACC,yBAAyB;gBAAEL;YAAU;YAExEM,+BAA+B,QAAQ,CAACF,QAAQ,SAAS;YACzDG,8BAA8B,QAAQ,CAACH,QAAQ,SAAS;YACxDI,6BAA6B,QAAQ,CAACJ,QAAQ,SAAS;YACvDK,gCAAgC,QAAQ,CAACL,QAAQ,SAAS;YAC1DM,kCAAkC,QAAQ,CAACN,QAAQ,SAAS;YAC5DO,gCAAgC,QAAQ,CAACP,QAAQ,SAAS;QAC9D;QAEAQ,0BAAkD,OAAMR;YACpDA,QAAQ,SAAS,CAAC,gBAAgB,CAACS,mBAAmBT;YAEtD,MAAMU,cAAcV,QAAQ,SAAS,CAAC,UAAU,CAACW;YACjD,MAAMC,oBAAoBZ,QAAQ,SAAS,CAAC,OAAO,CAACC;YAGpD,KAAK,MAAMY,cAAcH,YAAa;gBAElC,MAAMI,UAAUC,sBAAsBF,YAAYD;gBAClDE,QAAQ,QAAQ,CAACd,QAAQ,SAAS;gBAElC,MAAMgB,wBAAwBhB,SAASa;YAC3C;QACJ;KACH;AACL"}
@@ -1 +0,0 @@
1
- export declare const createEmptyTrashBinsTask: () => import("@webiny/api").ContextPlugin<import("@webiny/api/types.js").Context>;
@@ -1,8 +0,0 @@
1
- import { createContextPlugin } from "@webiny/api";
2
- import { EmptyTrashBinTaskDefinition } from "./EmptyTrashBinTaskDefinition.js";
3
- const createEmptyTrashBinsTask = ()=>createContextPlugin((context)=>{
4
- context.container.register(EmptyTrashBinTaskDefinition);
5
- });
6
- export { createEmptyTrashBinsTask };
7
-
8
- //# sourceMappingURL=createEmptyTrashBinsTask.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks/createEmptyTrashBinsTask.js","sources":["../../src/tasks/createEmptyTrashBinsTask.ts"],"sourcesContent":["import { createContextPlugin } from \"@webiny/api\";\nimport { EmptyTrashBinTaskDefinition } from \"./EmptyTrashBinTaskDefinition.js\";\n\nexport const createEmptyTrashBinsTask = () => {\n return createContextPlugin(context => {\n context.container.register(EmptyTrashBinTaskDefinition);\n });\n};\n"],"names":["createEmptyTrashBinsTask","createContextPlugin","context","EmptyTrashBinTaskDefinition"],"mappings":";;AAGO,MAAMA,2BAA2B,IAC7BC,oBAAoBC,CAAAA;QACvBA,QAAQ,SAAS,CAAC,QAAQ,CAACC;IAC/B"}
package/tasks/index.d.ts DELETED
@@ -1 +0,0 @@
1
- export * from "./createEmptyTrashBinsTask.js";
package/tasks/index.js DELETED
@@ -1 +0,0 @@
1
- export * from "./createEmptyTrashBinsTask.js";