@webiny/api-headless-cms-bulk-actions 6.4.11 → 6.6.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HcmsBulkActionsFeature.d.ts +7 -0
- package/HcmsBulkActionsFeature.js +32 -0
- package/HcmsBulkActionsFeature.js.map +1 -0
- package/exports/api/cms/entry.d.ts +1 -0
- package/exports/api/cms/entry.js +1 -0
- package/features/DeleteEntriesBulkAction/DeleteEntriesBulkAction.d.ts +1 -1
- package/features/DeleteEntriesBulkAction/DeleteEntriesBulkAction.js +0 -1
- package/features/DeleteEntriesBulkAction/DeleteEntriesBulkAction.js.map +1 -1
- package/features/EntriesBulkAction/abstractions.d.ts +7 -7
- package/features/EntriesBulkAction/abstractions.js.map +1 -1
- package/features/EntriesBulkAction/createBulkActionTasks.d.ts +47 -4
- package/features/EntriesBulkAction/createBulkActionTasks.js +132 -117
- 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 +7 -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/features/MoveToFolderBulkAction/MoveToFolderBulkAction.d.ts +1 -1
- package/features/MoveToFolderBulkAction/MoveToFolderBulkAction.js +3 -2
- package/features/MoveToFolderBulkAction/MoveToFolderBulkAction.js.map +1 -1
- package/features/MoveToTrashBulkAction/MoveToTrashBulkAction.d.ts +1 -1
- package/features/MoveToTrashBulkAction/MoveToTrashBulkAction.js +0 -1
- package/features/MoveToTrashBulkAction/MoveToTrashBulkAction.js.map +1 -1
- package/features/PublishEntriesBulkAction/PublishEntriesBulkAction.d.ts +1 -1
- package/features/PublishEntriesBulkAction/PublishEntriesBulkAction.js +3 -2
- package/features/PublishEntriesBulkAction/PublishEntriesBulkAction.js.map +1 -1
- package/features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.d.ts +1 -1
- package/features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.js +0 -1
- package/features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.js.map +1 -1
- package/features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.d.ts +1 -1
- package/features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.js +3 -2
- package/features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.js.map +1 -1
- package/graphql/BulkActionsGraphQLSchema.d.ts +12 -0
- package/graphql/BulkActionsGraphQLSchema.js +106 -0
- package/graphql/BulkActionsGraphQLSchema.js.map +1 -0
- 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 +2 -7
- package/index.js +1 -46
- package/package.json +18 -16
- package/tasks/EmptyTrashBinTaskDefinition.d.ts +1 -1
- package/tasks/EmptyTrashBinTaskDefinition.js +0 -6
- package/tasks/EmptyTrashBinTaskDefinition.js.map +1 -1
- package/types.d.ts +2 -0
- package/types.js.map +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
|
@@ -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
|
|
@@ -52,13 +52,14 @@ class CreateTasksByModel {
|
|
|
52
52
|
const ids = [];
|
|
53
53
|
for(let i = 0; i < entries.length; i++)ids.push(entries[i].id);
|
|
54
54
|
if (ids.length > 0) this.taskCache.cacheTask({
|
|
55
|
+
actionName: input.actionName,
|
|
55
56
|
modelId: input.modelId,
|
|
56
57
|
identity: input.identity,
|
|
57
58
|
data: input.data,
|
|
58
59
|
ids
|
|
59
60
|
});
|
|
60
61
|
if (!meta.hasMoreItems || !meta.cursor) {
|
|
61
|
-
await this.taskCache.triggerTask(this.
|
|
62
|
+
await this.taskCache.triggerTask(this.triggerTask, controller.state.getTask());
|
|
62
63
|
return controller.response.continue({
|
|
63
64
|
...input,
|
|
64
65
|
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 this.taskCache.cacheTask({\n actionName: input.actionName,\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":";;AAQA,MAAMA,uBAAuB;AAKtB,MAAMC;IAOT,YACIC,QAAmC,EACnCC,WAAyC,EACzCC,UAAuC,EACvCC,cAAsB,EACtBC,SAAiB,CACnB;QACE,IAAI,CAAC,QAAQ,GAAGJ;QAChB,IAAI,CAAC,SAAS,GAAG,IAAIK,UAAUF;QAC/B,IAAI,CAAC,SAAS,GAAGC;QACjB,IAAI,CAAC,UAAU,GAAGF;QAClB,IAAI,CAAC,WAAW,GAAGD;IACvB;IAEA,MAAM,QAAQK,MAA6C,EAAE;QACzD,MAAM,EAAEC,KAAK,EAAEC,UAAU,EAAE,GAAGF;QAE9B,IAAI;YACA,MAAMG,cAAc,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAACF,MAAM,OAAO;YAE7D,IAAIE,YAAY,MAAM,IAClB,OAAOD,WAAW,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAED,MAAM,OAAO,CAAC,WAAW,CAAC;YAG7E,MAAMG,QAAQD,YAAY,KAAK;YAE/B,MAAME,oBAAwC;gBAC1C,OAAOJ,MAAM,KAAK;gBAClB,QAAQA,MAAM,MAAM;gBACpB,OAAOA,MAAM,KAAK;gBAClB,OAAO,IAAI,CAAC,SAAS;YACzB;YAEA,MAAO,KAAM;gBACT,IAAIC,WAAW,OAAO,CAAC,SAAS,IAC5B,OAAOA,WAAW,QAAQ,CAAC,OAAO;gBAC/B,IAAIA,WAAW,OAAO,CAAC,gBAAgB,IAAI;oBAC9C,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAEA,WAAW,KAAK,CAAC,OAAO;oBAC3E,OAAOA,WAAW,QAAQ,CAAC,QAAQ,CAAC;wBAChC,GAAGD,KAAK;wBACR,QAAQK,iCAAiC,gBAAgB;oBAC7D;gBACJ;gBAGA,MAAM,EAAEC,OAAO,EAAEC,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAACJ,OAAOC;gBAGhE,IAAIG,AAAoB,MAApBA,KAAK,UAAU,EACf,OAAON,WAAW,QAAQ,CAAC,QAAQ,CAAC;oBAChC,GAAGD,KAAK;oBACR,QAAQK,iCAAiC,QAAQ;gBACrD;gBAIJ,IAAI,IAAI,CAAC,SAAS,CAAC,cAAc,OAAOd,sBAAsB;oBAC1D,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAEU,WAAW,KAAK,CAAC,OAAO;oBAC3E,OAAOA,WAAW,QAAQ,CAAC,QAAQ,CAAC;wBAChC,GAAGD,KAAK;wBACR,QAAQK,iCAAiC,gBAAgB;oBAC7D;gBACJ;gBAGA,IAAIC,AAAmB,MAAnBA,QAAQ,MAAM,EAAQ;oBACtB,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAEL,WAAW,KAAK,CAAC,OAAO;oBAC3E,OAAOA,WAAW,QAAQ,CAAC,QAAQ,CAAC;wBAChC,GAAGD,KAAK;wBACR,QAAQK,iCAAiC,gBAAgB;oBAC7D;gBACJ;gBAGA,MAAMG,MAAgB,EAAE;gBACxB,IAAK,IAAIC,IAAI,GAAGA,IAAIH,QAAQ,MAAM,EAAEG,IAChCD,IAAI,IAAI,CAACF,OAAO,CAACG,EAAE,CAAC,EAAE;gBAG1B,IAAID,IAAI,MAAM,GAAG,GACb,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;oBACrB,YAAYR,MAAM,UAAU;oBAC5B,SAASA,MAAM,OAAO;oBACtB,UAAUA,MAAM,QAAQ;oBACxB,MAAMA,MAAM,IAAI;oBAChBQ;gBACJ;gBAIJ,IAAI,CAACD,KAAK,YAAY,IAAI,CAACA,KAAK,MAAM,EAAE;oBACpC,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAEN,WAAW,KAAK,CAAC,OAAO;oBAE3E,OAAOA,WAAW,QAAQ,CAAC,QAAQ,CAAC;wBAChC,GAAGD,KAAK;wBACR,QAAQK,iCAAiC,gBAAgB;oBAC7D;gBACJ;gBAEAD,kBAAkB,KAAK,GAAGG,KAAK,MAAM;YACzC;QACJ,EAAE,OAAOG,IAAI;YACT,OAAOT,WAAW,QAAQ,CAAC,KAAK,CAACS,GAAG,OAAO,IAAI;QACnD;IACJ;AACJ"}
|
|
@@ -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"}
|
|
@@ -10,6 +10,6 @@ declare class MoveToFolderBulkActionImpl implements EntriesBulkAction.Interface
|
|
|
10
10
|
processData(model: EntriesBulkAction.Model, params: EntriesBulkAction.ProcessParams): Promise<void>;
|
|
11
11
|
}
|
|
12
12
|
export declare const MoveToFolderBulkAction: typeof MoveToFolderBulkActionImpl & {
|
|
13
|
-
__abstraction: import("@webiny/di").Abstraction<import("~/features/EntriesBulkAction/abstractions.js").IEntriesBulkAction
|
|
13
|
+
__abstraction: import("@webiny/di").Abstraction<import("~/features/EntriesBulkAction/abstractions.js").IEntriesBulkAction<Record<string, any>>>;
|
|
14
14
|
};
|
|
15
15
|
export {};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ListLatestEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js";
|
|
2
2
|
import { MoveEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/MoveEntry/index.js";
|
|
3
|
+
import { parseIdentifier } from "@webiny/utils";
|
|
3
4
|
import { EntriesBulkAction } from "../EntriesBulkAction/abstractions.js";
|
|
4
5
|
class MoveToFolderBulkActionImpl {
|
|
5
6
|
constructor(listLatestEntries, moveEntry){
|
|
@@ -9,12 +10,12 @@ class MoveToFolderBulkActionImpl {
|
|
|
9
10
|
}
|
|
10
11
|
async loadData(model, params) {
|
|
11
12
|
const entriesResult = await this.listLatestEntries.execute(model, params);
|
|
12
|
-
if (entriesResult.isFail()) throw entriesResult.error;
|
|
13
13
|
return entriesResult.value;
|
|
14
14
|
}
|
|
15
15
|
async processData(model, params) {
|
|
16
16
|
if (!params.data?.folderId) throw new Error('Missing "data.folderId" in the input.');
|
|
17
|
-
|
|
17
|
+
const { id: entryId } = parseIdentifier(params.id);
|
|
18
|
+
await this.moveEntry.execute(model, entryId, params.data.folderId);
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
21
|
const MoveToFolderBulkAction = EntriesBulkAction.createImplementation({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/MoveToFolderBulkAction/MoveToFolderBulkAction.js","sources":["../../../src/features/MoveToFolderBulkAction/MoveToFolderBulkAction.ts"],"sourcesContent":["import { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { MoveEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/MoveEntry/index.js\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass MoveToFolderBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"moveToFolder\";\n\n constructor(\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private moveEntry: MoveEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listLatestEntries.execute(model, params);\n
|
|
1
|
+
{"version":3,"file":"features/MoveToFolderBulkAction/MoveToFolderBulkAction.js","sources":["../../../src/features/MoveToFolderBulkAction/MoveToFolderBulkAction.ts"],"sourcesContent":["import { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { MoveEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/MoveEntry/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass MoveToFolderBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"moveToFolder\";\n\n constructor(\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private moveEntry: MoveEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listLatestEntries.execute(model, params);\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n if (!params.data?.folderId) {\n throw new Error(`Missing \"data.folderId\" in the input.`);\n }\n\n const { id: entryId } = parseIdentifier(params.id);\n\n await this.moveEntry.execute(model, entryId, params.data.folderId);\n }\n}\n\nexport const MoveToFolderBulkAction = EntriesBulkAction.createImplementation({\n implementation: MoveToFolderBulkActionImpl,\n dependencies: [ListLatestEntriesUseCase, MoveEntryUseCase]\n});\n"],"names":["MoveToFolderBulkActionImpl","listLatestEntries","moveEntry","model","params","entriesResult","Error","entryId","parseIdentifier","MoveToFolderBulkAction","EntriesBulkAction","ListLatestEntriesUseCase","MoveEntryUseCase"],"mappings":";;;;AAKA,MAAMA;IAGF,YACYC,iBAAqD,EACrDC,SAAqC,CAC/C;aAFUD,iBAAiB,GAAjBA;aACAC,SAAS,GAATA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACF,OAAOC;QAElE,OAAOC,cAAc,KAAK;IAC9B;IAEA,MAAM,YACFF,KAA8B,EAC9BC,MAAuC,EAC1B;QACb,IAAI,CAACA,OAAO,IAAI,EAAE,UACd,MAAM,IAAIE,MAAM;QAGpB,MAAM,EAAE,IAAIC,OAAO,EAAE,GAAGC,gBAAgBJ,OAAO,EAAE;QAEjD,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAACD,OAAOI,SAASH,OAAO,IAAI,CAAC,QAAQ;IACrE;AACJ;AAEO,MAAMK,yBAAyBC,kBAAkB,oBAAoB,CAAC;IACzE,gBAAgBV;IAChB,cAAc;QAACW;QAA0BC;KAAiB;AAC9D"}
|
|
@@ -10,6 +10,6 @@ declare class MoveToTrashBulkActionImpl implements EntriesBulkAction.Interface {
|
|
|
10
10
|
processData(model: EntriesBulkAction.Model, params: EntriesBulkAction.ProcessParams): Promise<void>;
|
|
11
11
|
}
|
|
12
12
|
export declare const MoveToTrashBulkAction: typeof MoveToTrashBulkActionImpl & {
|
|
13
|
-
__abstraction: import("@webiny/di").Abstraction<import("~/features/EntriesBulkAction/abstractions.js").IEntriesBulkAction
|
|
13
|
+
__abstraction: import("@webiny/di").Abstraction<import("~/features/EntriesBulkAction/abstractions.js").IEntriesBulkAction<Record<string, any>>>;
|
|
14
14
|
};
|
|
15
15
|
export {};
|
|
@@ -10,7 +10,6 @@ class MoveToTrashBulkActionImpl {
|
|
|
10
10
|
}
|
|
11
11
|
async loadData(model, params) {
|
|
12
12
|
const entriesResult = await this.listLatestEntries.execute(model, params);
|
|
13
|
-
if (entriesResult.isFail()) throw entriesResult.error;
|
|
14
13
|
return entriesResult.value;
|
|
15
14
|
}
|
|
16
15
|
async processData(model, params) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/MoveToTrashBulkAction/MoveToTrashBulkAction.js","sources":["../../../src/features/MoveToTrashBulkAction/MoveToTrashBulkAction.ts"],"sourcesContent":["import { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass MoveToTrashBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"moveToTrash\";\n\n constructor(\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private deleteEntry: DeleteEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listLatestEntries.execute(model, params);\n
|
|
1
|
+
{"version":3,"file":"features/MoveToTrashBulkAction/MoveToTrashBulkAction.js","sources":["../../../src/features/MoveToTrashBulkAction/MoveToTrashBulkAction.ts"],"sourcesContent":["import { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass MoveToTrashBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"moveToTrash\";\n\n constructor(\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private deleteEntry: DeleteEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listLatestEntries.execute(model, params);\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n const { id: entryId } = parseIdentifier(params.id);\n\n await this.deleteEntry.execute(model, entryId, {\n permanently: false\n });\n }\n}\n\nexport const MoveToTrashBulkAction = EntriesBulkAction.createImplementation({\n implementation: MoveToTrashBulkActionImpl,\n dependencies: [ListLatestEntriesUseCase, DeleteEntryUseCase]\n});\n"],"names":["MoveToTrashBulkActionImpl","listLatestEntries","deleteEntry","model","params","entriesResult","entryId","parseIdentifier","MoveToTrashBulkAction","EntriesBulkAction","ListLatestEntriesUseCase","DeleteEntryUseCase"],"mappings":";;;;AAKA,MAAMA;IAGF,YACYC,iBAAqD,EACrDC,WAAyC,CACnD;aAFUD,iBAAiB,GAAjBA;aACAC,WAAW,GAAXA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACF,OAAOC;QAElE,OAAOC,cAAc,KAAK;IAC9B;IAEA,MAAM,YACFF,KAA8B,EAC9BC,MAAuC,EAC1B;QACb,MAAM,EAAE,IAAIE,OAAO,EAAE,GAAGC,gBAAgBH,OAAO,EAAE;QAEjD,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAACD,OAAOG,SAAS;YAC3C,aAAa;QACjB;IACJ;AACJ;AAEO,MAAME,wBAAwBC,kBAAkB,oBAAoB,CAAC;IACxE,gBAAgBT;IAChB,cAAc;QAACU;QAA0BC;KAAmB;AAChE"}
|
|
@@ -10,6 +10,6 @@ declare class PublishEntriesBulkActionImpl implements EntriesBulkAction.Interfac
|
|
|
10
10
|
processData(model: EntriesBulkAction.Model, params: EntriesBulkAction.ProcessParams): Promise<void>;
|
|
11
11
|
}
|
|
12
12
|
export declare const PublishEntriesBulkAction: typeof PublishEntriesBulkActionImpl & {
|
|
13
|
-
__abstraction: import("@webiny/di").Abstraction<import("~/features/EntriesBulkAction/abstractions.js").IEntriesBulkAction
|
|
13
|
+
__abstraction: import("@webiny/di").Abstraction<import("~/features/EntriesBulkAction/abstractions.js").IEntriesBulkAction<Record<string, any>>>;
|
|
14
14
|
};
|
|
15
15
|
export {};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ListLatestEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js";
|
|
2
2
|
import { PublishEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/PublishEntry/index.js";
|
|
3
|
+
import { parseIdentifier } from "@webiny/utils";
|
|
3
4
|
import { EntriesBulkAction } from "../EntriesBulkAction/abstractions.js";
|
|
4
5
|
class PublishEntriesBulkActionImpl {
|
|
5
6
|
constructor(listLatestEntries, publishEntry){
|
|
@@ -16,11 +17,11 @@ class PublishEntriesBulkActionImpl {
|
|
|
16
17
|
status_not: "published"
|
|
17
18
|
}
|
|
18
19
|
});
|
|
19
|
-
if (entriesResult.isFail()) throw entriesResult.error;
|
|
20
20
|
return entriesResult.value;
|
|
21
21
|
}
|
|
22
22
|
async processData(model, params) {
|
|
23
|
-
|
|
23
|
+
const { id: entryId } = parseIdentifier(params.id);
|
|
24
|
+
await this.publishEntry.execute(model, entryId);
|
|
24
25
|
}
|
|
25
26
|
}
|
|
26
27
|
const PublishEntriesBulkAction = EntriesBulkAction.createImplementation({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/PublishEntriesBulkAction/PublishEntriesBulkAction.js","sources":["../../../src/features/PublishEntriesBulkAction/PublishEntriesBulkAction.ts"],"sourcesContent":["import { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { PublishEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/PublishEntry/index.js\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass PublishEntriesBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"publish\";\n\n constructor(\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private publishEntry: PublishEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const { where, ...rest } = params;\n\n const entriesResult = await this.listLatestEntries.execute(model, {\n ...rest,\n where: {\n ...where,\n status_not: \"published\"\n }\n });\n\n
|
|
1
|
+
{"version":3,"file":"features/PublishEntriesBulkAction/PublishEntriesBulkAction.js","sources":["../../../src/features/PublishEntriesBulkAction/PublishEntriesBulkAction.ts"],"sourcesContent":["import { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { PublishEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/PublishEntry/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass PublishEntriesBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"publish\";\n\n constructor(\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private publishEntry: PublishEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const { where, ...rest } = params;\n\n const entriesResult = await this.listLatestEntries.execute(model, {\n ...rest,\n where: {\n ...where,\n status_not: \"published\"\n }\n });\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n const { id: entryId } = parseIdentifier(params.id);\n\n await this.publishEntry.execute(model, entryId);\n }\n}\n\nexport const PublishEntriesBulkAction = EntriesBulkAction.createImplementation({\n implementation: PublishEntriesBulkActionImpl,\n dependencies: [ListLatestEntriesUseCase, PublishEntryUseCase]\n});\n"],"names":["PublishEntriesBulkActionImpl","listLatestEntries","publishEntry","model","params","where","rest","entriesResult","entryId","parseIdentifier","PublishEntriesBulkAction","EntriesBulkAction","ListLatestEntriesUseCase","PublishEntryUseCase"],"mappings":";;;;AAKA,MAAMA;IAGF,YACYC,iBAAqD,EACrDC,YAA2C,CACrD;aAFUD,iBAAiB,GAAjBA;aACAC,YAAY,GAAZA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAM,EAAEC,KAAK,EAAE,GAAGC,MAAM,GAAGF;QAE3B,MAAMG,gBAAgB,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACJ,OAAO;YAC9D,GAAGG,IAAI;YACP,OAAO;gBACH,GAAGD,KAAK;gBACR,YAAY;YAChB;QACJ;QAEA,OAAOE,cAAc,KAAK;IAC9B;IAEA,MAAM,YACFJ,KAA8B,EAC9BC,MAAuC,EAC1B;QACb,MAAM,EAAE,IAAII,OAAO,EAAE,GAAGC,gBAAgBL,OAAO,EAAE;QAEjD,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAACD,OAAOK;IAC3C;AACJ;AAEO,MAAME,2BAA2BC,kBAAkB,oBAAoB,CAAC;IAC3E,gBAAgBX;IAChB,cAAc;QAACY;QAA0BC;KAAoB;AACjE"}
|
|
@@ -10,6 +10,6 @@ declare class RestoreEntriesBulkActionImpl implements EntriesBulkAction.Interfac
|
|
|
10
10
|
processData(model: EntriesBulkAction.Model, params: EntriesBulkAction.ProcessParams): Promise<void>;
|
|
11
11
|
}
|
|
12
12
|
export declare const RestoreEntriesBulkAction: typeof RestoreEntriesBulkActionImpl & {
|
|
13
|
-
__abstraction: import("@webiny/di").Abstraction<import("~/features/EntriesBulkAction/abstractions.js").IEntriesBulkAction
|
|
13
|
+
__abstraction: import("@webiny/di").Abstraction<import("~/features/EntriesBulkAction/abstractions.js").IEntriesBulkAction<Record<string, any>>>;
|
|
14
14
|
};
|
|
15
15
|
export {};
|
|
@@ -10,7 +10,6 @@ class RestoreEntriesBulkActionImpl {
|
|
|
10
10
|
}
|
|
11
11
|
async loadData(model, params) {
|
|
12
12
|
const entriesResult = await this.listDeletedEntries.execute(model, params);
|
|
13
|
-
if (entriesResult.isFail()) throw entriesResult.error;
|
|
14
13
|
return entriesResult.value;
|
|
15
14
|
}
|
|
16
15
|
async processData(model, params) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.js","sources":["../../../src/features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.ts"],"sourcesContent":["import { ListDeletedEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { RestoreEntryFromBinUseCase } from \"@webiny/api-headless-cms/features/contentEntry/RestoreEntryFromBin/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass RestoreEntriesBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"restore\";\n\n constructor(\n private listDeletedEntries: ListDeletedEntriesUseCase.Interface,\n private restoreEntry: RestoreEntryFromBinUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listDeletedEntries.execute(model, params);\n
|
|
1
|
+
{"version":3,"file":"features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.js","sources":["../../../src/features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.ts"],"sourcesContent":["import { ListDeletedEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { RestoreEntryFromBinUseCase } from \"@webiny/api-headless-cms/features/contentEntry/RestoreEntryFromBin/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass RestoreEntriesBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"restore\";\n\n constructor(\n private listDeletedEntries: ListDeletedEntriesUseCase.Interface,\n private restoreEntry: RestoreEntryFromBinUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listDeletedEntries.execute(model, params);\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n const { id: entryId } = parseIdentifier(params.id);\n\n await this.restoreEntry.execute(model, entryId);\n }\n}\n\nexport const RestoreEntriesBulkAction = EntriesBulkAction.createImplementation({\n implementation: RestoreEntriesBulkActionImpl,\n dependencies: [ListDeletedEntriesUseCase, RestoreEntryFromBinUseCase]\n});\n"],"names":["RestoreEntriesBulkActionImpl","listDeletedEntries","restoreEntry","model","params","entriesResult","entryId","parseIdentifier","RestoreEntriesBulkAction","EntriesBulkAction","ListDeletedEntriesUseCase","RestoreEntryFromBinUseCase"],"mappings":";;;;AAKA,MAAMA;IAGF,YACYC,kBAAuD,EACvDC,YAAkD,CAC5D;aAFUD,kBAAkB,GAAlBA;aACAC,YAAY,GAAZA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAACF,OAAOC;QAEnE,OAAOC,cAAc,KAAK;IAC9B;IAEA,MAAM,YACFF,KAA8B,EAC9BC,MAAuC,EAC1B;QACb,MAAM,EAAE,IAAIE,OAAO,EAAE,GAAGC,gBAAgBH,OAAO,EAAE;QAEjD,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAACD,OAAOG;IAC3C;AACJ;AAEO,MAAME,2BAA2BC,kBAAkB,oBAAoB,CAAC;IAC3E,gBAAgBT;IAChB,cAAc;QAACU;QAA2BC;KAA2B;AACzE"}
|
|
@@ -10,6 +10,6 @@ declare class UnpublishEntriesBulkActionImpl implements EntriesBulkAction.Interf
|
|
|
10
10
|
processData(model: EntriesBulkAction.Model, params: EntriesBulkAction.ProcessParams): Promise<void>;
|
|
11
11
|
}
|
|
12
12
|
export declare const UnpublishEntriesBulkAction: typeof UnpublishEntriesBulkActionImpl & {
|
|
13
|
-
__abstraction: import("@webiny/di").Abstraction<import("~/features/EntriesBulkAction/abstractions.js").IEntriesBulkAction
|
|
13
|
+
__abstraction: import("@webiny/di").Abstraction<import("~/features/EntriesBulkAction/abstractions.js").IEntriesBulkAction<Record<string, any>>>;
|
|
14
14
|
};
|
|
15
15
|
export {};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ListPublishedEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js";
|
|
2
2
|
import { UnpublishEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UnpublishEntry/index.js";
|
|
3
|
+
import { parseIdentifier } from "@webiny/utils";
|
|
3
4
|
import { EntriesBulkAction } from "../EntriesBulkAction/abstractions.js";
|
|
4
5
|
class UnpublishEntriesBulkActionImpl {
|
|
5
6
|
constructor(listPublishedEntries, unpublishEntry){
|
|
@@ -9,11 +10,11 @@ class UnpublishEntriesBulkActionImpl {
|
|
|
9
10
|
}
|
|
10
11
|
async loadData(model, params) {
|
|
11
12
|
const entriesResult = await this.listPublishedEntries.execute(model, params);
|
|
12
|
-
if (entriesResult.isFail()) throw entriesResult.error;
|
|
13
13
|
return entriesResult.value;
|
|
14
14
|
}
|
|
15
15
|
async processData(model, params) {
|
|
16
|
-
|
|
16
|
+
const { id: entryId } = parseIdentifier(params.id);
|
|
17
|
+
await this.unpublishEntry.execute(model, entryId);
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
20
|
const UnpublishEntriesBulkAction = EntriesBulkAction.createImplementation({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.js","sources":["../../../src/features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.ts"],"sourcesContent":["import { ListPublishedEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { UnpublishEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UnpublishEntry/index.js\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass UnpublishEntriesBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"unpublish\";\n\n constructor(\n private listPublishedEntries: ListPublishedEntriesUseCase.Interface,\n private unpublishEntry: UnpublishEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listPublishedEntries.execute(model, params);\n
|
|
1
|
+
{"version":3,"file":"features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.js","sources":["../../../src/features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.ts"],"sourcesContent":["import { ListPublishedEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { UnpublishEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UnpublishEntry/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass UnpublishEntriesBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"unpublish\";\n\n constructor(\n private listPublishedEntries: ListPublishedEntriesUseCase.Interface,\n private unpublishEntry: UnpublishEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listPublishedEntries.execute(model, params);\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n const { id: entryId } = parseIdentifier(params.id);\n\n await this.unpublishEntry.execute(model, entryId);\n }\n}\n\nexport const UnpublishEntriesBulkAction = EntriesBulkAction.createImplementation({\n implementation: UnpublishEntriesBulkActionImpl,\n dependencies: [ListPublishedEntriesUseCase, UnpublishEntryUseCase]\n});\n"],"names":["UnpublishEntriesBulkActionImpl","listPublishedEntries","unpublishEntry","model","params","entriesResult","entryId","parseIdentifier","UnpublishEntriesBulkAction","EntriesBulkAction","ListPublishedEntriesUseCase","UnpublishEntryUseCase"],"mappings":";;;;AAKA,MAAMA;IAGF,YACYC,oBAA2D,EAC3DC,cAA+C,CACzD;aAFUD,oBAAoB,GAApBA;aACAC,cAAc,GAAdA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAACF,OAAOC;QAErE,OAAOC,cAAc,KAAK;IAC9B;IAEA,MAAM,YACFF,KAA8B,EAC9BC,MAAuC,EAC1B;QACb,MAAM,EAAE,IAAIE,OAAO,EAAE,GAAGC,gBAAgBH,OAAO,EAAE;QAEjD,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAACD,OAAOG;IAC7C;AACJ;AAEO,MAAME,6BAA6BC,kBAAkB,oBAAoB,CAAC;IAC7E,gBAAgBT;IAChB,cAAc;QAACU;QAA6BC;KAAsB;AACtE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Container } from "@webiny/di";
|
|
2
|
+
import { CmsGraphQLSchemaPlugin, CmsGraphQLSchemaFactory } from "@webiny/api-headless-cms";
|
|
3
|
+
import type { HcmsBulkActionsContext } from "../types.js";
|
|
4
|
+
declare class BulkActionsGraphQLSchemaImpl implements CmsGraphQLSchemaFactory.Interface {
|
|
5
|
+
private readonly container;
|
|
6
|
+
constructor(container: Container);
|
|
7
|
+
execute(): Promise<CmsGraphQLSchemaPlugin<HcmsBulkActionsContext>[]>;
|
|
8
|
+
}
|
|
9
|
+
export declare const BulkActionsGraphQLSchema: typeof BulkActionsGraphQLSchemaImpl & {
|
|
10
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-headless-cms").ICmsGraphQLSchemaFactory>;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
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 { CMS_MODEL_SINGLETON_TAG } from "@webiny/api-headless-cms/constants.js";
|
|
4
|
+
import { Response } from "@webiny/api-graphql";
|
|
5
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
6
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/abstractions.js";
|
|
7
|
+
import { TriggerTaskUseCase } from "@webiny/background-tasks/api";
|
|
8
|
+
import { EntriesBulkAction } from "../features/EntriesBulkAction/abstractions.js";
|
|
9
|
+
import { BulkActionName } from "../domain/BulkActionName.js";
|
|
10
|
+
import { BULK_ACTION_LIST_TASK_ID } from "../features/EntriesBulkAction/createBulkActionTasks.js";
|
|
11
|
+
import { RequestContainer } from "@webiny/event-handler-core";
|
|
12
|
+
class BulkActionsGraphQLSchemaImpl {
|
|
13
|
+
constructor(container){
|
|
14
|
+
this.container = container;
|
|
15
|
+
}
|
|
16
|
+
async execute() {
|
|
17
|
+
const context = {
|
|
18
|
+
container: this.container
|
|
19
|
+
};
|
|
20
|
+
const tenantCtx = this.container.resolve(TenantContext);
|
|
21
|
+
const tenant = tenantCtx.getTenant();
|
|
22
|
+
if (!await isHeadlessCmsReady(context)) return [];
|
|
23
|
+
const identityCtx = this.container.resolve(IdentityContext);
|
|
24
|
+
const modelsResult = await identityCtx.withoutAuthorization(async ()=>this.container.resolve(ListModelsUseCase).execute());
|
|
25
|
+
if (modelsResult.isFail()) return [];
|
|
26
|
+
const allModels = modelsResult.value.filter((model)=>{
|
|
27
|
+
if (model.isPrivate) return false;
|
|
28
|
+
const tags = Array.isArray(model.tags) ? model.tags : [];
|
|
29
|
+
return !tags.includes(CMS_MODEL_SINGLETON_TAG);
|
|
30
|
+
});
|
|
31
|
+
const bulkActions = this.container.resolveAll(EntriesBulkAction);
|
|
32
|
+
const plugins = [];
|
|
33
|
+
const defaultPlugin = new CmsGraphQLSchemaPlugin({
|
|
34
|
+
typeDefs: `
|
|
35
|
+
type BulkActionResponseData {
|
|
36
|
+
id: String
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
type BulkActionResponse {
|
|
40
|
+
data: BulkActionResponseData
|
|
41
|
+
error: CmsError
|
|
42
|
+
}
|
|
43
|
+
`
|
|
44
|
+
});
|
|
45
|
+
defaultPlugin.name = "headless-cms.graphql.schema.bulkAction.default";
|
|
46
|
+
plugins.push(defaultPlugin);
|
|
47
|
+
for (const model of allModels){
|
|
48
|
+
const applicableActions = bulkActions.filter((action)=>{
|
|
49
|
+
if (action.modelIds?.length) return action.modelIds.includes(model.modelId);
|
|
50
|
+
return true;
|
|
51
|
+
});
|
|
52
|
+
const enumValues = applicableActions.map((action)=>BulkActionName.from(action.name)).join("\n ");
|
|
53
|
+
const modelPlugin = new CmsGraphQLSchemaPlugin({
|
|
54
|
+
typeDefs: `
|
|
55
|
+
enum BulkAction${model.singularApiName}Name {
|
|
56
|
+
_empty
|
|
57
|
+
${enumValues}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
extend type Mutation {
|
|
61
|
+
bulkAction${model.singularApiName}(
|
|
62
|
+
action: BulkAction${model.singularApiName}Name!
|
|
63
|
+
where: ${model.singularApiName}ListWhereInput
|
|
64
|
+
search: String
|
|
65
|
+
data: JSON
|
|
66
|
+
): BulkActionResponse
|
|
67
|
+
}
|
|
68
|
+
`,
|
|
69
|
+
resolvers: {
|
|
70
|
+
Mutation: {
|
|
71
|
+
[`bulkAction${model.singularApiName}`]: async (_, args, context)=>{
|
|
72
|
+
const identity = context.container.resolve(IdentityContext).getIdentity();
|
|
73
|
+
const response = await context.container.resolve(TriggerTaskUseCase).execute({
|
|
74
|
+
definition: BULK_ACTION_LIST_TASK_ID,
|
|
75
|
+
input: {
|
|
76
|
+
actionName: args.action,
|
|
77
|
+
modelId: model.modelId,
|
|
78
|
+
where: args.where,
|
|
79
|
+
search: args.search,
|
|
80
|
+
data: args.data,
|
|
81
|
+
identity
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
return new Response({
|
|
85
|
+
id: response.value.id
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
isApplicable: (context)=>context.container.resolve(TenantContext).getTenant().id === tenant.id
|
|
91
|
+
});
|
|
92
|
+
modelPlugin.name = `headless-cms.graphql.schema.bulkAction.${model.modelId}`;
|
|
93
|
+
plugins.push(modelPlugin);
|
|
94
|
+
}
|
|
95
|
+
return plugins;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const BulkActionsGraphQLSchema = CmsGraphQLSchemaFactory.createImplementation({
|
|
99
|
+
implementation: BulkActionsGraphQLSchemaImpl,
|
|
100
|
+
dependencies: [
|
|
101
|
+
RequestContainer
|
|
102
|
+
]
|
|
103
|
+
});
|
|
104
|
+
export { BulkActionsGraphQLSchema };
|
|
105
|
+
|
|
106
|
+
//# sourceMappingURL=BulkActionsGraphQLSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql/BulkActionsGraphQLSchema.js","sources":["../../src/graphql/BulkActionsGraphQLSchema.ts"],"sourcesContent":["import type { Container } from \"@webiny/di\";\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 { Response } from \"@webiny/api-graphql\";\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\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\nimport { BulkActionName } from \"~/domain/BulkActionName.js\";\nimport { BULK_ACTION_LIST_TASK_ID } from \"~/features/EntriesBulkAction/createBulkActionTasks.js\";\nimport { RequestContainer } from \"@webiny/event-handler-core\";\nimport type { HcmsBulkActionsContext } from \"~/types.js\";\n\nclass BulkActionsGraphQLSchemaImpl implements CmsGraphQLSchemaFactory.Interface {\n constructor(private readonly container: Container) {}\n\n async execute() {\n const context = { container: this.container } as HcmsBulkActionsContext;\n const tenantCtx = this.container.resolve(TenantContext);\n const tenant = tenantCtx.getTenant();\n\n if (!(await isHeadlessCmsReady(context))) {\n return [];\n }\n\n const identityCtx = this.container.resolve(IdentityContext);\n const modelsResult = await identityCtx.withoutAuthorization(async () => {\n return this.container.resolve(ListModelsUseCase).execute();\n });\n\n if (modelsResult.isFail()) {\n return [];\n }\n\n const allModels = 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 bulkActions = this.container.resolveAll(EntriesBulkAction);\n const plugins: CmsGraphQLSchemaPlugin<HcmsBulkActionsContext>[] = [];\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 plugins.push(defaultPlugin);\n\n for (const model of allModels) {\n const applicableActions = bulkActions.filter(action => {\n if (action.modelIds?.length) {\n return action.modelIds.includes(model.modelId);\n }\n return true;\n });\n\n const enumValues = applicableActions\n .map(action => BulkActionName.from(action.name))\n .join(\"\\n \");\n\n const modelPlugin = new CmsGraphQLSchemaPlugin<HcmsBulkActionsContext>({\n typeDefs: /* GraphQL */ `\n enum BulkAction${model.singularApiName}Name {\n _empty\n ${enumValues}\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 resolvers: {\n Mutation: {\n [`bulkAction${model.singularApiName}`]: async (_, args, context) => {\n const identity = context.container\n .resolve(IdentityContext)\n .getIdentity();\n\n const response = await context.container\n .resolve(TriggerTaskUseCase)\n .execute({\n definition: BULK_ACTION_LIST_TASK_ID,\n input: {\n actionName: args.action,\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 modelPlugin.name = `headless-cms.graphql.schema.bulkAction.${model.modelId}`;\n plugins.push(modelPlugin);\n }\n\n return plugins;\n }\n}\n\nexport const BulkActionsGraphQLSchema = CmsGraphQLSchemaFactory.createImplementation({\n implementation: BulkActionsGraphQLSchemaImpl,\n dependencies: [RequestContainer]\n});\n"],"names":["BulkActionsGraphQLSchemaImpl","container","context","tenantCtx","TenantContext","tenant","isHeadlessCmsReady","identityCtx","IdentityContext","modelsResult","ListModelsUseCase","allModels","model","tags","Array","CMS_MODEL_SINGLETON_TAG","bulkActions","EntriesBulkAction","plugins","defaultPlugin","CmsGraphQLSchemaPlugin","applicableActions","action","enumValues","BulkActionName","modelPlugin","_","args","identity","response","TriggerTaskUseCase","BULK_ACTION_LIST_TASK_ID","Response","BulkActionsGraphQLSchema","CmsGraphQLSchemaFactory","RequestContainer"],"mappings":";;;;;;;;;;;AAkBA,MAAMA;IACF,YAA6BC,SAAoB,CAAE;aAAtBA,SAAS,GAATA;IAAuB;IAEpD,MAAM,UAAU;QACZ,MAAMC,UAAU;YAAE,WAAW,IAAI,CAAC,SAAS;QAAC;QAC5C,MAAMC,YAAY,IAAI,CAAC,SAAS,CAAC,OAAO,CAACC;QACzC,MAAMC,SAASF,UAAU,SAAS;QAElC,IAAI,CAAE,MAAMG,mBAAmBJ,UAC3B,OAAO,EAAE;QAGb,MAAMK,cAAc,IAAI,CAAC,SAAS,CAAC,OAAO,CAACC;QAC3C,MAAMC,eAAe,MAAMF,YAAY,oBAAoB,CAAC,UACjD,IAAI,CAAC,SAAS,CAAC,OAAO,CAACG,mBAAmB,OAAO;QAG5D,IAAID,aAAa,MAAM,IACnB,OAAO,EAAE;QAGb,MAAME,YAAYF,aAAa,KAAK,CAAC,MAAM,CAACG,CAAAA;YACxC,IAAIA,MAAM,SAAS,EACf,OAAO;YAEX,MAAMC,OAAOC,MAAM,OAAO,CAACF,MAAM,IAAI,IAAIA,MAAM,IAAI,GAAG,EAAE;YACxD,OAAO,CAACC,KAAK,QAAQ,CAACE;QAC1B;QAEA,MAAMC,cAAc,IAAI,CAAC,SAAS,CAAC,UAAU,CAACC;QAC9C,MAAMC,UAA4D,EAAE;QAEpE,MAAMC,gBAAgB,IAAIC,uBAAuB;YAC7C,UAAwB,CAAC;;;;;;;;;YASzB,CAAC;QACL;QACAD,cAAc,IAAI,GAAG;QACrBD,QAAQ,IAAI,CAACC;QAEb,KAAK,MAAMP,SAASD,UAAW;YAC3B,MAAMU,oBAAoBL,YAAY,MAAM,CAACM,CAAAA;gBACzC,IAAIA,OAAO,QAAQ,EAAE,QACjB,OAAOA,OAAO,QAAQ,CAAC,QAAQ,CAACV,MAAM,OAAO;gBAEjD,OAAO;YACX;YAEA,MAAMW,aAAaF,kBACd,GAAG,CAACC,CAAAA,SAAUE,eAAe,IAAI,CAACF,OAAO,IAAI,GAC7C,IAAI,CAAC;YAEV,MAAMG,cAAc,IAAIL,uBAA+C;gBACnE,UAAwB,CAAC;mCACN,EAAER,MAAM,eAAe,CAAC;;wBAEnC,EAAEW,WAAW;;;;kCAIH,EAAEX,MAAM,eAAe,CAAC;8CACZ,EAAEA,MAAM,eAAe,CAAC;mCACnC,EAAEA,MAAM,eAAe,CAAC;;;;;gBAK3C,CAAC;gBACD,WAAW;oBACP,UAAU;wBACN,CAAC,CAAC,UAAU,EAAEA,MAAM,eAAe,EAAE,CAAC,EAAE,OAAOc,GAAGC,MAAMzB;4BACpD,MAAM0B,WAAW1B,QAAQ,SAAS,CAC7B,OAAO,CAACM,iBACR,WAAW;4BAEhB,MAAMqB,WAAW,MAAM3B,QAAQ,SAAS,CACnC,OAAO,CAAC4B,oBACR,OAAO,CAAC;gCACL,YAAYC;gCACZ,OAAO;oCACH,YAAYJ,KAAK,MAAM;oCACvB,SAASf,MAAM,OAAO;oCACtB,OAAOe,KAAK,KAAK;oCACjB,QAAQA,KAAK,MAAM;oCACnB,MAAMA,KAAK,IAAI;oCACfC;gCACJ;4BACJ;4BAEJ,OAAO,IAAII,SAAS;gCAChB,IAAIH,SAAS,KAAK,CAAC,EAAE;4BACzB;wBACJ;oBACJ;gBACJ;gBACA,cAAc3B,CAAAA,UACVA,QAAQ,SAAS,CAAC,OAAO,CAACE,eAAe,SAAS,GAAG,EAAE,KAAKC,OAAO,EAAE;YAC7E;YAEAoB,YAAY,IAAI,GAAG,CAAC,uCAAuC,EAAEb,MAAM,OAAO,EAAE;YAC5EM,QAAQ,IAAI,CAACO;QACjB;QAEA,OAAOP;IACX;AACJ;AAEO,MAAMe,2BAA2BC,wBAAwB,oBAAoB,CAAC;IACjF,gBAAgBlC;IAChB,cAAc;QAACmC;KAAiB;AACpC"}
|