@webiny/api-headless-cms-bulk-actions 6.3.0-beta.4 → 6.4.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/abstractions/IUseCase.js +0 -3
- package/abstractions/index.js +0 -3
- package/domain/BulkActionName.js +9 -15
- package/domain/BulkActionName.js.map +1 -1
- package/features/BulkActionContext/abstractions.js +2 -3
- package/features/BulkActionContext/abstractions.js.map +1 -1
- package/features/BulkActionContext/index.js +0 -2
- package/features/DeleteEntriesBulkAction/DeleteEntriesBulkAction.js +22 -20
- package/features/DeleteEntriesBulkAction/DeleteEntriesBulkAction.js.map +1 -1
- package/features/DeleteEntriesBulkAction/feature.js +6 -5
- package/features/DeleteEntriesBulkAction/feature.js.map +1 -1
- package/features/EntriesBulkAction/abstractions.js +3 -2
- package/features/EntriesBulkAction/abstractions.js.map +1 -1
- package/features/EntriesBulkAction/createBulkActionTasks.js +114 -131
- package/features/EntriesBulkAction/createBulkActionTasks.js.map +1 -1
- package/features/EntriesBulkAction/internals/ChildTasksCleanup.js +27 -64
- package/features/EntriesBulkAction/internals/ChildTasksCleanup.js.map +1 -1
- package/features/EntriesBulkAction/internals/CreateTasksByModel.js +68 -99
- package/features/EntriesBulkAction/internals/CreateTasksByModel.js.map +1 -1
- package/features/EntriesBulkAction/internals/ProcessTask.js +35 -68
- package/features/EntriesBulkAction/internals/ProcessTask.js.map +1 -1
- package/features/EntriesBulkAction/internals/ProcessTaskResult.js +20 -19
- package/features/EntriesBulkAction/internals/ProcessTaskResult.js.map +1 -1
- package/features/EntriesBulkAction/internals/ProcessTasksByModel.js +37 -50
- package/features/EntriesBulkAction/internals/ProcessTasksByModel.js.map +1 -1
- package/features/EntriesBulkAction/internals/TaskCache.js +30 -64
- package/features/EntriesBulkAction/internals/TaskCache.js.map +1 -1
- package/features/MoveToFolderBulkAction/MoveToFolderBulkAction.js +20 -20
- package/features/MoveToFolderBulkAction/MoveToFolderBulkAction.js.map +1 -1
- package/features/MoveToFolderBulkAction/feature.js +6 -5
- package/features/MoveToFolderBulkAction/feature.js.map +1 -1
- package/features/MoveToTrashBulkAction/MoveToTrashBulkAction.js +22 -20
- package/features/MoveToTrashBulkAction/MoveToTrashBulkAction.js.map +1 -1
- package/features/MoveToTrashBulkAction/feature.js +6 -5
- package/features/MoveToTrashBulkAction/feature.js.map +1 -1
- package/features/PublishEntriesBulkAction/PublishEntriesBulkAction.js +27 -28
- package/features/PublishEntriesBulkAction/PublishEntriesBulkAction.js.map +1 -1
- package/features/PublishEntriesBulkAction/feature.js +6 -5
- package/features/PublishEntriesBulkAction/feature.js.map +1 -1
- package/features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.js +20 -18
- package/features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.js.map +1 -1
- package/features/RestoreEntriesBulkAction/feature.js +6 -5
- package/features/RestoreEntriesBulkAction/feature.js.map +1 -1
- package/features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.js +20 -18
- package/features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.js.map +1 -1
- package/features/UnpublishEntriesBulkAction/feature.js +6 -5
- package/features/UnpublishEntriesBulkAction/feature.js.map +1 -1
- package/graphql/createBulkActionGraphQL.js +44 -51
- package/graphql/createBulkActionGraphQL.js.map +1 -1
- package/graphql/createDefaultGraphQL.js +30 -34
- package/graphql/createDefaultGraphQL.js.map +1 -1
- package/handlers/eventBridgeEventHandler.js +23 -41
- package/handlers/eventBridgeEventHandler.js.map +1 -1
- package/handlers/index.js +5 -3
- package/handlers/index.js.map +1 -1
- package/handlers/setupEventsTenant.js +7 -9
- package/handlers/setupEventsTenant.js.map +1 -1
- package/index.js +29 -33
- package/index.js.map +1 -1
- package/package.json +17 -17
- package/tasks/EmptyTrashBinTaskDefinition.js +83 -109
- package/tasks/EmptyTrashBinTaskDefinition.js.map +1 -1
- package/tasks/createEmptyTrashBinsTask.js +4 -5
- package/tasks/createEmptyTrashBinsTask.js.map +1 -1
- package/tasks/index.js +0 -2
- package/types.js +7 -18
- package/types.js.map +1 -1
- package/abstractions/IUseCase.js.map +0 -1
- package/abstractions/index.js.map +0 -1
- package/features/BulkActionContext/index.js.map +0 -1
- package/tasks/index.js.map +0 -1
|
@@ -4,122 +4,96 @@ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/i
|
|
|
4
4
|
import { ListModelsUseCase } from "@webiny/api-headless-cms/features/contentModel/ListModels/index.js";
|
|
5
5
|
import { DeleteEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js";
|
|
6
6
|
import { ListDeletedEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js";
|
|
7
|
-
const calculateDateTimeString = ()
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
// Calculate the date-time by subtracting the retention period (in days) from the current date.
|
|
14
|
-
const currentDate = new Date();
|
|
15
|
-
currentDate.setDate(currentDate.getDate() - retentionPeriod);
|
|
16
|
-
|
|
17
|
-
// Return the calculated date-time string in ISO 8601 format.
|
|
18
|
-
return currentDate.toISOString();
|
|
7
|
+
const calculateDateTimeString = ()=>{
|
|
8
|
+
const retentionPeriodFromEnv = process.env["WEBINY_TRASH_BIN_RETENTION_PERIOD_DAYS"];
|
|
9
|
+
const retentionPeriod = retentionPeriodFromEnv && 0 !== Number(retentionPeriodFromEnv) ? Number(retentionPeriodFromEnv) : 90;
|
|
10
|
+
const currentDate = new Date();
|
|
11
|
+
currentDate.setDate(currentDate.getDate() - retentionPeriod);
|
|
12
|
+
return currentDate.toISOString();
|
|
19
13
|
};
|
|
20
14
|
class EmptyTrashBinTask {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
input,
|
|
38
|
-
controller
|
|
39
|
-
} = params;
|
|
40
|
-
|
|
41
|
-
// Abort the task if needed.
|
|
42
|
-
if (controller.runtime.isAborted()) {
|
|
43
|
-
return controller.response.aborted();
|
|
15
|
+
constructor(tenantContext, listTenants, listModels, listDeletedEntries, deleteEntry){
|
|
16
|
+
this.tenantContext = tenantContext;
|
|
17
|
+
this.listTenants = listTenants;
|
|
18
|
+
this.listModels = listModels;
|
|
19
|
+
this.listDeletedEntries = listDeletedEntries;
|
|
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
|
+
];
|
|
44
31
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
if (controller.runtime.isCloseToTimeout()) {
|
|
60
|
-
shouldTaskContinue = true;
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// List all non-private models.
|
|
65
|
-
const modelsResult = await this.listModels.execute({
|
|
66
|
-
includePrivate: false
|
|
67
|
-
});
|
|
68
|
-
const models = modelsResult.value;
|
|
69
|
-
|
|
70
|
-
// Process each model to delete trashed entries.
|
|
71
|
-
for (const model of models) {
|
|
72
|
-
// Query parameters for fetching deleted entries older than a minute ago.
|
|
73
|
-
const listEntriesParams = {
|
|
74
|
-
where: {
|
|
75
|
-
deletedOn_lt: calculateDateTimeString()
|
|
76
|
-
},
|
|
77
|
-
limit: 50
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
// Continue deleting entries while there are entries left to delete.
|
|
81
|
-
while (true) {
|
|
82
|
-
const listResult = await this.listDeletedEntries.execute(model, listEntriesParams);
|
|
83
|
-
const {
|
|
84
|
-
entries,
|
|
85
|
-
meta
|
|
86
|
-
} = listResult.value;
|
|
87
|
-
if (meta.totalCount === 0) {
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
if (controller.runtime.isCloseToTimeout()) {
|
|
91
|
-
shouldTaskContinue = true;
|
|
92
|
-
break;
|
|
93
|
-
}
|
|
94
|
-
for (const entry of entries) {
|
|
32
|
+
async run(params) {
|
|
33
|
+
const { input, controller } = params;
|
|
34
|
+
if (controller.runtime.isAborted()) return controller.response.aborted();
|
|
35
|
+
const tenantsResult = await this.listTenants.execute();
|
|
36
|
+
const baseTenants = tenantsResult.value;
|
|
37
|
+
const executedTenantIds = input.executedTenantIds || [];
|
|
38
|
+
const tenants = baseTenants.filter((tenant)=>!executedTenantIds.includes(tenant.id));
|
|
39
|
+
let shouldTaskContinue = false;
|
|
40
|
+
await this.tenantContext.withEachTenant(tenants, async (tenant)=>{
|
|
41
|
+
if (controller.runtime.isCloseToTimeout()) {
|
|
42
|
+
shouldTaskContinue = true;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
95
45
|
if (controller.runtime.isCloseToTimeout()) {
|
|
96
|
-
|
|
97
|
-
|
|
46
|
+
shouldTaskContinue = true;
|
|
47
|
+
return;
|
|
98
48
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
permanently: true
|
|
49
|
+
const modelsResult = await this.listModels.execute({
|
|
50
|
+
includePrivate: false
|
|
102
51
|
});
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
52
|
+
const models = modelsResult.value;
|
|
53
|
+
for (const model of models){
|
|
54
|
+
const listEntriesParams = {
|
|
55
|
+
where: {
|
|
56
|
+
deletedOn_lt: calculateDateTimeString()
|
|
57
|
+
},
|
|
58
|
+
limit: 50
|
|
59
|
+
};
|
|
60
|
+
while(true){
|
|
61
|
+
const listResult = await this.listDeletedEntries.execute(model, listEntriesParams);
|
|
62
|
+
const { entries, meta } = listResult.value;
|
|
63
|
+
if (0 === meta.totalCount) break;
|
|
64
|
+
if (controller.runtime.isCloseToTimeout()) {
|
|
65
|
+
shouldTaskContinue = true;
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
for (const entry of entries){
|
|
69
|
+
if (controller.runtime.isCloseToTimeout()) {
|
|
70
|
+
shouldTaskContinue = true;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
await this.deleteEntry.execute(model, entry.id, {
|
|
74
|
+
permanently: true
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (!shouldTaskContinue) executedTenantIds.push(tenant.id);
|
|
80
|
+
});
|
|
81
|
+
return shouldTaskContinue ? controller.response.continue({
|
|
82
|
+
...input,
|
|
83
|
+
executedTenantIds
|
|
84
|
+
}) : controller.response.done("Task done: emptied the trash bin for all registered models.");
|
|
85
|
+
}
|
|
119
86
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
87
|
+
const EmptyTrashBinTaskDefinition = TaskDefinition.createImplementation({
|
|
88
|
+
implementation: EmptyTrashBinTask,
|
|
89
|
+
dependencies: [
|
|
90
|
+
TenantContext,
|
|
91
|
+
ListTenantsUseCase,
|
|
92
|
+
ListModelsUseCase,
|
|
93
|
+
ListDeletedEntriesUseCase,
|
|
94
|
+
DeleteEntryUseCase
|
|
95
|
+
]
|
|
123
96
|
});
|
|
97
|
+
export { EmptyTrashBinTaskDefinition };
|
|
124
98
|
|
|
125
99
|
//# sourceMappingURL=EmptyTrashBinTaskDefinition.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TaskDefinition","ListTenantsUseCase","TenantContext","ListModelsUseCase","DeleteEntryUseCase","ListDeletedEntriesUseCase","calculateDateTimeString","retentionPeriodFromEnv","process","env","retentionPeriod","Number","currentDate","Date","setDate","getDate","toISOString","EmptyTrashBinTask","isPrivate","id","title","description","maxIterations","databaseLogs","selfCleanup","constructor","tenantContext","listTenants","listModels","listDeletedEntries","deleteEntry","run","params","input","controller","runtime","isAborted","response","aborted","tenantsResult","execute","baseTenants","value","executedTenantIds","tenants","filter","tenant","includes","shouldTaskContinue","withEachTenant","isCloseToTimeout","modelsResult","includePrivate","models","model","listEntriesParams","where","deletedOn_lt","limit","listResult","entries","meta","totalCount","entry","permanently","push","continue","done","EmptyTrashBinTaskDefinition","createImplementation","implementation","dependencies"],"sources":["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"],"mappings":"AACA,SAASA,cAAc,QAAQ,wDAAwD;AACvF,SAASC,kBAAkB,QAAQ,wDAAwD;AAC3F,SAASC,aAAa,QAAQ,0DAA0D;AACxF,SAASC,iBAAiB,QAAQ,oEAAoE;AACtG,SAASC,kBAAkB,QAAQ,qEAAqE;AACxG,SAASC,yBAAyB,QAAQ,qEAAqE;AAE/G,MAAMC,uBAAuB,GAAGA,CAAA,KAAM;EAClC;EACA;EACA,MAAMC,sBAAsB,GAAGC,OAAO,CAACC,GAAG,CAAC,wCAAwC,CAAC;EACpF,MAAMC,eAAe,GACjBH,sBAAsB,IAAII,MAAM,CAACJ,sBAAsB,CAAC,KAAK,CAAC,GACxDI,MAAM,CAACJ,sBAAsB,CAAC,GAC9B,EAAE;;EAEZ;EACA,MAAMK,WAAW,GAAG,IAAIC,IAAI,CAAC,CAAC;EAC9BD,WAAW,CAACE,OAAO,CAACF,WAAW,CAACG,OAAO,CAAC,CAAC,GAAGL,eAAe,CAAC;;EAE5D;EACA,OAAOE,WAAW,CAACI,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,MAAMC,iBAAiB,CAGrB;EACkBC,SAAS,GAAG,IAAI;EAChBC,EAAE,GAAG,2BAA2B;EAChCC,KAAK,GAAG,qCAAqC;EAC7CC,WAAW,GACvB,mEAAmE;EACvDC,aAAa,GAAG,GAAG;EACnBC,YAAY,GAAG,KAAK;EAEpBC,WAAW,GAAG,CAAC,WAAW,EAAW,SAAS,CAAU;EAExEC,WAAWA,CACCC,aAAsC,EACtCC,WAAyC,EACzCC,UAAuC,EACvCC,kBAAuD,EACvDC,WAAyC,EACnD;IAAA,KALUJ,aAAsC,GAAtCA,aAAsC;IAAA,KACtCC,WAAyC,GAAzCA,WAAyC;IAAA,KACzCC,UAAuC,GAAvCA,UAAuC;IAAA,KACvCC,kBAAuD,GAAvDA,kBAAuD;IAAA,KACvDC,WAAyC,GAAzCA,WAAyC;EAClD;EAEH,MAAMC,GAAGA,CACLC,MAA6E,EACF;IAC3E,MAAM;MAAEC,KAAK;MAAEC;IAAW,CAAC,GAAGF,MAAM;;IAEpC;IACA,IAAIE,UAAU,CAACC,OAAO,CAACC,SAAS,CAAC,CAAC,EAAE;MAChC,OAAOF,UAAU,CAACG,QAAQ,CAACC,OAAO,CAAC,CAAC;IACxC;;IAEA;IACA,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACZ,WAAW,CAACa,OAAO,CAAC,CAAC;IACtD,MAAMC,WAAW,GAAGF,aAAa,CAACG,KAAK;IACvC,MAAMC,iBAAiB,GAAGV,KAAK,CAACU,iBAAiB,IAAI,EAAE;IACvD,MAAMC,OAAO,GAAGH,WAAW,CAACI,MAAM,CAACC,MAAM,IAAI,CAACH,iBAAiB,CAACI,QAAQ,CAACD,MAAM,CAAC3B,EAAE,CAAC,CAAC;IAEpF,IAAI6B,kBAAkB,GAAG,KAAK;;IAE9B;IACA,MAAM,IAAI,CAACtB,aAAa,CAACuB,cAAc,CAACL,OAAO,EAAE,MAAME,MAAM,IAAI;MAC7D,IAAIZ,UAAU,CAACC,OAAO,CAACe,gBAAgB,CAAC,CAAC,EAAE;QACvCF,kBAAkB,GAAG,IAAI;QACzB;MACJ;MAEA,IAAId,UAAU,CAACC,OAAO,CAACe,gBAAgB,CAAC,CAAC,EAAE;QACvCF,kBAAkB,GAAG,IAAI;QACzB;MACJ;;MAEA;MACA,MAAMG,YAAY,GAAG,MAAM,IAAI,CAACvB,UAAU,CAACY,OAAO,CAAC;QAAEY,cAAc,EAAE;MAAM,CAAC,CAAC;MAC7E,MAAMC,MAAM,GAAGF,YAAY,CAACT,KAAK;;MAEjC;MACA,KAAK,MAAMY,KAAK,IAAID,MAAM,EAAE;QACxB;QACA,MAAME,iBAAiB,GAAG;UACtBC,KAAK,EAAE;YACHC,YAAY,EAAEnD,uBAAuB,CAAC;UAC1C,CAAC;UACDoD,KAAK,EAAE;QACX,CAAC;;QAED;QACA,OAAO,IAAI,EAAE;UACT,MAAMC,UAAU,GAAG,MAAM,IAAI,CAAC9B,kBAAkB,CAACW,OAAO,CACpDc,KAAK,EACLC,iBACJ,CAAC;UACD,MAAM;YAAEK,OAAO;YAAEC;UAAK,CAAC,GAAGF,UAAU,CAACjB,KAAK;UAE1C,IAAImB,IAAI,CAACC,UAAU,KAAK,CAAC,EAAE;YACvB;UACJ;UAEA,IAAI5B,UAAU,CAACC,OAAO,CAACe,gBAAgB,CAAC,CAAC,EAAE;YACvCF,kBAAkB,GAAG,IAAI;YACzB;UACJ;UACA,KAAK,MAAMe,KAAK,IAAIH,OAAO,EAAE;YACzB,IAAI1B,UAAU,CAACC,OAAO,CAACe,gBAAgB,CAAC,CAAC,EAAE;cACvCF,kBAAkB,GAAG,IAAI;cACzB;YACJ;YACA;YACA,MAAM,IAAI,CAAClB,WAAW,CAACU,OAAO,CAACc,KAAK,EAAES,KAAK,CAAC5C,EAAE,EAAE;cAAE6C,WAAW,EAAE;YAAK,CAAC,CAAC;UAC1E;QACJ;MACJ;;MAEA;MACA,IAAI,CAAChB,kBAAkB,EAAE;QACrBL,iBAAiB,CAACsB,IAAI,CAACnB,MAAM,CAAC3B,EAAE,CAAC;MACrC;IACJ,CAAC,CAAC;;IAEF;IACA,OAAO6B,kBAAkB,GACnBd,UAAU,CAACG,QAAQ,CAAC6B,QAAQ,CAAC;MAAE,GAAGjC,KAAK;MAAEU;IAAkB,CAAC,CAAC,GAC7DT,UAAU,CAACG,QAAQ,CAAC8B,IAAI,CACpB,6DACJ,CAAC;EACX;AACJ;AAEA,OAAO,MAAMC,2BAA2B,GAAGpE,cAAc,CAACqE,oBAAoB,CAAC;EAC3EC,cAAc,EAAErD,iBAAiB;EACjCsD,YAAY,EAAE,CACVrE,aAAa,EACbD,kBAAkB,EAClBE,iBAAiB,EACjBE,yBAAyB,EACzBD,kBAAkB;AAE1B,CAAC,CAAC","ignoreList":[]}
|
|
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"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { createContextPlugin } from "@webiny/api";
|
|
2
2
|
import { EmptyTrashBinTaskDefinition } from "./EmptyTrashBinTaskDefinition.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
};
|
|
3
|
+
const createEmptyTrashBinsTask = ()=>createContextPlugin((context)=>{
|
|
4
|
+
context.container.register(EmptyTrashBinTaskDefinition);
|
|
5
|
+
});
|
|
6
|
+
export { createEmptyTrashBinsTask };
|
|
8
7
|
|
|
9
8
|
//# sourceMappingURL=createEmptyTrashBinsTask.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"tasks/createEmptyTrashBinsTask.js","sources":["../../src/tasks/createEmptyTrashBinsTask.ts"],"sourcesContent":["import { createContextPlugin } from \"@webiny/api\";\nimport { EmptyTrashBinTaskDefinition } from \"./EmptyTrashBinTaskDefinition.js\";\n\nexport const createEmptyTrashBinsTask = () => {\n return createContextPlugin(context => {\n context.container.register(EmptyTrashBinTaskDefinition);\n });\n};\n"],"names":["createEmptyTrashBinsTask","createContextPlugin","context","EmptyTrashBinTaskDefinition"],"mappings":";;AAGO,MAAMA,2BAA2B,IAC7BC,oBAAoBC,CAAAA;QACvBA,QAAQ,SAAS,CAAC,QAAQ,CAACC;IAC/B"}
|
package/tasks/index.js
CHANGED
package/types.js
CHANGED
|
@@ -1,21 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
export let BulkActionOperationByModelAction = /*#__PURE__*/function (BulkActionOperationByModelAction) {
|
|
10
|
-
BulkActionOperationByModelAction["CREATE_SUBTASKS"] = "CREATE_SUBTASKS";
|
|
11
|
-
BulkActionOperationByModelAction["CHECK_MORE_SUBTASKS"] = "CHECK_MORE_SUBTASKS";
|
|
12
|
-
BulkActionOperationByModelAction["PROCESS_SUBTASKS"] = "PROCESS_SUBTASKS";
|
|
13
|
-
BulkActionOperationByModelAction["END_TASK"] = "END_TASK";
|
|
14
|
-
return BulkActionOperationByModelAction;
|
|
1
|
+
var types_BulkActionOperationByModelAction = /*#__PURE__*/ function(BulkActionOperationByModelAction) {
|
|
2
|
+
BulkActionOperationByModelAction["CREATE_SUBTASKS"] = "CREATE_SUBTASKS";
|
|
3
|
+
BulkActionOperationByModelAction["CHECK_MORE_SUBTASKS"] = "CHECK_MORE_SUBTASKS";
|
|
4
|
+
BulkActionOperationByModelAction["PROCESS_SUBTASKS"] = "PROCESS_SUBTASKS";
|
|
5
|
+
BulkActionOperationByModelAction["END_TASK"] = "END_TASK";
|
|
6
|
+
return BulkActionOperationByModelAction;
|
|
15
7
|
}({});
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Empty Trash Bin
|
|
19
|
-
*/
|
|
8
|
+
export { types_BulkActionOperationByModelAction as BulkActionOperationByModelAction };
|
|
20
9
|
|
|
21
10
|
//# sourceMappingURL=types.js.map
|
package/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["import type { CmsContext } from \"@webiny/api-headless-cms/types/index.js\";\nimport type { Context as BaseContext } from \"@webiny/handler/types.js\";\nimport type { Context as TasksContext, ITaskIdentity } from \"@webiny/tasks/types.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nexport interface HcmsBulkActionsContext extends BaseContext, CmsContext, TasksContext {}\n\n/**\n * Bulk Action Operation\n */\n\nexport interface IBulkActionOperationInput {\n modelId: string;\n ids: string[];\n data?: Record<string, any>;\n identity: ITaskIdentity;\n done?: string[];\n failed?: string[];\n}\n\nexport interface IBulkActionOperationOutput {\n done: string[];\n failed: string[];\n}\n\nexport type IBulkActionOperationTaskParams = TaskDefinition.RunParams<\n IBulkActionOperationInput,\n IBulkActionOperationOutput\n>;\n\n/**\n * Bulk Action Operation By Model\n */\n\nexport enum BulkActionOperationByModelAction {\n CREATE_SUBTASKS = \"CREATE_SUBTASKS\",\n CHECK_MORE_SUBTASKS = \"CHECK_MORE_SUBTASKS\",\n PROCESS_SUBTASKS = \"PROCESS_SUBTASKS\",\n END_TASK = \"END_TASK\"\n}\n\nexport interface IBulkActionOperationByModelInput {\n modelId: string;\n identity?: ITaskIdentity;\n where?: Record<string, any>;\n search?: string;\n after?: string | null;\n data?: Record<string, any>;\n action?: BulkActionOperationByModelAction;\n}\n\nexport interface IBulkActionOperationByModelOutput {\n done: string[];\n failed: string[];\n}\n\nexport type IBulkActionOperationByModelTaskParams = TaskDefinition.RunParams<\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput\n>;\n\n/**\n * Empty Trash Bin\n */\n\nexport interface IEmptyTrashBinsInput {\n executedTenantIds?: string[] | null;\n}\n\nexport type IEmptyTrashBinsOutput = TaskDefinition.ResultDone;\n\nexport type IEmptyTrashBinsTaskParams = TaskDefinition.RunParams<\n IEmptyTrashBinsInput,\n IEmptyTrashBinsOutput\n>;\n"],"names":["BulkActionOperationByModelAction"],"mappings":"AAkCO,IAAKA,yCAAgCA,WAAAA,GAAAA,SAAhCA,gCAAgC;;;;;WAAhCA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["IUseCase.ts"],"sourcesContent":["export interface IUseCase<TInput, TOutput> {\n execute(params: TInput): Promise<TOutput>;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export type { IUseCase } from \"./IUseCase.js\";\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./abstractions.js\";\n"],"mappings":"AAAA","ignoreList":[]}
|
package/tasks/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./createEmptyTrashBinsTask.js\";\n"],"mappings":"AAAA","ignoreList":[]}
|