@webiny/api-headless-cms-bulk-actions 6.6.0-alpha.1 → 6.6.0-alpha.3
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/HcmsBulkActionsFeature.js +1 -1
- package/HcmsBulkActionsFeature.js.map +1 -1
- package/features/EntriesBulkAction/createBulkActionTasks.d.ts +22 -12
- package/features/EntriesBulkAction/createBulkActionTasks.js +47 -29
- package/features/EntriesBulkAction/createBulkActionTasks.js.map +1 -1
- package/package.json +15 -15
- package/tasks/{EmptyTrashBinTaskDefinition.d.ts → EmptyTrashBinTask.d.ts} +9 -4
- package/tasks/{EmptyTrashBinTaskDefinition.js → EmptyTrashBinTask.js} +24 -15
- package/tasks/EmptyTrashBinTask.js.map +1 -0
- package/tasks/EmptyTrashBinTaskDefinition.js.map +0 -1
|
@@ -7,7 +7,7 @@ import { MoveToTrashBulkActionFeature } from "./features/MoveToTrashBulkAction/f
|
|
|
7
7
|
import { PublishEntriesBulkActionFeature } from "./features/PublishEntriesBulkAction/feature.js";
|
|
8
8
|
import { UnpublishEntriesBulkActionFeature } from "./features/UnpublishEntriesBulkAction/feature.js";
|
|
9
9
|
import { RestoreEntriesBulkActionFeature } from "./features/RestoreEntriesBulkAction/feature.js";
|
|
10
|
-
import { EmptyTrashBinTaskDefinition } from "./tasks/
|
|
10
|
+
import { EmptyTrashBinTaskDefinition } from "./tasks/EmptyTrashBinTask.js";
|
|
11
11
|
import { BulkActionsGraphQLSchema } from "./graphql/BulkActionsGraphQLSchema.js";
|
|
12
12
|
const HcmsBulkActionsFeature = createFeature({
|
|
13
13
|
name: "HcmsBulkActions",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HcmsBulkActionsFeature.js","sources":["../src/HcmsBulkActionsFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { EntriesBulkActionConfig } from \"~/features/EntriesBulkAction/abstractions.js\";\nimport {\n BulkActionListTaskDefinition,\n BulkActionProcessTaskDefinition\n} 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/
|
|
1
|
+
{"version":3,"file":"HcmsBulkActionsFeature.js","sources":["../src/HcmsBulkActionsFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { EntriesBulkActionConfig } from \"~/features/EntriesBulkAction/abstractions.js\";\nimport {\n BulkActionListTaskDefinition,\n BulkActionProcessTaskDefinition\n} 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/EmptyTrashBinTask.js\";\nimport { BulkActionsGraphQLSchema } from \"~/graphql/BulkActionsGraphQLSchema.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 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 container.register(BulkActionListTaskDefinition);\n container.register(BulkActionProcessTaskDefinition);\n container.register(BulkActionsGraphQLSchema);\n }\n});\n"],"names":["HcmsBulkActionsFeature","createFeature","container","config","EntriesBulkActionConfig","DeleteEntriesBulkActionFeature","MoveToFolderBulkActionFeature","MoveToTrashBulkActionFeature","PublishEntriesBulkActionFeature","UnpublishEntriesBulkActionFeature","RestoreEntriesBulkActionFeature","EmptyTrashBinTaskDefinition","BulkActionListTaskDefinition","BulkActionProcessTaskDefinition","BulkActionsGraphQLSchema"],"mappings":";;;;;;;;;;;AAmBO,MAAMA,yBAAyBC,cAAwD;IAC1F,MAAM;IACN,UAASC,SAAS,EAAEC,MAAM;QACtBD,UAAU,gBAAgB,CAACE,yBAAyB;YAChD,WAAWD,QAAQ,aAAa;QACpC;QAEAE,+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;QACnBT,UAAU,QAAQ,CAACU;QACnBV,UAAU,QAAQ,CAACW;QACnBX,UAAU,QAAQ,CAACY;IACvB;AACJ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
1
|
+
import { TaskDefinition, TaskHandler } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
2
2
|
import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
|
|
3
3
|
import { ListTasksUseCase, TriggerTaskUseCase, TasksCrud } from "@webiny/background-tasks/api";
|
|
4
4
|
import type { IBulkActionOperationByModelInput, IBulkActionOperationByModelOutput, IBulkActionOperationInput, IBulkActionOperationOutput } from "../../types.js";
|
|
@@ -6,38 +6,48 @@ import { EntriesBulkActionConfig } from "./abstractions.js";
|
|
|
6
6
|
import type { Container } from "@webiny/di";
|
|
7
7
|
export declare const BULK_ACTION_LIST_TASK_ID = "hcmsBulkListEntries";
|
|
8
8
|
export declare const BULK_ACTION_PROCESS_TASK_ID = "hcmsBulkProcessEntries";
|
|
9
|
-
declare class
|
|
9
|
+
declare class BulkActionListTaskHandlerImpl implements TaskHandler.Interface<IBulkActionOperationByModelInput, IBulkActionOperationByModelOutput> {
|
|
10
10
|
private readonly container;
|
|
11
11
|
private readonly getModel;
|
|
12
12
|
private readonly listTasks;
|
|
13
13
|
private readonly triggerTask;
|
|
14
14
|
private readonly tasksCrud;
|
|
15
15
|
private readonly bulkActionsConfig;
|
|
16
|
+
constructor(container: Container, getModel: GetModelUseCase.Interface, listTasks: ListTasksUseCase.Interface, triggerTask: TriggerTaskUseCase.Interface, tasksCrud: TasksCrud.Interface, bulkActionsConfig: EntriesBulkActionConfig.Interface);
|
|
17
|
+
run({ input, controller, definition }: TaskHandler.RunParams<IBulkActionOperationByModelInput, IBulkActionOperationByModelOutput>): Promise<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskResultAborted | import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskResultError | TaskDefinition.ResultContinue<IBulkActionOperationByModelInput> | TaskDefinition.ResultDone<IBulkActionOperationByModelOutput>>;
|
|
18
|
+
onDone({ task }: TaskHandler.LifecycleHookParams): Promise<void>;
|
|
19
|
+
onError({ task }: TaskHandler.LifecycleHookParams): Promise<void>;
|
|
20
|
+
onAbort({ task }: TaskHandler.LifecycleHookParams): Promise<void>;
|
|
21
|
+
onMaxIterations({ task }: TaskHandler.LifecycleHookParams): Promise<void>;
|
|
22
|
+
cleanup(task: TaskDefinition.Task): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
declare class BulkActionListTask implements TaskDefinition.Interface {
|
|
16
25
|
readonly id = "hcmsBulkListEntries";
|
|
17
26
|
readonly title = "Headless CMS: list entries for bulk action";
|
|
18
27
|
readonly maxIterations = 500;
|
|
19
28
|
readonly databaseLogs = false;
|
|
20
29
|
readonly isPrivate = true;
|
|
21
30
|
readonly selfCleanup: ("onAbort" | "onSuccess")[];
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
onError({ task }: TaskDefinition.LifecycleHookParams): Promise<void>;
|
|
26
|
-
onAbort({ task }: TaskDefinition.LifecycleHookParams): Promise<void>;
|
|
27
|
-
onMaxIterations({ task }: TaskDefinition.LifecycleHookParams): Promise<void>;
|
|
28
|
-
cleanup(task: TaskDefinition.Task): Promise<void>;
|
|
31
|
+
handler: typeof BulkActionListTaskHandlerImpl & {
|
|
32
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskHandler<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskOutput>>;
|
|
33
|
+
};
|
|
29
34
|
}
|
|
30
|
-
declare class
|
|
35
|
+
declare class BulkActionProcessTaskHandlerImpl implements TaskHandler.Interface<IBulkActionOperationInput, IBulkActionOperationOutput> {
|
|
31
36
|
private readonly container;
|
|
32
37
|
private readonly getModel;
|
|
38
|
+
constructor(container: Container, getModel: GetModelUseCase.Interface);
|
|
39
|
+
run({ input, controller, definition }: TaskHandler.RunParams<IBulkActionOperationInput, IBulkActionOperationOutput>): Promise<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskResultAborted | import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskResultError | TaskDefinition.ResultContinue<IBulkActionOperationInput> | TaskDefinition.ResultDone<IBulkActionOperationOutput>>;
|
|
40
|
+
}
|
|
41
|
+
declare class BulkActionProcessTask implements TaskDefinition.Interface {
|
|
33
42
|
readonly id = "hcmsBulkProcessEntries";
|
|
34
43
|
readonly title = "Headless CMS: process entries for bulk action";
|
|
35
44
|
readonly maxIterations = 2;
|
|
36
45
|
readonly databaseLogs = false;
|
|
37
46
|
readonly isPrivate = true;
|
|
38
47
|
readonly selfCleanup: ("onAbort" | "onSuccess")[];
|
|
39
|
-
|
|
40
|
-
|
|
48
|
+
handler: typeof BulkActionProcessTaskHandlerImpl & {
|
|
49
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskHandler<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskOutput>>;
|
|
50
|
+
};
|
|
41
51
|
}
|
|
42
52
|
export declare const BulkActionListTaskDefinition: typeof BulkActionListTask & {
|
|
43
53
|
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskDefinition<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskOutput>>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
1
|
+
import { TaskDefinition, TaskHandler } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
2
2
|
import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
|
|
3
3
|
import { ListTasksUseCase, TasksCrud, TriggerTaskUseCase } from "@webiny/background-tasks/api";
|
|
4
4
|
import { BulkActionOperationByModelAction } from "../../types.js";
|
|
@@ -17,7 +17,7 @@ const resolveBulkAction = (container, actionName)=>{
|
|
|
17
17
|
if (!action) throw new Error(`Unknown bulk action: "${actionName}"`);
|
|
18
18
|
return action;
|
|
19
19
|
};
|
|
20
|
-
class
|
|
20
|
+
class BulkActionListTaskHandlerImpl {
|
|
21
21
|
constructor(container, getModel, listTasks, triggerTask, tasksCrud, bulkActionsConfig){
|
|
22
22
|
this.container = container;
|
|
23
23
|
this.getModel = getModel;
|
|
@@ -25,15 +25,6 @@ class BulkActionListTask {
|
|
|
25
25
|
this.triggerTask = triggerTask;
|
|
26
26
|
this.tasksCrud = tasksCrud;
|
|
27
27
|
this.bulkActionsConfig = bulkActionsConfig;
|
|
28
|
-
this.id = BULK_ACTION_LIST_TASK_ID;
|
|
29
|
-
this.title = "Headless CMS: list entries for bulk action";
|
|
30
|
-
this.maxIterations = 500;
|
|
31
|
-
this.databaseLogs = false;
|
|
32
|
-
this.isPrivate = true;
|
|
33
|
-
this.selfCleanup = [
|
|
34
|
-
"onSuccess",
|
|
35
|
-
"onAbort"
|
|
36
|
-
];
|
|
37
28
|
}
|
|
38
29
|
async run({ input, controller, definition }) {
|
|
39
30
|
try {
|
|
@@ -95,19 +86,35 @@ class BulkActionListTask {
|
|
|
95
86
|
}
|
|
96
87
|
}
|
|
97
88
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
89
|
+
const BulkActionListTaskHandler = TaskHandler.createImplementation({
|
|
90
|
+
implementation: BulkActionListTaskHandlerImpl,
|
|
91
|
+
dependencies: [
|
|
92
|
+
RequestContainer,
|
|
93
|
+
GetModelUseCase,
|
|
94
|
+
ListTasksUseCase,
|
|
95
|
+
TriggerTaskUseCase,
|
|
96
|
+
TasksCrud,
|
|
97
|
+
EntriesBulkActionConfig
|
|
98
|
+
]
|
|
99
|
+
});
|
|
100
|
+
class BulkActionListTask {
|
|
101
|
+
constructor(){
|
|
102
|
+
this.id = BULK_ACTION_LIST_TASK_ID;
|
|
103
|
+
this.title = "Headless CMS: list entries for bulk action";
|
|
104
|
+
this.maxIterations = 500;
|
|
105
105
|
this.databaseLogs = false;
|
|
106
106
|
this.isPrivate = true;
|
|
107
107
|
this.selfCleanup = [
|
|
108
108
|
"onSuccess",
|
|
109
109
|
"onAbort"
|
|
110
110
|
];
|
|
111
|
+
this.handler = BulkActionListTaskHandler;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
class BulkActionProcessTaskHandlerImpl {
|
|
115
|
+
constructor(container, getModel){
|
|
116
|
+
this.container = container;
|
|
117
|
+
this.getModel = getModel;
|
|
111
118
|
}
|
|
112
119
|
async run({ input, controller, definition }) {
|
|
113
120
|
try {
|
|
@@ -124,23 +131,34 @@ class BulkActionProcessTask {
|
|
|
124
131
|
}
|
|
125
132
|
}
|
|
126
133
|
}
|
|
127
|
-
const
|
|
128
|
-
implementation:
|
|
134
|
+
const BulkActionProcessTaskHandler = TaskHandler.createImplementation({
|
|
135
|
+
implementation: BulkActionProcessTaskHandlerImpl,
|
|
129
136
|
dependencies: [
|
|
130
137
|
RequestContainer,
|
|
131
|
-
GetModelUseCase
|
|
132
|
-
ListTasksUseCase,
|
|
133
|
-
TriggerTaskUseCase,
|
|
134
|
-
TasksCrud,
|
|
135
|
-
EntriesBulkActionConfig
|
|
138
|
+
GetModelUseCase
|
|
136
139
|
]
|
|
137
140
|
});
|
|
141
|
+
class BulkActionProcessTask {
|
|
142
|
+
constructor(){
|
|
143
|
+
this.id = BULK_ACTION_PROCESS_TASK_ID;
|
|
144
|
+
this.title = "Headless CMS: process entries for bulk action";
|
|
145
|
+
this.maxIterations = 2;
|
|
146
|
+
this.databaseLogs = false;
|
|
147
|
+
this.isPrivate = true;
|
|
148
|
+
this.selfCleanup = [
|
|
149
|
+
"onSuccess",
|
|
150
|
+
"onAbort"
|
|
151
|
+
];
|
|
152
|
+
this.handler = BulkActionProcessTaskHandler;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const BulkActionListTaskDefinition = TaskDefinition.createImplementation({
|
|
156
|
+
implementation: BulkActionListTask,
|
|
157
|
+
dependencies: []
|
|
158
|
+
});
|
|
138
159
|
const BulkActionProcessTaskDefinition = TaskDefinition.createImplementation({
|
|
139
160
|
implementation: BulkActionProcessTask,
|
|
140
|
-
dependencies: [
|
|
141
|
-
RequestContainer,
|
|
142
|
-
GetModelUseCase
|
|
143
|
-
]
|
|
161
|
+
dependencies: []
|
|
144
162
|
});
|
|
145
163
|
export { BULK_ACTION_LIST_TASK_ID, BULK_ACTION_PROCESS_TASK_ID, BulkActionListTaskDefinition, BulkActionProcessTaskDefinition };
|
|
146
164
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/EntriesBulkAction/createBulkActionTasks.js","sources":["../../../src/features/EntriesBulkAction/createBulkActionTasks.ts"],"sourcesContent":["import { 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 { BulkActionOperationByModelAction } 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\";\nimport type { Container } from \"@webiny/di\";\n\nexport const BULK_ACTION_LIST_TASK_ID = \"hcmsBulkListEntries\";\nexport const BULK_ACTION_PROCESS_TASK_ID = \"hcmsBulkProcessEntries\";\n\nconst resolveBulkAction = (container: Container, actionName: string) => {\n const bulkActions = container.resolveAll(EntriesBulkAction);\n const action = bulkActions.find(a => BulkActionName.from(a.name) === actionName);\n if (!action) {\n throw new Error(`Unknown bulk action: \"${actionName}\"`);\n }\n return action;\n};\n\nclass BulkActionListTask implements TaskDefinition.Interface<\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput\n> {\n public readonly id = BULK_ACTION_LIST_TASK_ID;\n public readonly title = \"Headless CMS: list entries for bulk action\";\n public readonly maxIterations = 500;\n public readonly databaseLogs = false;\n public readonly isPrivate = true;\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n constructor(\n private readonly container: Container,\n private readonly getModel: GetModelUseCase.Interface,\n private readonly listTasks: ListTasksUseCase.Interface,\n private readonly triggerTask: TriggerTaskUseCase.Interface,\n private readonly tasksCrud: TasksCrud.Interface,\n private readonly bulkActionsConfig: EntriesBulkActionConfig.Interface\n ) {}\n\n async run({\n input,\n controller,\n definition\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 if (!input.actionName) {\n return controller.response.error(`Missing \"actionName\" in the input.`);\n }\n\n const bulkAction = resolveBulkAction(this.container, input.actionName);\n const batchSize = bulkAction.batchSize ?? this.bulkActionsConfig.batchSize ?? 100;\n const action = input.action ?? BulkActionOperationByModelAction.CREATE_SUBTASKS;\n\n switch (action) {\n case BulkActionOperationByModelAction.PROCESS_SUBTASKS: {\n const processTasks = new ProcessTasksByModel(\n this.listTasks,\n BULK_ACTION_PROCESS_TASK_ID\n );\n return await processTasks.execute({ input, controller, definition });\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 BULK_ACTION_PROCESS_TASK_ID,\n batchSize\n );\n return await createTasks.execute({ input, controller, definition });\n }\n case BulkActionOperationByModelAction.END_TASK: {\n return controller.response.done(\n `Task done: bulk action \"${input.actionName}\" has been successfully processed for entries from \"${input.modelId}\" model.`\n );\n }\n default:\n return controller.response.error(`Unknown action: ${action}`);\n }\n } catch (ex) {\n return controller.response.error(\n ex.message ?? \"Error while executing bulk action list task\"\n );\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 bulk action list child tasks.`, ex);\n }\n }\n}\n\nclass BulkActionProcessTask implements TaskDefinition.Interface<\n IBulkActionOperationInput,\n IBulkActionOperationOutput\n> {\n public readonly id = BULK_ACTION_PROCESS_TASK_ID;\n public readonly title = \"Headless CMS: process entries for bulk action\";\n public readonly maxIterations = 2;\n public readonly databaseLogs = false;\n public readonly isPrivate = true;\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n constructor(\n private readonly container: Container,\n private readonly getModel: GetModelUseCase.Interface\n ) {}\n\n async run({\n input,\n controller,\n definition\n }: TaskDefinition.RunParams<IBulkActionOperationInput, IBulkActionOperationOutput>) {\n try {\n if (!input.actionName) {\n return controller.response.error(`Missing \"actionName\" in the input.`);\n }\n\n const bulkAction = resolveBulkAction(this.container, input.actionName);\n const processTask = new ProcessTask(bulkAction, this.getModel);\n return await processTask.execute({ input, controller, definition });\n } catch (ex) {\n return controller.response.error(\n ex.message ?? \"Error while executing bulk action process task\"\n );\n }\n }\n}\n\nimport { RequestContainer } from \"@webiny/event-handler-core\";\n\nexport const BulkActionListTaskDefinition = TaskDefinition.createImplementation({\n implementation: BulkActionListTask,\n dependencies: [\n RequestContainer,\n GetModelUseCase,\n ListTasksUseCase,\n TriggerTaskUseCase,\n TasksCrud,\n EntriesBulkActionConfig\n ]\n});\n\nexport const BulkActionProcessTaskDefinition = TaskDefinition.createImplementation({\n implementation: BulkActionProcessTask,\n dependencies: [RequestContainer, GetModelUseCase]\n});\n"],"names":["BULK_ACTION_LIST_TASK_ID","BULK_ACTION_PROCESS_TASK_ID","resolveBulkAction","container","actionName","bulkActions","EntriesBulkAction","action","a","BulkActionName","Error","BulkActionListTask","getModel","listTasks","triggerTask","tasksCrud","bulkActionsConfig","input","controller","definition","bulkAction","batchSize","BulkActionOperationByModelAction","processTasks","ProcessTasksByModel","createTasks","CreateTasksByModel","ex","task","childTasksCleanup","ChildTasksCleanup","console","BulkActionProcessTask","processTask","ProcessTask","BulkActionListTaskDefinition","TaskDefinition","RequestContainer","GetModelUseCase","ListTasksUseCase","TriggerTaskUseCase","TasksCrud","EntriesBulkActionConfig","BulkActionProcessTaskDefinition"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"features/EntriesBulkAction/createBulkActionTasks.js","sources":["../../../src/features/EntriesBulkAction/createBulkActionTasks.ts"],"sourcesContent":["import {\n TaskDefinition,\n TaskHandler\n} 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 { BulkActionOperationByModelAction } 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\";\nimport type { Container } from \"@webiny/di\";\nimport { RequestContainer } from \"@webiny/event-handler-core\";\n\nexport const BULK_ACTION_LIST_TASK_ID = \"hcmsBulkListEntries\";\nexport const BULK_ACTION_PROCESS_TASK_ID = \"hcmsBulkProcessEntries\";\n\nconst resolveBulkAction = (container: Container, actionName: string) => {\n const bulkActions = container.resolveAll(EntriesBulkAction);\n const action = bulkActions.find(a => BulkActionName.from(a.name) === actionName);\n if (!action) {\n throw new Error(`Unknown bulk action: \"${actionName}\"`);\n }\n return action;\n};\n\nclass BulkActionListTaskHandlerImpl implements TaskHandler.Interface<\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput\n> {\n constructor(\n private readonly container: Container,\n private readonly getModel: GetModelUseCase.Interface,\n private readonly listTasks: ListTasksUseCase.Interface,\n private readonly triggerTask: TriggerTaskUseCase.Interface,\n private readonly tasksCrud: TasksCrud.Interface,\n private readonly bulkActionsConfig: EntriesBulkActionConfig.Interface\n ) {}\n\n async run({\n input,\n controller,\n definition\n }: TaskHandler.RunParams<IBulkActionOperationByModelInput, IBulkActionOperationByModelOutput>) {\n try {\n if (!input.modelId) {\n return controller.response.error(`Missing \"modelId\" in the input.`);\n }\n if (!input.actionName) {\n return controller.response.error(`Missing \"actionName\" in the input.`);\n }\n\n const bulkAction = resolveBulkAction(this.container, input.actionName);\n const batchSize = bulkAction.batchSize ?? this.bulkActionsConfig.batchSize ?? 100;\n const action = input.action ?? BulkActionOperationByModelAction.CREATE_SUBTASKS;\n\n switch (action) {\n case BulkActionOperationByModelAction.PROCESS_SUBTASKS: {\n const processTasks = new ProcessTasksByModel(\n this.listTasks,\n BULK_ACTION_PROCESS_TASK_ID\n );\n return await processTasks.execute({ input, controller, definition });\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 BULK_ACTION_PROCESS_TASK_ID,\n batchSize\n );\n return await createTasks.execute({ input, controller, definition });\n }\n case BulkActionOperationByModelAction.END_TASK: {\n return controller.response.done(\n `Task done: bulk action \"${input.actionName}\" has been successfully processed for entries from \"${input.modelId}\" model.`\n );\n }\n default:\n return controller.response.error(`Unknown action: ${action}`);\n }\n } catch (ex) {\n return controller.response.error(\n ex.message ?? \"Error while executing bulk action list task\"\n );\n }\n }\n\n async onDone({ task }: TaskHandler.LifecycleHookParams): Promise<void> {\n await this.cleanup(task);\n }\n\n async onError({ task }: TaskHandler.LifecycleHookParams) {\n await this.cleanup(task);\n }\n\n async onAbort({ task }: TaskHandler.LifecycleHookParams) {\n await this.cleanup(task);\n }\n\n async onMaxIterations({ task }: TaskHandler.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 bulk action list child tasks.`, ex);\n }\n }\n}\n\nconst BulkActionListTaskHandler = TaskHandler.createImplementation({\n implementation: BulkActionListTaskHandlerImpl,\n dependencies: [\n RequestContainer,\n GetModelUseCase,\n ListTasksUseCase,\n TriggerTaskUseCase,\n TasksCrud,\n EntriesBulkActionConfig\n ]\n});\n\nclass BulkActionListTask implements TaskDefinition.Interface {\n public readonly id = BULK_ACTION_LIST_TASK_ID;\n public readonly title = \"Headless CMS: list entries for bulk action\";\n public readonly maxIterations = 500;\n public readonly databaseLogs = false;\n public readonly isPrivate = true;\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n handler = BulkActionListTaskHandler;\n}\n\nclass BulkActionProcessTaskHandlerImpl implements TaskHandler.Interface<\n IBulkActionOperationInput,\n IBulkActionOperationOutput\n> {\n constructor(\n private readonly container: Container,\n private readonly getModel: GetModelUseCase.Interface\n ) {}\n\n async run({\n input,\n controller,\n definition\n }: TaskHandler.RunParams<IBulkActionOperationInput, IBulkActionOperationOutput>) {\n try {\n if (!input.actionName) {\n return controller.response.error(`Missing \"actionName\" in the input.`);\n }\n\n const bulkAction = resolveBulkAction(this.container, input.actionName);\n const processTask = new ProcessTask(bulkAction, this.getModel);\n return await processTask.execute({ input, controller, definition });\n } catch (ex) {\n return controller.response.error(\n ex.message ?? \"Error while executing bulk action process task\"\n );\n }\n }\n}\n\nconst BulkActionProcessTaskHandler = TaskHandler.createImplementation({\n implementation: BulkActionProcessTaskHandlerImpl,\n dependencies: [RequestContainer, GetModelUseCase]\n});\n\nclass BulkActionProcessTask implements TaskDefinition.Interface {\n public readonly id = BULK_ACTION_PROCESS_TASK_ID;\n public readonly title = \"Headless CMS: process entries for bulk action\";\n public readonly maxIterations = 2;\n public readonly databaseLogs = false;\n public readonly isPrivate = true;\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n handler = BulkActionProcessTaskHandler;\n}\n\nexport const BulkActionListTaskDefinition = TaskDefinition.createImplementation({\n implementation: BulkActionListTask,\n dependencies: []\n});\n\nexport const BulkActionProcessTaskDefinition = TaskDefinition.createImplementation({\n implementation: BulkActionProcessTask,\n dependencies: []\n});\n"],"names":["BULK_ACTION_LIST_TASK_ID","BULK_ACTION_PROCESS_TASK_ID","resolveBulkAction","container","actionName","bulkActions","EntriesBulkAction","action","a","BulkActionName","Error","BulkActionListTaskHandlerImpl","getModel","listTasks","triggerTask","tasksCrud","bulkActionsConfig","input","controller","definition","bulkAction","batchSize","BulkActionOperationByModelAction","processTasks","ProcessTasksByModel","createTasks","CreateTasksByModel","ex","task","childTasksCleanup","ChildTasksCleanup","console","BulkActionListTaskHandler","TaskHandler","RequestContainer","GetModelUseCase","ListTasksUseCase","TriggerTaskUseCase","TasksCrud","EntriesBulkActionConfig","BulkActionListTask","BulkActionProcessTaskHandlerImpl","processTask","ProcessTask","BulkActionProcessTaskHandler","BulkActionProcessTask","BulkActionListTaskDefinition","TaskDefinition","BulkActionProcessTaskDefinition"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/api-headless-cms-bulk-actions",
|
|
3
|
-
"version": "6.6.0-alpha.
|
|
3
|
+
"version": "6.6.0-alpha.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./index.js",
|
|
@@ -17,23 +17,23 @@
|
|
|
17
17
|
},
|
|
18
18
|
"license": "MIT",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@webiny/api-graphql": "6.6.0-alpha.
|
|
21
|
-
"@webiny/api-headless-cms": "6.6.0-alpha.
|
|
22
|
-
"@webiny/background-tasks": "6.6.0-alpha.
|
|
23
|
-
"@webiny/event-handler-core": "6.6.0-alpha.
|
|
24
|
-
"@webiny/feature": "6.6.0-alpha.
|
|
25
|
-
"@webiny/handler": "6.6.0-alpha.
|
|
26
|
-
"@webiny/utils": "6.6.0-alpha.
|
|
20
|
+
"@webiny/api-graphql": "6.6.0-alpha.3",
|
|
21
|
+
"@webiny/api-headless-cms": "6.6.0-alpha.3",
|
|
22
|
+
"@webiny/background-tasks": "6.6.0-alpha.3",
|
|
23
|
+
"@webiny/event-handler-core": "6.6.0-alpha.3",
|
|
24
|
+
"@webiny/feature": "6.6.0-alpha.3",
|
|
25
|
+
"@webiny/handler": "6.6.0-alpha.3",
|
|
26
|
+
"@webiny/utils": "6.6.0-alpha.3"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@webiny/api": "6.6.0-alpha.
|
|
30
|
-
"@webiny/api-core": "6.6.0-alpha.
|
|
31
|
-
"@webiny/api-graphql": "6.6.0-alpha.
|
|
32
|
-
"@webiny/api-headless-cms-testing": "6.6.0-alpha.
|
|
33
|
-
"@webiny/build-tools": "6.6.0-alpha.
|
|
29
|
+
"@webiny/api": "6.6.0-alpha.3",
|
|
30
|
+
"@webiny/api-core": "6.6.0-alpha.3",
|
|
31
|
+
"@webiny/api-graphql": "6.6.0-alpha.3",
|
|
32
|
+
"@webiny/api-headless-cms-testing": "6.6.0-alpha.3",
|
|
33
|
+
"@webiny/build-tools": "6.6.0-alpha.3",
|
|
34
34
|
"@webiny/di": "1.1.0",
|
|
35
|
-
"@webiny/plugins": "6.6.0-alpha.
|
|
36
|
-
"@webiny/wcp": "6.6.0-alpha.
|
|
35
|
+
"@webiny/plugins": "6.6.0-alpha.3",
|
|
36
|
+
"@webiny/wcp": "6.6.0-alpha.3",
|
|
37
37
|
"graphql": "16.14.2",
|
|
38
38
|
"typescript": "7.0.2",
|
|
39
39
|
"vitest": "4.1.11"
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import type { IEmptyTrashBinsInput, IEmptyTrashBinsOutput } from "../types.js";
|
|
2
|
-
import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
2
|
+
import { TaskDefinition, TaskHandler } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
3
3
|
import { ListTenantsUseCase } from "@webiny/api-core/features/tenancy/ListTenants/index.js";
|
|
4
4
|
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
5
5
|
import { ListModelsUseCase } from "@webiny/api-headless-cms/features/contentModel/ListModels/index.js";
|
|
6
6
|
import { DeleteEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js";
|
|
7
7
|
import { ListDeletedEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js";
|
|
8
|
-
declare class
|
|
8
|
+
declare class EmptyTrashBinTaskHandlerImpl implements TaskHandler.Interface<IEmptyTrashBinsInput, IEmptyTrashBinsOutput> {
|
|
9
9
|
private tenantContext;
|
|
10
10
|
private listTenants;
|
|
11
11
|
private listModels;
|
|
12
12
|
private listDeletedEntries;
|
|
13
13
|
private deleteEntry;
|
|
14
|
+
constructor(tenantContext: TenantContext.Interface, listTenants: ListTenantsUseCase.Interface, listModels: ListModelsUseCase.Interface, listDeletedEntries: ListDeletedEntriesUseCase.Interface, deleteEntry: DeleteEntryUseCase.Interface);
|
|
15
|
+
run(params: TaskHandler.RunParams<IEmptyTrashBinsInput, IEmptyTrashBinsOutput>): Promise<TaskDefinition.Result<IEmptyTrashBinsInput, IEmptyTrashBinsOutput>>;
|
|
16
|
+
}
|
|
17
|
+
declare class EmptyTrashBinTask implements TaskDefinition.Interface {
|
|
14
18
|
readonly isPrivate = true;
|
|
15
19
|
readonly id = "hcmsEntriesEmptyTrashBins";
|
|
16
20
|
readonly title = "Headless CMS - Empty all trash bins";
|
|
@@ -18,8 +22,9 @@ declare class EmptyTrashBinTask implements TaskDefinition.Interface<IEmptyTrashB
|
|
|
18
22
|
readonly maxIterations = 120;
|
|
19
23
|
readonly databaseLogs = false;
|
|
20
24
|
readonly selfCleanup: ("onAbort" | "onSuccess")[];
|
|
21
|
-
|
|
22
|
-
|
|
25
|
+
handler: typeof EmptyTrashBinTaskHandlerImpl & {
|
|
26
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskHandler<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
|
|
27
|
+
};
|
|
23
28
|
}
|
|
24
29
|
export declare const EmptyTrashBinTaskDefinition: typeof EmptyTrashBinTask & {
|
|
25
30
|
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskDefinition<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
1
|
+
import { TaskDefinition, TaskHandler } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
2
2
|
import { ListTenantsUseCase } from "@webiny/api-core/features/tenancy/ListTenants/index.js";
|
|
3
3
|
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
4
4
|
import { ListModelsUseCase } from "@webiny/api-headless-cms/features/contentModel/ListModels/index.js";
|
|
@@ -11,23 +11,13 @@ const calculateDateTimeString = ()=>{
|
|
|
11
11
|
currentDate.setDate(currentDate.getDate() - retentionPeriod);
|
|
12
12
|
return currentDate.toISOString();
|
|
13
13
|
};
|
|
14
|
-
class
|
|
14
|
+
class EmptyTrashBinTaskHandlerImpl {
|
|
15
15
|
constructor(tenantContext, listTenants, listModels, listDeletedEntries, deleteEntry){
|
|
16
16
|
this.tenantContext = tenantContext;
|
|
17
17
|
this.listTenants = listTenants;
|
|
18
18
|
this.listModels = listModels;
|
|
19
19
|
this.listDeletedEntries = listDeletedEntries;
|
|
20
20
|
this.deleteEntry = deleteEntry;
|
|
21
|
-
this.isPrivate = true;
|
|
22
|
-
this.id = "hcmsEntriesEmptyTrashBins";
|
|
23
|
-
this.title = "Headless CMS - Empty all trash bins";
|
|
24
|
-
this.description = "Delete all entries in the trash bin for each model in the system.";
|
|
25
|
-
this.maxIterations = 120;
|
|
26
|
-
this.databaseLogs = false;
|
|
27
|
-
this.selfCleanup = [
|
|
28
|
-
"onSuccess",
|
|
29
|
-
"onAbort"
|
|
30
|
-
];
|
|
31
21
|
}
|
|
32
22
|
async run(params) {
|
|
33
23
|
const { input, controller } = params;
|
|
@@ -84,8 +74,8 @@ class EmptyTrashBinTask {
|
|
|
84
74
|
}) : controller.response.done("Task done: emptied the trash bin for all registered models.");
|
|
85
75
|
}
|
|
86
76
|
}
|
|
87
|
-
const
|
|
88
|
-
implementation:
|
|
77
|
+
const EmptyTrashBinTaskHandler = TaskHandler.createImplementation({
|
|
78
|
+
implementation: EmptyTrashBinTaskHandlerImpl,
|
|
89
79
|
dependencies: [
|
|
90
80
|
TenantContext,
|
|
91
81
|
ListTenantsUseCase,
|
|
@@ -94,6 +84,25 @@ const EmptyTrashBinTaskDefinition = TaskDefinition.createImplementation({
|
|
|
94
84
|
DeleteEntryUseCase
|
|
95
85
|
]
|
|
96
86
|
});
|
|
87
|
+
class EmptyTrashBinTask {
|
|
88
|
+
constructor(){
|
|
89
|
+
this.isPrivate = true;
|
|
90
|
+
this.id = "hcmsEntriesEmptyTrashBins";
|
|
91
|
+
this.title = "Headless CMS - Empty all trash bins";
|
|
92
|
+
this.description = "Delete all entries in the trash bin for each model in the system.";
|
|
93
|
+
this.maxIterations = 120;
|
|
94
|
+
this.databaseLogs = false;
|
|
95
|
+
this.selfCleanup = [
|
|
96
|
+
"onSuccess",
|
|
97
|
+
"onAbort"
|
|
98
|
+
];
|
|
99
|
+
this.handler = EmptyTrashBinTaskHandler;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const EmptyTrashBinTaskDefinition = TaskDefinition.createImplementation({
|
|
103
|
+
implementation: EmptyTrashBinTask,
|
|
104
|
+
dependencies: []
|
|
105
|
+
});
|
|
97
106
|
export { EmptyTrashBinTaskDefinition };
|
|
98
107
|
|
|
99
|
-
//# sourceMappingURL=
|
|
108
|
+
//# sourceMappingURL=EmptyTrashBinTask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks/EmptyTrashBinTask.js","sources":["../../src/tasks/EmptyTrashBinTask.ts"],"sourcesContent":["import type { IEmptyTrashBinsInput, IEmptyTrashBinsOutput } from \"~/types.js\";\nimport {\n TaskDefinition,\n TaskHandler\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { ListTenantsUseCase } from \"@webiny/api-core/features/tenancy/ListTenants/index.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { ListModelsUseCase } from \"@webiny/api-headless-cms/features/contentModel/ListModels/index.js\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js\";\nimport { ListDeletedEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\n\nconst calculateDateTimeString = () => {\n // Retrieve the retention period from the environment variable WEBINY_TRASH_BIN_RETENTION_PERIOD_DAYS,\n // or default to 90 days if not set or set to 0.\n const retentionPeriodFromEnv = process.env[\"WEBINY_TRASH_BIN_RETENTION_PERIOD_DAYS\"];\n const retentionPeriod =\n retentionPeriodFromEnv && Number(retentionPeriodFromEnv) !== 0\n ? Number(retentionPeriodFromEnv)\n : 90;\n\n // Calculate the date-time by subtracting the retention period (in days) from the current date.\n const currentDate = new Date();\n currentDate.setDate(currentDate.getDate() - retentionPeriod);\n\n // Return the calculated date-time string in ISO 8601 format.\n return currentDate.toISOString();\n};\n\nclass EmptyTrashBinTaskHandlerImpl implements TaskHandler.Interface<\n IEmptyTrashBinsInput,\n IEmptyTrashBinsOutput\n> {\n constructor(\n private tenantContext: TenantContext.Interface,\n private listTenants: ListTenantsUseCase.Interface,\n private listModels: ListModelsUseCase.Interface,\n private listDeletedEntries: ListDeletedEntriesUseCase.Interface,\n private deleteEntry: DeleteEntryUseCase.Interface\n ) {}\n\n async run(\n params: TaskHandler.RunParams<IEmptyTrashBinsInput, IEmptyTrashBinsOutput>\n ): Promise<TaskDefinition.Result<IEmptyTrashBinsInput, IEmptyTrashBinsOutput>> {\n const { input, controller } = params;\n\n // Abort the task if needed.\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n // Fetch all tenants, excluding those already processed.\n const tenantsResult = await this.listTenants.execute();\n const baseTenants = tenantsResult.value;\n const executedTenantIds = input.executedTenantIds || [];\n const tenants = baseTenants.filter(tenant => !executedTenantIds.includes(tenant.id));\n\n let shouldTaskContinue = false;\n\n // Iterate over each tenant.\n await this.tenantContext.withEachTenant(tenants, async tenant => {\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n return;\n }\n\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n return;\n }\n\n // List all non-private models.\n const modelsResult = await this.listModels.execute({ includePrivate: false });\n const models = modelsResult.value;\n\n // Process each model to delete trashed entries.\n for (const model of models) {\n // Query parameters for fetching deleted entries older than a minute ago.\n const listEntriesParams = {\n where: {\n deletedOn_lt: calculateDateTimeString()\n },\n limit: 50\n };\n\n // Continue deleting entries while there are entries left to delete.\n while (true) {\n const listResult = await this.listDeletedEntries.execute(\n model,\n listEntriesParams\n );\n const { entries, meta } = listResult.value;\n\n if (meta.totalCount === 0) {\n break;\n }\n\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n break;\n }\n for (const entry of entries) {\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n break;\n }\n // Delete each entry individually.\n await this.deleteEntry.execute(model, entry.id, { permanently: true });\n }\n }\n }\n\n // If the task isn't continuing, add the tenant to the executed list.\n if (!shouldTaskContinue) {\n executedTenantIds.push(tenant.id);\n }\n });\n\n // Continue the task or mark it as done based on the `shouldContinue` flag.\n return shouldTaskContinue\n ? controller.response.continue({ ...input, executedTenantIds })\n : controller.response.done(\n \"Task done: emptied the trash bin for all registered models.\"\n );\n }\n}\n\nconst EmptyTrashBinTaskHandler = TaskHandler.createImplementation({\n implementation: EmptyTrashBinTaskHandlerImpl,\n dependencies: [\n TenantContext,\n ListTenantsUseCase,\n ListModelsUseCase,\n ListDeletedEntriesUseCase,\n DeleteEntryUseCase\n ]\n});\n\nclass EmptyTrashBinTask implements TaskDefinition.Interface {\n public readonly isPrivate = true;\n public readonly id = \"hcmsEntriesEmptyTrashBins\";\n public readonly title = \"Headless CMS - Empty all trash bins\";\n public readonly description =\n \"Delete all entries in the trash bin for each model in the system.\";\n public readonly maxIterations = 120;\n public readonly databaseLogs = false;\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n handler = EmptyTrashBinTaskHandler;\n}\n\nexport const EmptyTrashBinTaskDefinition = TaskDefinition.createImplementation({\n implementation: EmptyTrashBinTask,\n dependencies: []\n});\n"],"names":["calculateDateTimeString","retentionPeriodFromEnv","process","retentionPeriod","Number","currentDate","Date","EmptyTrashBinTaskHandlerImpl","tenantContext","listTenants","listModels","listDeletedEntries","deleteEntry","params","input","controller","tenantsResult","baseTenants","executedTenantIds","tenants","tenant","shouldTaskContinue","modelsResult","models","model","listEntriesParams","listResult","entries","meta","entry","EmptyTrashBinTaskHandler","TaskHandler","TenantContext","ListTenantsUseCase","ListModelsUseCase","ListDeletedEntriesUseCase","DeleteEntryUseCase","EmptyTrashBinTask","EmptyTrashBinTaskDefinition","TaskDefinition"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tasks/EmptyTrashBinTaskDefinition.js","sources":["../../src/tasks/EmptyTrashBinTaskDefinition.ts"],"sourcesContent":["import type { IEmptyTrashBinsInput, IEmptyTrashBinsOutput } from \"~/types.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { ListTenantsUseCase } from \"@webiny/api-core/features/tenancy/ListTenants/index.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { ListModelsUseCase } from \"@webiny/api-headless-cms/features/contentModel/ListModels/index.js\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js\";\nimport { ListDeletedEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\n\nconst calculateDateTimeString = () => {\n // Retrieve the retention period from the environment variable WEBINY_TRASH_BIN_RETENTION_PERIOD_DAYS,\n // or default to 90 days if not set or set to 0.\n const retentionPeriodFromEnv = process.env[\"WEBINY_TRASH_BIN_RETENTION_PERIOD_DAYS\"];\n const retentionPeriod =\n retentionPeriodFromEnv && Number(retentionPeriodFromEnv) !== 0\n ? Number(retentionPeriodFromEnv)\n : 90;\n\n // Calculate the date-time by subtracting the retention period (in days) from the current date.\n const currentDate = new Date();\n currentDate.setDate(currentDate.getDate() - retentionPeriod);\n\n // Return the calculated date-time string in ISO 8601 format.\n return currentDate.toISOString();\n};\n\nclass EmptyTrashBinTask implements TaskDefinition.Interface<\n IEmptyTrashBinsInput,\n IEmptyTrashBinsOutput\n> {\n public readonly isPrivate = true;\n public readonly id = \"hcmsEntriesEmptyTrashBins\";\n public readonly title = \"Headless CMS - Empty all trash bins\";\n public readonly description =\n \"Delete all entries in the trash bin for each model in the system.\";\n public readonly maxIterations = 120;\n public readonly databaseLogs = false;\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n constructor(\n private tenantContext: TenantContext.Interface,\n private listTenants: ListTenantsUseCase.Interface,\n private listModels: ListModelsUseCase.Interface,\n private listDeletedEntries: ListDeletedEntriesUseCase.Interface,\n private deleteEntry: DeleteEntryUseCase.Interface\n ) {}\n\n async run(\n params: TaskDefinition.RunParams<IEmptyTrashBinsInput, IEmptyTrashBinsOutput>\n ): Promise<TaskDefinition.Result<IEmptyTrashBinsInput, IEmptyTrashBinsOutput>> {\n const { input, controller } = params;\n\n // Abort the task if needed.\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n // Fetch all tenants, excluding those already processed.\n const tenantsResult = await this.listTenants.execute();\n const baseTenants = tenantsResult.value;\n const executedTenantIds = input.executedTenantIds || [];\n const tenants = baseTenants.filter(tenant => !executedTenantIds.includes(tenant.id));\n\n let shouldTaskContinue = false;\n\n // Iterate over each tenant.\n await this.tenantContext.withEachTenant(tenants, async tenant => {\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n return;\n }\n\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n return;\n }\n\n // List all non-private models.\n const modelsResult = await this.listModels.execute({ includePrivate: false });\n const models = modelsResult.value;\n\n // Process each model to delete trashed entries.\n for (const model of models) {\n // Query parameters for fetching deleted entries older than a minute ago.\n const listEntriesParams = {\n where: {\n deletedOn_lt: calculateDateTimeString()\n },\n limit: 50\n };\n\n // Continue deleting entries while there are entries left to delete.\n while (true) {\n const listResult = await this.listDeletedEntries.execute(\n model,\n listEntriesParams\n );\n const { entries, meta } = listResult.value;\n\n if (meta.totalCount === 0) {\n break;\n }\n\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n break;\n }\n for (const entry of entries) {\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n break;\n }\n // Delete each entry individually.\n await this.deleteEntry.execute(model, entry.id, { permanently: true });\n }\n }\n }\n\n // If the task isn't continuing, add the tenant to the executed list.\n if (!shouldTaskContinue) {\n executedTenantIds.push(tenant.id);\n }\n });\n\n // Continue the task or mark it as done based on the `shouldContinue` flag.\n return shouldTaskContinue\n ? controller.response.continue({ ...input, executedTenantIds })\n : controller.response.done(\n \"Task done: emptied the trash bin for all registered models.\"\n );\n }\n}\n\nexport const EmptyTrashBinTaskDefinition = TaskDefinition.createImplementation({\n implementation: EmptyTrashBinTask,\n dependencies: [\n TenantContext,\n ListTenantsUseCase,\n ListModelsUseCase,\n ListDeletedEntriesUseCase,\n DeleteEntryUseCase\n ]\n});\n"],"names":["calculateDateTimeString","retentionPeriodFromEnv","process","retentionPeriod","Number","currentDate","Date","EmptyTrashBinTask","tenantContext","listTenants","listModels","listDeletedEntries","deleteEntry","params","input","controller","tenantsResult","baseTenants","executedTenantIds","tenants","tenant","shouldTaskContinue","modelsResult","models","model","listEntriesParams","listResult","entries","meta","entry","EmptyTrashBinTaskDefinition","TaskDefinition","TenantContext","ListTenantsUseCase","ListModelsUseCase","ListDeletedEntriesUseCase","DeleteEntryUseCase"],"mappings":";;;;;;AAQA,MAAMA,0BAA0B;IAG5B,MAAMC,yBAAyBC,QAAQ,GAAG,CAAC,yCAAyC;IACpF,MAAMC,kBACFF,0BAA0BG,AAAmC,MAAnCA,OAAOH,0BAC3BG,OAAOH,0BACP;IAGV,MAAMI,cAAc,IAAIC;IACxBD,YAAY,OAAO,CAACA,YAAY,OAAO,KAAKF;IAG5C,OAAOE,YAAY,WAAW;AAClC;AAEA,MAAME;IAcF,YACYC,aAAsC,EACtCC,WAAyC,EACzCC,UAAuC,EACvCC,kBAAuD,EACvDC,WAAyC,CACnD;aALUJ,aAAa,GAAbA;aACAC,WAAW,GAAXA;aACAC,UAAU,GAAVA;aACAC,kBAAkB,GAAlBA;aACAC,WAAW,GAAXA;aAfI,SAAS,GAAG;aACZ,EAAE,GAAG;aACL,KAAK,GAAG;aACR,WAAW,GACvB;aACY,aAAa,GAAG;aAChB,YAAY,GAAG;aAEf,WAAW,GAAG;YAAC;YAAsB;SAAmB;IAQrE;IAEH,MAAM,IACFC,MAA6E,EACF;QAC3E,MAAM,EAAEC,KAAK,EAAEC,UAAU,EAAE,GAAGF;QAG9B,IAAIE,WAAW,OAAO,CAAC,SAAS,IAC5B,OAAOA,WAAW,QAAQ,CAAC,OAAO;QAItC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO;QACpD,MAAMC,cAAcD,cAAc,KAAK;QACvC,MAAME,oBAAoBJ,MAAM,iBAAiB,IAAI,EAAE;QACvD,MAAMK,UAAUF,YAAY,MAAM,CAACG,CAAAA,SAAU,CAACF,kBAAkB,QAAQ,CAACE,OAAO,EAAE;QAElF,IAAIC,qBAAqB;QAGzB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAACF,SAAS,OAAMC;YACnD,IAAIL,WAAW,OAAO,CAAC,gBAAgB,IAAI;gBACvCM,qBAAqB;gBACrB;YACJ;YAEA,IAAIN,WAAW,OAAO,CAAC,gBAAgB,IAAI;gBACvCM,qBAAqB;gBACrB;YACJ;YAGA,MAAMC,eAAe,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,gBAAgB;YAAM;YAC3E,MAAMC,SAASD,aAAa,KAAK;YAGjC,KAAK,MAAME,SAASD,OAAQ;gBAExB,MAAME,oBAAoB;oBACtB,OAAO;wBACH,cAAczB;oBAClB;oBACA,OAAO;gBACX;gBAGA,MAAO,KAAM;oBACT,MAAM0B,aAAa,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CACpDF,OACAC;oBAEJ,MAAM,EAAEE,OAAO,EAAEC,IAAI,EAAE,GAAGF,WAAW,KAAK;oBAE1C,IAAIE,AAAoB,MAApBA,KAAK,UAAU,EACf;oBAGJ,IAAIb,WAAW,OAAO,CAAC,gBAAgB,IAAI;wBACvCM,qBAAqB;wBACrB;oBACJ;oBACA,KAAK,MAAMQ,SAASF,QAAS;wBACzB,IAAIZ,WAAW,OAAO,CAAC,gBAAgB,IAAI;4BACvCM,qBAAqB;4BACrB;wBACJ;wBAEA,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAACG,OAAOK,MAAM,EAAE,EAAE;4BAAE,aAAa;wBAAK;oBACxE;gBACJ;YACJ;YAGA,IAAI,CAACR,oBACDH,kBAAkB,IAAI,CAACE,OAAO,EAAE;QAExC;QAGA,OAAOC,qBACDN,WAAW,QAAQ,CAAC,QAAQ,CAAC;YAAE,GAAGD,KAAK;YAAEI;QAAkB,KAC3DH,WAAW,QAAQ,CAAC,IAAI,CACpB;IAEd;AACJ;AAEO,MAAMe,8BAA8BC,eAAe,oBAAoB,CAAC;IAC3E,gBAAgBxB;IAChB,cAAc;QACVyB;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|