@webiny/api-headless-cms-bulk-actions 6.3.0-beta.1 → 6.3.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -27,6 +27,7 @@ export const createBulkActionTasks = (bulkAction, bulkActionsConfig) => {
27
27
  maxIterations = 500;
28
28
  databaseLogs = false;
29
29
  isPrivate = true;
30
+ selfCleanup = ["onSuccess", "onAbort"];
30
31
  constructor(context, getModel) {
31
32
  this.context = context;
32
33
  this.getModel = getModel;
@@ -109,6 +110,7 @@ export const createBulkActionTasks = (bulkAction, bulkActionsConfig) => {
109
110
  maxIterations = 2;
110
111
  databaseLogs = false;
111
112
  isPrivate = true;
113
+ selfCleanup = ["onSuccess", "onAbort"];
112
114
  constructor(getModel) {
113
115
  this.getModel = getModel;
114
116
  }
@@ -1 +1 @@
1
- {"version":3,"names":["createFeature","TaskDefinition","GetModelUseCase","BulkActionContext","BulkActionName","ChildTasksCleanup","ProcessTask","CreateTasksByModel","ProcessTasksByModel","BulkActionOperationByModelAction","createBulkActionTasks","bulkAction","bulkActionsConfig","bulkActionName","from","name","batchSize","listTaskId","processTaskId","BulkActionListTask","id","title","maxIterations","databaseLogs","isPrivate","constructor","context","getModel","run","input","controller","modelId","response","error","action","CREATE_SUBTASKS","PROCESS_SUBTASKS","processTasks","execute","CHECK_MORE_SUBTASKS","createTasks","END_TASK","done","ex","message","onDone","task","cleanup","onError","onAbort","onMaxIterations","childTasksCleanup","console","BulkActionProcessTask","processTask","BulkListTask","createImplementation","implementation","dependencies","BulkProcessTask","register","container"],"sources":["createBulkActionTasks.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { BulkActionContext } from \"~/features/BulkActionContext/index.js\";\nimport type {\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput,\n IBulkActionOperationInput,\n IBulkActionOperationOutput\n} from \"~/types.js\";\nimport { EntriesBulkAction, EntriesBulkActionConfig } from \"./abstractions.js\";\nimport { BulkActionName } from \"~/domain/BulkActionName.js\";\nimport { ChildTasksCleanup } from \"./internals/ChildTasksCleanup.js\";\nimport { ProcessTask } from \"./internals/ProcessTask.js\";\nimport { CreateTasksByModel } from \"./internals/CreateTasksByModel.js\";\nimport { ProcessTasksByModel } from \"./internals/ProcessTasksByModel.js\";\n\nenum BulkActionOperationByModelAction {\n CREATE_SUBTASKS = \"CREATE_SUBTASKS\",\n CHECK_MORE_SUBTASKS = \"CHECK_MORE_SUBTASKS\",\n PROCESS_SUBTASKS = \"PROCESS_SUBTASKS\",\n END_TASK = \"END_TASK\"\n}\n\nexport const createBulkActionTasks = (\n bulkAction: EntriesBulkAction.Interface,\n bulkActionsConfig: EntriesBulkActionConfig.Interface\n) => {\n const bulkActionName = BulkActionName.from(bulkAction.name);\n const batchSize = bulkAction.batchSize ?? bulkActionsConfig.batchSize ?? 100;\n const listTaskId = `hcmsBulkList${bulkActionName}Entries`;\n const processTaskId = `hcmsBulkProcess${bulkActionName}Entries`;\n\n // List Task - manages pagination and creates subtasks\n class BulkActionListTask implements TaskDefinition.Interface<\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput\n > {\n public readonly id = listTaskId;\n public readonly title = `Headless CMS: list \"${bulkActionName}\" entries by model`;\n public readonly maxIterations = 500;\n public readonly databaseLogs = false;\n public readonly isPrivate = true;\n public readonly context: BulkActionContext.Interface;\n public readonly getModel: GetModelUseCase.Interface;\n\n constructor(context: BulkActionContext.Interface, getModel: GetModelUseCase.Interface) {\n this.context = context;\n this.getModel = getModel;\n }\n\n async run({\n input,\n controller\n }: TaskDefinition.RunParams<\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput\n >) {\n try {\n if (!input.modelId) {\n return controller.response.error(`Missing \"modelId\" in the input.`);\n }\n\n const action = input.action ?? BulkActionOperationByModelAction.CREATE_SUBTASKS;\n\n switch (action) {\n case BulkActionOperationByModelAction.PROCESS_SUBTASKS: {\n const processTasks = new ProcessTasksByModel(this.context, processTaskId);\n return await processTasks.execute({ input, controller });\n }\n case BulkActionOperationByModelAction.CREATE_SUBTASKS:\n case BulkActionOperationByModelAction.CHECK_MORE_SUBTASKS: {\n const createTasks = new CreateTasksByModel(\n this.context,\n this.getModel,\n bulkAction,\n processTaskId,\n batchSize\n );\n return await createTasks.execute({ input, controller });\n }\n case BulkActionOperationByModelAction.END_TASK: {\n return controller.response.done(\n `Task done: task \"${processTaskId}\" has been successfully processed for entries from \"${\n input.modelId\n }\" model.`\n );\n }\n default:\n return controller.response.error(`Unknown action: ${action}`);\n }\n } catch (ex) {\n return controller.response.error(ex.message ?? \"Error while executing list task\");\n }\n }\n\n async onDone({ task }: TaskDefinition.LifecycleHookParams): Promise<void> {\n await this.cleanup(task);\n }\n\n async onError({ task }: TaskDefinition.LifecycleHookParams) {\n await this.cleanup(task);\n }\n\n async onAbort({ task }: TaskDefinition.LifecycleHookParams) {\n await this.cleanup(task);\n }\n\n async onMaxIterations({ task }: TaskDefinition.LifecycleHookParams) {\n await this.cleanup(task);\n }\n\n async cleanup(task: TaskDefinition.Task) {\n const childTasksCleanup = new ChildTasksCleanup();\n try {\n await childTasksCleanup.execute({ context: this.context, task });\n } catch (ex) {\n console.error(`Error while cleaning \"${listTaskId}\" child tasks.`, ex);\n }\n }\n }\n\n // Process Task - processes individual batches of entries\n class BulkActionProcessTask implements TaskDefinition.Interface<\n IBulkActionOperationInput,\n IBulkActionOperationOutput\n > {\n public readonly id = processTaskId;\n public readonly title = `Headless CMS: process \"${bulkActionName}\" entries`;\n public readonly maxIterations = 2;\n public readonly databaseLogs = false;\n public readonly isPrivate = true;\n public readonly getModel: GetModelUseCase.Interface;\n\n constructor(getModel: GetModelUseCase.Interface) {\n this.getModel = getModel;\n }\n\n async run({\n input,\n controller\n }: TaskDefinition.RunParams<IBulkActionOperationInput, IBulkActionOperationOutput>) {\n try {\n const processTask = new ProcessTask(bulkAction, this.getModel);\n return await processTask.execute({ input, controller });\n } catch (ex) {\n return controller.response.error(\n ex.message ?? \"Error while executing process task\"\n );\n }\n }\n }\n\n const BulkListTask = TaskDefinition.createImplementation({\n implementation: BulkActionListTask,\n dependencies: [BulkActionContext, GetModelUseCase]\n });\n\n const BulkProcessTask = TaskDefinition.createImplementation({\n implementation: BulkActionProcessTask,\n dependencies: [GetModelUseCase]\n });\n\n return createFeature({\n name: `HeadlessCms/BulkActionTasks/${bulkActionName}`,\n register(container) {\n container.register(BulkListTask);\n container.register(BulkProcessTask);\n }\n });\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["createFeature","TaskDefinition","GetModelUseCase","BulkActionContext","BulkActionName","ChildTasksCleanup","ProcessTask","CreateTasksByModel","ProcessTasksByModel","BulkActionOperationByModelAction","createBulkActionTasks","bulkAction","bulkActionsConfig","bulkActionName","from","name","batchSize","listTaskId","processTaskId","BulkActionListTask","id","title","maxIterations","databaseLogs","isPrivate","selfCleanup","constructor","context","getModel","run","input","controller","modelId","response","error","action","CREATE_SUBTASKS","PROCESS_SUBTASKS","processTasks","execute","CHECK_MORE_SUBTASKS","createTasks","END_TASK","done","ex","message","onDone","task","cleanup","onError","onAbort","onMaxIterations","childTasksCleanup","console","BulkActionProcessTask","processTask","BulkListTask","createImplementation","implementation","dependencies","BulkProcessTask","register","container"],"sources":["createBulkActionTasks.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { BulkActionContext } from \"~/features/BulkActionContext/index.js\";\nimport type {\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput,\n IBulkActionOperationInput,\n IBulkActionOperationOutput\n} from \"~/types.js\";\nimport { EntriesBulkAction, EntriesBulkActionConfig } from \"./abstractions.js\";\nimport { BulkActionName } from \"~/domain/BulkActionName.js\";\nimport { ChildTasksCleanup } from \"./internals/ChildTasksCleanup.js\";\nimport { ProcessTask } from \"./internals/ProcessTask.js\";\nimport { CreateTasksByModel } from \"./internals/CreateTasksByModel.js\";\nimport { ProcessTasksByModel } from \"./internals/ProcessTasksByModel.js\";\n\nenum BulkActionOperationByModelAction {\n CREATE_SUBTASKS = \"CREATE_SUBTASKS\",\n CHECK_MORE_SUBTASKS = \"CHECK_MORE_SUBTASKS\",\n PROCESS_SUBTASKS = \"PROCESS_SUBTASKS\",\n END_TASK = \"END_TASK\"\n}\n\nexport const createBulkActionTasks = (\n bulkAction: EntriesBulkAction.Interface,\n bulkActionsConfig: EntriesBulkActionConfig.Interface\n) => {\n const bulkActionName = BulkActionName.from(bulkAction.name);\n const batchSize = bulkAction.batchSize ?? bulkActionsConfig.batchSize ?? 100;\n const listTaskId = `hcmsBulkList${bulkActionName}Entries`;\n const processTaskId = `hcmsBulkProcess${bulkActionName}Entries`;\n\n // List Task - manages pagination and creates subtasks\n class BulkActionListTask implements TaskDefinition.Interface<\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput\n > {\n public readonly id = listTaskId;\n public readonly title = `Headless CMS: list \"${bulkActionName}\" entries by model`;\n public readonly maxIterations = 500;\n public readonly databaseLogs = false;\n public readonly isPrivate = true;\n public readonly context: BulkActionContext.Interface;\n public readonly getModel: GetModelUseCase.Interface;\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n constructor(context: BulkActionContext.Interface, getModel: GetModelUseCase.Interface) {\n this.context = context;\n this.getModel = getModel;\n }\n\n async run({\n input,\n controller\n }: TaskDefinition.RunParams<\n IBulkActionOperationByModelInput,\n IBulkActionOperationByModelOutput\n >) {\n try {\n if (!input.modelId) {\n return controller.response.error(`Missing \"modelId\" in the input.`);\n }\n\n const action = input.action ?? BulkActionOperationByModelAction.CREATE_SUBTASKS;\n\n switch (action) {\n case BulkActionOperationByModelAction.PROCESS_SUBTASKS: {\n const processTasks = new ProcessTasksByModel(this.context, processTaskId);\n return await processTasks.execute({ input, controller });\n }\n case BulkActionOperationByModelAction.CREATE_SUBTASKS:\n case BulkActionOperationByModelAction.CHECK_MORE_SUBTASKS: {\n const createTasks = new CreateTasksByModel(\n this.context,\n this.getModel,\n bulkAction,\n processTaskId,\n batchSize\n );\n return await createTasks.execute({ input, controller });\n }\n case BulkActionOperationByModelAction.END_TASK: {\n return controller.response.done(\n `Task done: task \"${processTaskId}\" has been successfully processed for entries from \"${\n input.modelId\n }\" model.`\n );\n }\n default:\n return controller.response.error(`Unknown action: ${action}`);\n }\n } catch (ex) {\n return controller.response.error(ex.message ?? \"Error while executing list task\");\n }\n }\n\n async onDone({ task }: TaskDefinition.LifecycleHookParams): Promise<void> {\n await this.cleanup(task);\n }\n\n async onError({ task }: TaskDefinition.LifecycleHookParams) {\n await this.cleanup(task);\n }\n\n async onAbort({ task }: TaskDefinition.LifecycleHookParams) {\n await this.cleanup(task);\n }\n\n async onMaxIterations({ task }: TaskDefinition.LifecycleHookParams) {\n await this.cleanup(task);\n }\n\n async cleanup(task: TaskDefinition.Task) {\n const childTasksCleanup = new ChildTasksCleanup();\n try {\n await childTasksCleanup.execute({ context: this.context, task });\n } catch (ex) {\n console.error(`Error while cleaning \"${listTaskId}\" child tasks.`, ex);\n }\n }\n }\n\n // Process Task - processes individual batches of entries\n class BulkActionProcessTask implements TaskDefinition.Interface<\n IBulkActionOperationInput,\n IBulkActionOperationOutput\n > {\n public readonly id = processTaskId;\n public readonly title = `Headless CMS: process \"${bulkActionName}\" entries`;\n public readonly maxIterations = 2;\n public readonly databaseLogs = false;\n public readonly isPrivate = true;\n public readonly getModel: GetModelUseCase.Interface;\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n constructor(getModel: GetModelUseCase.Interface) {\n this.getModel = getModel;\n }\n\n async run({\n input,\n controller\n }: TaskDefinition.RunParams<IBulkActionOperationInput, IBulkActionOperationOutput>) {\n try {\n const processTask = new ProcessTask(bulkAction, this.getModel);\n return await processTask.execute({ input, controller });\n } catch (ex) {\n return controller.response.error(\n ex.message ?? \"Error while executing process task\"\n );\n }\n }\n }\n\n const BulkListTask = TaskDefinition.createImplementation({\n implementation: BulkActionListTask,\n dependencies: [BulkActionContext, GetModelUseCase]\n });\n\n const BulkProcessTask = TaskDefinition.createImplementation({\n implementation: BulkActionProcessTask,\n dependencies: [GetModelUseCase]\n });\n\n return createFeature({\n name: `HeadlessCms/BulkActionTasks/${bulkActionName}`,\n register(container) {\n container.register(BulkListTask);\n container.register(BulkProcessTask);\n }\n });\n};\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@webiny/api-headless-cms-bulk-actions",
3
- "version": "6.3.0-beta.1",
3
+ "version": "6.3.0-beta.3",
4
4
  "type": "module",
5
- "main": "index.js",
5
+ "exports": {
6
+ ".": "./index.js",
7
+ "./*": "./*"
8
+ },
6
9
  "description": "Webiny Headless CMS bulk actions",
7
10
  "keywords": [
8
11
  "api-headless-cms-bulk-actions:base"
@@ -14,28 +17,28 @@
14
17
  },
15
18
  "license": "MIT",
16
19
  "dependencies": {
17
- "@webiny/api-headless-cms": "6.3.0-beta.1",
18
- "@webiny/feature": "6.3.0-beta.1",
19
- "@webiny/handler": "6.3.0-beta.1",
20
- "@webiny/handler-aws": "6.3.0-beta.1",
21
- "@webiny/tasks": "6.3.0-beta.1",
22
- "@webiny/utils": "6.3.0-beta.1"
20
+ "@webiny/api-headless-cms": "6.3.0-beta.3",
21
+ "@webiny/feature": "6.3.0-beta.3",
22
+ "@webiny/handler": "6.3.0-beta.3",
23
+ "@webiny/handler-aws": "6.3.0-beta.3",
24
+ "@webiny/tasks": "6.3.0-beta.3",
25
+ "@webiny/utils": "6.3.0-beta.3"
23
26
  },
24
27
  "devDependencies": {
25
- "@webiny/api": "6.3.0-beta.1",
26
- "@webiny/api-core": "6.3.0-beta.1",
27
- "@webiny/build-tools": "6.3.0-beta.1",
28
- "@webiny/handler-graphql": "6.3.0-beta.1",
29
- "@webiny/plugins": "6.3.0-beta.1",
30
- "@webiny/project-utils": "6.3.0-beta.1",
31
- "@webiny/wcp": "6.3.0-beta.1",
28
+ "@webiny/api": "6.3.0-beta.3",
29
+ "@webiny/api-core": "6.3.0-beta.3",
30
+ "@webiny/build-tools": "6.3.0-beta.3",
31
+ "@webiny/handler-graphql": "6.3.0-beta.3",
32
+ "@webiny/plugins": "6.3.0-beta.3",
33
+ "@webiny/project-utils": "6.3.0-beta.3",
34
+ "@webiny/wcp": "6.3.0-beta.3",
32
35
  "graphql": "16.13.2",
33
36
  "typescript": "6.0.3",
34
- "vitest": "4.1.4"
37
+ "vitest": "4.1.5"
35
38
  },
36
39
  "publishConfig": {
37
40
  "access": "public",
38
41
  "directory": "dist"
39
42
  },
40
- "gitHead": "664b273a9f0a971f9ca7e6ffe920db77fefdced1"
43
+ "gitHead": "e154ec3326903876c357d35422dc60d29e061419"
41
44
  }
@@ -17,6 +17,7 @@ declare class EmptyTrashBinTask implements TaskDefinition.Interface<IEmptyTrashB
17
17
  readonly description = "Delete all entries in the trash bin for each model in the system.";
18
18
  readonly maxIterations = 120;
19
19
  readonly databaseLogs = false;
20
+ readonly selfCleanup: ("onSuccess" | "onAbort")[];
20
21
  constructor(tenantContext: TenantContext.Interface, listTenants: ListTenantsUseCase.Interface, listModels: ListModelsUseCase.Interface, listDeletedEntries: ListDeletedEntriesUseCase.Interface, deleteEntry: DeleteEntryUseCase.Interface);
21
22
  run(params: TaskDefinition.RunParams<IEmptyTrashBinsInput, IEmptyTrashBinsOutput>): Promise<TaskDefinition.Result<IEmptyTrashBinsInput, IEmptyTrashBinsOutput>>;
22
23
  }
@@ -24,6 +24,7 @@ class EmptyTrashBinTask {
24
24
  description = "Delete all entries in the trash bin for each model in the system.";
25
25
  maxIterations = 120;
26
26
  databaseLogs = false;
27
+ selfCleanup = ["onSuccess", "onAbort"];
27
28
  constructor(tenantContext, listTenants, listModels, listDeletedEntries, deleteEntry) {
28
29
  this.tenantContext = tenantContext;
29
30
  this.listTenants = listTenants;
@@ -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","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 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":"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","ignoreList":[]}
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":"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","ignoreList":[]}