@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.
- package/BulkActionsEventBridgeLambdaHandler.d.ts +13 -0
- package/BulkActionsEventBridgeLambdaHandler.js +33 -0
- package/BulkActionsEventBridgeLambdaHandler.js.map +1 -0
- package/HcmsBulkActionsFeature.d.ts +7 -0
- package/HcmsBulkActionsFeature.js +40 -0
- package/HcmsBulkActionsFeature.js.map +1 -0
- package/features/EntriesBulkAction/createBulkActionTasks.js +12 -8
- package/features/EntriesBulkAction/createBulkActionTasks.js.map +1 -1
- package/features/EntriesBulkAction/internals/ChildTasksCleanup.d.ts +2 -2
- package/features/EntriesBulkAction/internals/ChildTasksCleanup.js +8 -8
- package/features/EntriesBulkAction/internals/ChildTasksCleanup.js.map +1 -1
- package/features/EntriesBulkAction/internals/CreateTasksByModel.d.ts +4 -4
- package/features/EntriesBulkAction/internals/CreateTasksByModel.js +6 -6
- package/features/EntriesBulkAction/internals/CreateTasksByModel.js.map +1 -1
- package/features/EntriesBulkAction/internals/ProcessTask.d.ts +1 -1
- package/features/EntriesBulkAction/internals/ProcessTasksByModel.d.ts +3 -3
- package/features/EntriesBulkAction/internals/ProcessTasksByModel.js +3 -3
- package/features/EntriesBulkAction/internals/ProcessTasksByModel.js.map +1 -1
- package/features/EntriesBulkAction/internals/TaskCache.d.ts +4 -4
- package/features/EntriesBulkAction/internals/TaskCache.js +2 -2
- package/features/EntriesBulkAction/internals/TaskCache.js.map +1 -1
- package/graphql/createBulkActionGraphQL.js +21 -18
- package/graphql/createBulkActionGraphQL.js.map +1 -1
- package/graphql/createDefaultGraphQL.d.ts +7 -2
- package/graphql/createDefaultGraphQL.js +41 -39
- package/graphql/createDefaultGraphQL.js.map +1 -1
- package/index.d.ts +3 -7
- package/index.js +2 -46
- package/package.json +20 -15
- package/tasks/EmptyTrashBinTaskDefinition.d.ts +1 -1
- package/features/BulkActionContext/abstractions.d.ts +0 -5
- package/features/BulkActionContext/abstractions.js +0 -5
- package/features/BulkActionContext/abstractions.js.map +0 -1
- package/features/BulkActionContext/index.d.ts +0 -1
- package/features/BulkActionContext/index.js +0 -1
- package/handlers/eventBridgeEventHandler.d.ts +0 -1
- package/handlers/eventBridgeEventHandler.js +0 -28
- package/handlers/eventBridgeEventHandler.js.map +0 -1
- package/handlers/index.d.ts +0 -1
- package/handlers/index.js +0 -9
- package/handlers/index.js.map +0 -1
- package/handlers/setupEventsTenant.d.ts +0 -1
- package/handlers/setupEventsTenant.js +0 -10
- package/handlers/setupEventsTenant.js.map +0 -1
- package/index.js.map +0 -1
- package/tasks/createEmptyTrashBinsTask.d.ts +0 -1
- package/tasks/createEmptyTrashBinsTask.js +0 -8
- package/tasks/createEmptyTrashBinsTask.js.map +0 -1
- package/tasks/index.d.ts +0 -1
- 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,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 {
|
|
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(
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
113
|
-
|
|
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":";;;;;;;;;AAwBO,MAAMA,wBAAwB,CACjCC,YACAC;IAEA,MAAMC,iBAAiBC,eAAe,IAAI,CAACH,WAAW,IAAI;IAC1D,MAAMI,YAAYJ,WAAW,SAAS,IAAIC,kBAAkB,SAAS,IAAI;IACzE,MAAMI,aAAa,CAAC,YAAY,EAAEH,eAAe,OAAO,CAAC;IACzD,MAAMI,gBAAgB,CAAC,eAAe,EAAEJ,eAAe,OAAO,CAAC;IAG/D,MAAMK;QAgBF,YACIC,QAAmC,EACnCC,SAAqC,EACrCC,WAAyC,EACzCC,SAA8B,CAChC;iBAjBc,EAAE,GAAGN;iBACL,KAAK,GAAG,CAAC,oBAAoB,EAAEH,eAAe,kBAAkB,CAAC;iBACjE,aAAa,GAAG;iBAChB,YAAY,GAAG;iBACf,SAAS,GAAG;iBAMZ,WAAW,GAAG;gBAAC;gBAAsB;aAAmB;YAQpE,IAAI,CAAC,QAAQ,GAAGM;YAChB,IAAI,CAAC,SAAS,GAAGC;YACjB,IAAI,CAAC,WAAW,GAAGC;YACnB,IAAI,CAAC,SAAS,GAAGC;QACrB;QAEA,MAAM,IAAI,EACNC,KAAK,EACLC,UAAU,EAIb,EAAE;YACC,IAAI;gBACA,IAAI,CAACD,MAAM,OAAO,EACd,OAAOC,WAAW,QAAQ,CAAC,KAAK,CAAC;gBAGrC,MAAMC,SAASF,MAAM,MAAM,IAAI;gBAE/B,OAAQE;oBACJ,KAAK;wBAAmD;4BACpD,MAAMC,eAAe,IAAIC,oBAAoB,IAAI,CAAC,SAAS,EAAEV;4BAC7D,OAAO,MAAMS,aAAa,OAAO,CAAC;gCAAEH;gCAAOC;4BAAW;wBAC1D;oBACA,KAAK;oBACL,KAAK;wBAAsD;4BACvD,MAAMI,cAAc,IAAIC,mBACpB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,WAAW,EAChBlB,YACAM,eACAF;4BAEJ,OAAO,MAAMa,YAAY,OAAO,CAAC;gCAAEL;gCAAOC;4BAAW;wBACzD;oBACA,KAAK;wBACD,OAAOA,WAAW,QAAQ,CAAC,IAAI,CAC3B,CAAC,iBAAiB,EAAEP,cAAc,oDAAoD,EAClFM,MAAM,OAAO,CAChB,QAAQ,CAAC;oBAGlB;wBACI,OAAOC,WAAW,QAAQ,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAEC,QAAQ;gBACpE;YACJ,EAAE,OAAOK,IAAI;gBACT,OAAON,WAAW,QAAQ,CAAC,KAAK,CAACM,GAAG,OAAO,IAAI;YACnD;QACJ;QAEA,MAAM,OAAO,EAAEC,IAAI,EAAsC,EAAiB;YACtE,MAAM,IAAI,CAAC,OAAO,CAACA;QACvB;QAEA,MAAM,QAAQ,EAAEA,IAAI,EAAsC,EAAE;YACxD,MAAM,IAAI,CAAC,OAAO,CAACA;QACvB;QAEA,MAAM,QAAQ,EAAEA,IAAI,EAAsC,EAAE;YACxD,MAAM,IAAI,CAAC,OAAO,CAACA;QACvB;QAEA,MAAM,gBAAgB,EAAEA,IAAI,EAAsC,EAAE;YAChE,MAAM,IAAI,CAAC,OAAO,CAACA;QACvB;QAEA,MAAM,QAAQA,IAAyB,EAAE;YACrC,MAAMC,oBAAoB,IAAIC;YAC9B,IAAI;gBACA,MAAMD,kBAAkB,OAAO,CAAC;oBAAE,WAAW,IAAI,CAAC,SAAS;oBAAED;gBAAK;YACtE,EAAE,OAAOD,IAAI;gBACTI,QAAQ,KAAK,CAAC,CAAC,sBAAsB,EAAElB,WAAW,cAAc,CAAC,EAAEc;YACvE;QACJ;IACJ;IAGA,MAAMK;QAaF,YAAYhB,QAAmC,CAAE;iBATjC,EAAE,GAAGF;iBACL,KAAK,GAAG,CAAC,uBAAuB,EAAEJ,eAAe,SAAS,CAAC;iBAC3D,aAAa,GAAG;iBAChB,YAAY,GAAG;iBACf,SAAS,GAAG;iBAGZ,WAAW,GAAG;gBAAC;gBAAsB;aAAmB;YAGpE,IAAI,CAAC,QAAQ,GAAGM;QACpB;QAEA,MAAM,IAAI,EACNI,KAAK,EACLC,UAAU,EACoE,EAAE;YAChF,IAAI;gBACA,MAAMY,cAAc,IAAIC,YAAY1B,YAAY,IAAI,CAAC,QAAQ;gBAC7D,OAAO,MAAMyB,YAAY,OAAO,CAAC;oBAAEb;oBAAOC;gBAAW;YACzD,EAAE,OAAOM,IAAI;gBACT,OAAON,WAAW,QAAQ,CAAC,KAAK,CAC5BM,GAAG,OAAO,IAAI;YAEtB;QACJ;IACJ;IAEA,MAAMQ,eAAeC,eAAe,oBAAoB,CAAC;QACrD,gBAAgBrB;QAChB,cAAc;YAACsB;YAAiBC;YAAkBC;YAAoBC;SAAU;IACpF;IAEA,MAAMC,kBAAkBL,eAAe,oBAAoB,CAAC;QACxD,gBAAgBJ;QAChB,cAAc;YAACK;SAAgB;IACnC;IAEA,OAAOK,cAAc;QACjB,MAAM,CAAC,4BAA4B,EAAEhC,gBAAgB;QACrD,UAASiC,SAAS;YACdA,UAAU,QAAQ,CAACR;YACnBQ,UAAU,QAAQ,CAACF;QACvB;IACJ;AACJ"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { ITask,
|
|
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
|
-
|
|
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 {
|
|
5
|
-
const { items: childTasks } = await
|
|
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
|
|
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(
|
|
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
|
|
22
|
+
await tasksCrud.deleteLog(log.id);
|
|
23
23
|
if (!deletedChildTaskLogIdList.includes(log.task)) deletedChildTaskLogIdList.push(log.task);
|
|
24
24
|
}
|
|
25
|
-
await this.deleteTasks(
|
|
25
|
+
await this.deleteTasks(tasksCrud, deletedChildTaskLogIdList);
|
|
26
26
|
}
|
|
27
|
-
async deleteTasks(
|
|
28
|
-
for (const taskId of taskIds)await
|
|
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,
|
|
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 {
|
|
4
|
-
import {
|
|
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
|
|
12
|
+
private readonly triggerTask;
|
|
13
13
|
private readonly getModel;
|
|
14
|
-
constructor(
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 {
|
|
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").
|
|
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
|
|
9
|
+
private readonly listTasks;
|
|
10
10
|
private readonly taskDefinition;
|
|
11
|
-
constructor(
|
|
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(
|
|
5
|
-
this.
|
|
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.
|
|
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 {
|
|
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 {
|
|
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
|
|
18
|
-
* @param {
|
|
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(
|
|
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(
|
|
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
|
|
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 {
|
|
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 {
|
|
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.
|
|
10
|
+
const tenant = context.container.resolve(TenantContext).getTenant();
|
|
7
11
|
if (!await isHeadlessCmsReady(context)) return;
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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.
|
|
30
|
-
const response = await context.
|
|
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.
|
|
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.
|
|
52
|
-
|
|
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 {
|
|
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
|
-
|
|
3
|
-
|
|
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 {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
4
|
-
export {
|
|
5
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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.
|
|
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-
|
|
21
|
-
"@webiny/
|
|
22
|
-
"@webiny/
|
|
23
|
-
"@webiny/
|
|
24
|
-
"@webiny/handler-aws": "6.
|
|
25
|
-
"@webiny/
|
|
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.
|
|
29
|
-
"@webiny/api-core": "6.
|
|
30
|
-
"@webiny/
|
|
31
|
-
"@webiny/
|
|
32
|
-
"@webiny/
|
|
33
|
-
"@webiny/
|
|
34
|
-
"@webiny/
|
|
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": "
|
|
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: ("
|
|
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 +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"}
|
package/handlers/index.d.ts
DELETED
|
@@ -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
|
package/handlers/index.js.map
DELETED
|
@@ -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";
|