@webiny/background-tasks 6.5.0-beta.1 → 6.5.0-beta.11

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.
@@ -6,7 +6,8 @@ class TaskLogPrivateModelImpl {
6
6
  return [
7
7
  builder.private({
8
8
  modelId: WEBINY_TASK_LOG_MODEL_ID,
9
- name: "Webiny Task Log"
9
+ name: "Webiny Task Log",
10
+ lifecycleEvents: false
10
11
  }).fields((fields)=>({
11
12
  executionName: fields.text().label("Execution Name"),
12
13
  task: fields.text().label("Task").required("Task is required."),
@@ -1 +1 @@
1
- {"version":3,"file":"api/crud/TaskLogPrivateModel.js","sources":["../../../src/api/crud/TaskLogPrivateModel.ts"],"sourcesContent":["import { ModelFactory } from \"@webiny/api-headless-cms/features/modelBuilder/index.js\";\nimport { TaskLogItemType } from \"~/api/types.js\";\n\nexport const WEBINY_TASK_LOG_MODEL_ID = \"wbyTaskLog\";\n\nclass TaskLogPrivateModelImpl implements ModelFactory.Interface {\n public async execute(builder: ModelFactory.Builder) {\n return [\n builder\n .private({\n modelId: WEBINY_TASK_LOG_MODEL_ID,\n name: \"Webiny Task Log\"\n })\n .fields(fields => ({\n executionName: fields.text().label(\"Execution Name\"),\n task: fields.text().label(\"Task\").required(\"Task is required.\"),\n iteration: fields\n .number()\n .label(\"Iteration\")\n .required(\"Iteration is required.\"),\n items: fields\n .object()\n .label(\"Items\")\n .list()\n .required(\"Items is required.\")\n .fields(fields => ({\n message: fields\n .text()\n .label(\"Message\")\n .required(\"Message is required.\"),\n createdOn: fields\n .datetime()\n .label(\"Created On\")\n .required(\"Created On is required.\"),\n type: fields\n .text()\n .label(\"Type\")\n .required(\"Type is required.\")\n .predefinedValues([\n {\n value: TaskLogItemType.INFO,\n label: \"Info\"\n },\n {\n value: TaskLogItemType.ERROR,\n label: \"Error\"\n }\n ]),\n data: fields.json().label(\"Data\"),\n error: fields.json().label(\"Error\")\n }))\n }))\n ];\n }\n}\n\nexport const TaskLogPrivateModel = ModelFactory.createImplementation({\n implementation: TaskLogPrivateModelImpl,\n dependencies: []\n});\n"],"names":["WEBINY_TASK_LOG_MODEL_ID","TaskLogPrivateModelImpl","builder","fields","TaskLogItemType","TaskLogPrivateModel","ModelFactory"],"mappings":";;AAGO,MAAMA,2BAA2B;AAExC,MAAMC;IACF,MAAa,QAAQC,OAA6B,EAAE;QAChD,OAAO;YACHA,QACK,OAAO,CAAC;gBACL,SAASF;gBACT,MAAM;YACV,GACC,MAAM,CAACG,CAAAA,SAAW;oBACf,eAAeA,OAAO,IAAI,GAAG,KAAK,CAAC;oBACnC,MAAMA,OAAO,IAAI,GAAG,KAAK,CAAC,QAAQ,QAAQ,CAAC;oBAC3C,WAAWA,OACN,MAAM,GACN,KAAK,CAAC,aACN,QAAQ,CAAC;oBACd,OAAOA,OACF,MAAM,GACN,KAAK,CAAC,SACN,IAAI,GACJ,QAAQ,CAAC,sBACT,MAAM,CAACA,CAAAA,SAAW;4BACf,SAASA,OACJ,IAAI,GACJ,KAAK,CAAC,WACN,QAAQ,CAAC;4BACd,WAAWA,OACN,QAAQ,GACR,KAAK,CAAC,cACN,QAAQ,CAAC;4BACd,MAAMA,OACD,IAAI,GACJ,KAAK,CAAC,QACN,QAAQ,CAAC,qBACT,gBAAgB,CAAC;gCACd;oCACI,OAAOC,gBAAgB,IAAI;oCAC3B,OAAO;gCACX;gCACA;oCACI,OAAOA,gBAAgB,KAAK;oCAC5B,OAAO;gCACX;6BACH;4BACL,MAAMD,OAAO,IAAI,GAAG,KAAK,CAAC;4BAC1B,OAAOA,OAAO,IAAI,GAAG,KAAK,CAAC;wBAC/B;gBACR;SACP;IACL;AACJ;AAEO,MAAME,sBAAsBC,aAAa,oBAAoB,CAAC;IACjE,gBAAgBL;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"api/crud/TaskLogPrivateModel.js","sources":["../../../src/api/crud/TaskLogPrivateModel.ts"],"sourcesContent":["import { ModelFactory } from \"@webiny/api-headless-cms/features/modelBuilder/index.js\";\nimport { TaskLogItemType } from \"~/api/types.js\";\n\nexport const WEBINY_TASK_LOG_MODEL_ID = \"wbyTaskLog\";\n\nclass TaskLogPrivateModelImpl implements ModelFactory.Interface {\n public async execute(builder: ModelFactory.Builder) {\n return [\n builder\n .private({\n modelId: WEBINY_TASK_LOG_MODEL_ID,\n name: \"Webiny Task Log\",\n lifecycleEvents: false\n })\n .fields(fields => ({\n executionName: fields.text().label(\"Execution Name\"),\n task: fields.text().label(\"Task\").required(\"Task is required.\"),\n iteration: fields\n .number()\n .label(\"Iteration\")\n .required(\"Iteration is required.\"),\n items: fields\n .object()\n .label(\"Items\")\n .list()\n .required(\"Items is required.\")\n .fields(fields => ({\n message: fields\n .text()\n .label(\"Message\")\n .required(\"Message is required.\"),\n createdOn: fields\n .datetime()\n .label(\"Created On\")\n .required(\"Created On is required.\"),\n type: fields\n .text()\n .label(\"Type\")\n .required(\"Type is required.\")\n .predefinedValues([\n {\n value: TaskLogItemType.INFO,\n label: \"Info\"\n },\n {\n value: TaskLogItemType.ERROR,\n label: \"Error\"\n }\n ]),\n data: fields.json().label(\"Data\"),\n error: fields.json().label(\"Error\")\n }))\n }))\n ];\n }\n}\n\nexport const TaskLogPrivateModel = ModelFactory.createImplementation({\n implementation: TaskLogPrivateModelImpl,\n dependencies: []\n});\n"],"names":["WEBINY_TASK_LOG_MODEL_ID","TaskLogPrivateModelImpl","builder","fields","TaskLogItemType","TaskLogPrivateModel","ModelFactory"],"mappings":";;AAGO,MAAMA,2BAA2B;AAExC,MAAMC;IACF,MAAa,QAAQC,OAA6B,EAAE;QAChD,OAAO;YACHA,QACK,OAAO,CAAC;gBACL,SAASF;gBACT,MAAM;gBACN,iBAAiB;YACrB,GACC,MAAM,CAACG,CAAAA,SAAW;oBACf,eAAeA,OAAO,IAAI,GAAG,KAAK,CAAC;oBACnC,MAAMA,OAAO,IAAI,GAAG,KAAK,CAAC,QAAQ,QAAQ,CAAC;oBAC3C,WAAWA,OACN,MAAM,GACN,KAAK,CAAC,aACN,QAAQ,CAAC;oBACd,OAAOA,OACF,MAAM,GACN,KAAK,CAAC,SACN,IAAI,GACJ,QAAQ,CAAC,sBACT,MAAM,CAACA,CAAAA,SAAW;4BACf,SAASA,OACJ,IAAI,GACJ,KAAK,CAAC,WACN,QAAQ,CAAC;4BACd,WAAWA,OACN,QAAQ,GACR,KAAK,CAAC,cACN,QAAQ,CAAC;4BACd,MAAMA,OACD,IAAI,GACJ,KAAK,CAAC,QACN,QAAQ,CAAC,qBACT,gBAAgB,CAAC;gCACd;oCACI,OAAOC,gBAAgB,IAAI;oCAC3B,OAAO;gCACX;gCACA;oCACI,OAAOA,gBAAgB,KAAK;oCAC5B,OAAO;gCACX;6BACH;4BACL,MAAMD,OAAO,IAAI,GAAG,KAAK,CAAC;4BAC1B,OAAOA,OAAO,IAAI,GAAG,KAAK,CAAC;wBAC/B;gBACR;SACP;IACL;AACJ;AAEO,MAAME,sBAAsBC,aAAa,oBAAoB,CAAC;IACjE,gBAAgBL;IAChB,cAAc,EAAE;AACpB"}
@@ -6,7 +6,8 @@ class TaskPrivateModelImpl {
6
6
  return [
7
7
  builder.private({
8
8
  modelId: WEBINY_TASK_MODEL_ID,
9
- name: "Webiny Task"
9
+ name: "Webiny Task",
10
+ lifecycleEvents: false
10
11
  }).fields((fields)=>({
11
12
  name: fields.text().label("Name").required("Name is required."),
12
13
  definitionId: fields.text().label("Definition ID").required("Definition ID is required."),
@@ -1 +1 @@
1
- {"version":3,"file":"api/crud/TaskPrivateModel.js","sources":["../../../src/api/crud/TaskPrivateModel.ts"],"sourcesContent":["import { ModelFactory } from \"@webiny/api-headless-cms/features/modelBuilder/index.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\n\nexport const WEBINY_TASK_MODEL_ID = \"wbyTask\";\n\nclass TaskPrivateModelImpl implements ModelFactory.Interface {\n public async execute(builder: ModelFactory.Builder) {\n return [\n builder\n .private({\n modelId: WEBINY_TASK_MODEL_ID,\n name: \"Webiny Task\"\n })\n .fields(fields => ({\n name: fields.text().label(\"Name\").required(\"Name is required.\"),\n definitionId: fields\n .text()\n .label(\"Definition ID\")\n .required(\"Definition ID is required.\"),\n parentId: fields.text().label(\"Parent ID\"),\n executionName: fields.text().label(\"Execution Name\"),\n iterations: fields.number().label(\"Iterations\"),\n input: fields.json().label(\"Input\"),\n output: fields.json().label(\"Output\"),\n taskStatus: fields\n .text()\n .label(\"Status\")\n .predefinedValues([\n {\n value: TaskDataStatus.PENDING,\n label: \"Pending\"\n },\n {\n value: TaskDataStatus.RUNNING,\n label: \"Running\"\n },\n {\n value: TaskDataStatus.FAILED,\n label: \"Failed\"\n },\n {\n value: TaskDataStatus.SUCCESS,\n label: \"Success\"\n },\n {\n value: TaskDataStatus.ABORTED,\n label: \"Aborted\"\n }\n ])\n .settings({ defaultValue: TaskDataStatus.PENDING }),\n startedOn: fields.datetime().label(\"Started On\"),\n finishedOn: fields.datetime().label(\"Finished On\"),\n eventResponse: fields.json().label(\"Event Response\")\n }))\n ];\n }\n}\n\nexport const TaskPrivateModel = ModelFactory.createImplementation({\n implementation: TaskPrivateModelImpl,\n dependencies: []\n});\n"],"names":["WEBINY_TASK_MODEL_ID","TaskPrivateModelImpl","builder","fields","TaskDataStatus","TaskPrivateModel","ModelFactory"],"mappings":";;AAGO,MAAMA,uBAAuB;AAEpC,MAAMC;IACF,MAAa,QAAQC,OAA6B,EAAE;QAChD,OAAO;YACHA,QACK,OAAO,CAAC;gBACL,SAASF;gBACT,MAAM;YACV,GACC,MAAM,CAACG,CAAAA,SAAW;oBACf,MAAMA,OAAO,IAAI,GAAG,KAAK,CAAC,QAAQ,QAAQ,CAAC;oBAC3C,cAAcA,OACT,IAAI,GACJ,KAAK,CAAC,iBACN,QAAQ,CAAC;oBACd,UAAUA,OAAO,IAAI,GAAG,KAAK,CAAC;oBAC9B,eAAeA,OAAO,IAAI,GAAG,KAAK,CAAC;oBACnC,YAAYA,OAAO,MAAM,GAAG,KAAK,CAAC;oBAClC,OAAOA,OAAO,IAAI,GAAG,KAAK,CAAC;oBAC3B,QAAQA,OAAO,IAAI,GAAG,KAAK,CAAC;oBAC5B,YAAYA,OACP,IAAI,GACJ,KAAK,CAAC,UACN,gBAAgB,CAAC;wBACd;4BACI,OAAOC,eAAe,OAAO;4BAC7B,OAAO;wBACX;wBACA;4BACI,OAAOA,eAAe,OAAO;4BAC7B,OAAO;wBACX;wBACA;4BACI,OAAOA,eAAe,MAAM;4BAC5B,OAAO;wBACX;wBACA;4BACI,OAAOA,eAAe,OAAO;4BAC7B,OAAO;wBACX;wBACA;4BACI,OAAOA,eAAe,OAAO;4BAC7B,OAAO;wBACX;qBACH,EACA,QAAQ,CAAC;wBAAE,cAAcA,eAAe,OAAO;oBAAC;oBACrD,WAAWD,OAAO,QAAQ,GAAG,KAAK,CAAC;oBACnC,YAAYA,OAAO,QAAQ,GAAG,KAAK,CAAC;oBACpC,eAAeA,OAAO,IAAI,GAAG,KAAK,CAAC;gBACvC;SACP;IACL;AACJ;AAEO,MAAME,mBAAmBC,aAAa,oBAAoB,CAAC;IAC9D,gBAAgBL;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"api/crud/TaskPrivateModel.js","sources":["../../../src/api/crud/TaskPrivateModel.ts"],"sourcesContent":["import { ModelFactory } from \"@webiny/api-headless-cms/features/modelBuilder/index.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\n\nexport const WEBINY_TASK_MODEL_ID = \"wbyTask\";\n\nclass TaskPrivateModelImpl implements ModelFactory.Interface {\n public async execute(builder: ModelFactory.Builder) {\n return [\n builder\n .private({\n modelId: WEBINY_TASK_MODEL_ID,\n name: \"Webiny Task\",\n lifecycleEvents: false\n })\n .fields(fields => ({\n name: fields.text().label(\"Name\").required(\"Name is required.\"),\n definitionId: fields\n .text()\n .label(\"Definition ID\")\n .required(\"Definition ID is required.\"),\n parentId: fields.text().label(\"Parent ID\"),\n executionName: fields.text().label(\"Execution Name\"),\n iterations: fields.number().label(\"Iterations\"),\n input: fields.json().label(\"Input\"),\n output: fields.json().label(\"Output\"),\n taskStatus: fields\n .text()\n .label(\"Status\")\n .predefinedValues([\n {\n value: TaskDataStatus.PENDING,\n label: \"Pending\"\n },\n {\n value: TaskDataStatus.RUNNING,\n label: \"Running\"\n },\n {\n value: TaskDataStatus.FAILED,\n label: \"Failed\"\n },\n {\n value: TaskDataStatus.SUCCESS,\n label: \"Success\"\n },\n {\n value: TaskDataStatus.ABORTED,\n label: \"Aborted\"\n }\n ])\n .settings({ defaultValue: TaskDataStatus.PENDING }),\n startedOn: fields.datetime().label(\"Started On\"),\n finishedOn: fields.datetime().label(\"Finished On\"),\n eventResponse: fields.json().label(\"Event Response\")\n }))\n ];\n }\n}\n\nexport const TaskPrivateModel = ModelFactory.createImplementation({\n implementation: TaskPrivateModelImpl,\n dependencies: []\n});\n"],"names":["WEBINY_TASK_MODEL_ID","TaskPrivateModelImpl","builder","fields","TaskDataStatus","TaskPrivateModel","ModelFactory"],"mappings":";;AAGO,MAAMA,uBAAuB;AAEpC,MAAMC;IACF,MAAa,QAAQC,OAA6B,EAAE;QAChD,OAAO;YACHA,QACK,OAAO,CAAC;gBACL,SAASF;gBACT,MAAM;gBACN,iBAAiB;YACrB,GACC,MAAM,CAACG,CAAAA,SAAW;oBACf,MAAMA,OAAO,IAAI,GAAG,KAAK,CAAC,QAAQ,QAAQ,CAAC;oBAC3C,cAAcA,OACT,IAAI,GACJ,KAAK,CAAC,iBACN,QAAQ,CAAC;oBACd,UAAUA,OAAO,IAAI,GAAG,KAAK,CAAC;oBAC9B,eAAeA,OAAO,IAAI,GAAG,KAAK,CAAC;oBACnC,YAAYA,OAAO,MAAM,GAAG,KAAK,CAAC;oBAClC,OAAOA,OAAO,IAAI,GAAG,KAAK,CAAC;oBAC3B,QAAQA,OAAO,IAAI,GAAG,KAAK,CAAC;oBAC5B,YAAYA,OACP,IAAI,GACJ,KAAK,CAAC,UACN,gBAAgB,CAAC;wBACd;4BACI,OAAOC,eAAe,OAAO;4BAC7B,OAAO;wBACX;wBACA;4BACI,OAAOA,eAAe,OAAO;4BAC7B,OAAO;wBACX;wBACA;4BACI,OAAOA,eAAe,MAAM;4BAC5B,OAAO;wBACX;wBACA;4BACI,OAAOA,eAAe,OAAO;4BAC7B,OAAO;wBACX;wBACA;4BACI,OAAOA,eAAe,OAAO;4BAC7B,OAAO;wBACX;qBACH,EACA,QAAQ,CAAC;wBAAE,cAAcA,eAAe,OAAO;oBAAC;oBACrD,WAAWD,OAAO,QAAQ,GAAG,KAAK,CAAC;oBACnC,YAAYA,OAAO,QAAQ,GAAG,KAAK,CAAC;oBACpC,eAAeA,OAAO,IAAI,GAAG,KAAK,CAAC;gBACvC;SACP;IACL;AACJ;AAEO,MAAME,mBAAmBC,aAAa,oBAAoB,CAAC;IAC9D,gBAAgBL;IAChB,cAAc,EAAE;AACpB"}
@@ -49,8 +49,8 @@ const convertToLog = (entry)=>({
49
49
  });
50
50
  const getZodSchema = (schema)=>{
51
51
  if (!schema) return zod.looseObject({});
52
- if (schema instanceof zod.ZodObject) return schema.loose();
53
- if (schema instanceof zod.ZodType) return schema;
52
+ else if (schema instanceof zod.ZodObject) return schema.loose();
53
+ else if (schema instanceof zod.ZodType) return schema;
54
54
  return zod.looseObject(schema);
55
55
  };
56
56
  const validateTaskInput = async (params)=>{
@@ -1 +1 @@
1
- {"version":3,"file":"api/crud/crud.tasks.js","sources":["../../../src/api/crud/crud.tasks.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n Context,\n IListTaskLogParams,\n IListTaskParams,\n ITaskCreateData,\n ITaskLog,\n ITaskLogCreateInput,\n ITaskLogUpdateInput,\n ITasksContextCrudObject,\n ITaskUpdateData\n} from \"~/api/types.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\nimport { WEBINY_TASK_MODEL_ID } from \"./TaskPrivateModel.js\";\nimport { WEBINY_TASK_LOG_MODEL_ID } from \"./TaskLogPrivateModel.js\";\nimport type { CmsEntry, CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { createZodError, parseIdentifier } from \"@webiny/utils\";\nimport zod from \"zod\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries\";\nimport { CreateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/CreateEntry\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport {\n TaskDefinitionNotFoundError,\n TaskLogNotFoundError,\n TaskNotFoundError\n} from \"~/api/domain/errors.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n TaskAfterCreateEvent,\n TaskAfterDeleteEvent,\n TaskAfterUpdateEvent,\n TaskBeforeCreateEvent,\n TaskBeforeDeleteEvent,\n TaskBeforeUpdateEvent\n} from \"~/api/events/index.js\";\nimport { CmsWhereMapper } from \"@webiny/api-headless-cms\";\nimport { createCleanupTaskSubtree } from \"./cleanupTaskSubtree.js\";\n\nconst createRevisionId = (id: string) => {\n const { id: entryId } = parseIdentifier(id);\n return `${entryId}#0001`;\n};\n\nconst convertToTask = <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n>(\n entry: CmsEntry<TaskService.Task<T, O>>\n): TaskService.Task<T, O> => {\n return {\n id: entry.entryId,\n createdOn: entry.createdOn,\n savedOn: entry.savedOn,\n createdBy: entry.createdBy,\n name: entry.values.name,\n definitionId: entry.values.definitionId,\n input: entry.values.input,\n output: entry.values.output,\n taskStatus: entry.values.taskStatus,\n executionName: entry.values.executionName || \"\",\n eventResponse: entry.values.eventResponse,\n startedOn: entry.values.startedOn,\n finishedOn: entry.values.finishedOn,\n iterations: entry.values.iterations,\n parentId: entry.values.parentId\n };\n};\n\nconst convertToLog = (entry: CmsEntry<ITaskLog>): ITaskLog => {\n return {\n id: entry.entryId,\n createdOn: entry.createdOn,\n createdBy: entry.createdBy,\n executionName: entry.values.executionName,\n task: entry.values.task,\n iteration: entry.values.iteration,\n items: entry.values.items || []\n };\n};\n\ninterface IValidateParams {\n definition: Pick<TaskDefinition.Interface, \"createInputValidation\">;\n data: Pick<ITaskCreateData, \"input\">;\n context: Context;\n}\n\nconst getZodSchema = (schema: GenericRecord<string, zod.ZodTypeAny> | zod.ZodTypeAny) => {\n if (!schema) {\n return zod.looseObject({});\n } else if (schema instanceof zod.ZodObject) {\n return schema.loose();\n } else if (schema instanceof zod.ZodType) {\n return schema;\n }\n return zod.looseObject(schema);\n};\n\nconst validateTaskInput = async (params: IValidateParams) => {\n const { definition, data } = params;\n if (!definition.createInputValidation) {\n return;\n }\n const schema = definition.createInputValidation({\n validator: zod\n });\n /**\n * If the schema is not an object, we need to wrap it with the `object` function.\n */\n const validate = getZodSchema(schema);\n\n const result = await validate.safeParseAsync(data.input);\n if (result.success) {\n return;\n }\n throw createZodError(result.error);\n};\n\nexport const createTaskCrud = (context: Context): ITasksContextCrudObject => {\n const cmsWhereMapper = context.container.resolve(CmsWhereMapper);\n\n const getTaskModel = async (): Promise<CmsModel> => {\n const identityContext = context.container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = context.container.resolve(GetModelUseCase);\n const result = await getModel.execute(WEBINY_TASK_MODEL_ID);\n if (result.isFail()) {\n throw new WebinyError(`There is no model \"${WEBINY_TASK_MODEL_ID}\".`);\n }\n return result.value;\n });\n };\n\n const getLogModel = async (): Promise<CmsModel> => {\n const identityContext = context.container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = context.container.resolve(GetModelUseCase);\n const result = await getModel.execute(WEBINY_TASK_LOG_MODEL_ID);\n if (result.isFail()) {\n throw new WebinyError(`There is no model \"${WEBINY_TASK_LOG_MODEL_ID}\".`);\n }\n return result.value;\n });\n };\n\n const getTask = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n id: string\n ) => {\n const identityContext = context.container.resolve(IdentityContext);\n\n const entry = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const getEntryById = context.container.resolve(GetEntryByIdUseCase);\n const result = await getEntryById.execute(model, createRevisionId(id));\n if (result.isFail()) {\n return null;\n }\n return result.value;\n });\n\n if (!entry) {\n return null;\n }\n\n return convertToTask(entry as unknown as CmsEntry<TaskService.Task<T, O>>);\n };\n\n const listTasks = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params?: IListTaskParams\n ) => {\n const identityContext = context.container.resolve(IdentityContext);\n const { entries, meta } = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<TaskService.Task<T, O>>(model, {\n ...params,\n where: cmsWhereMapper.map({\n input: params?.where,\n fields: model.fields\n })\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n\n return {\n items: entries.map(item => convertToTask<T, O>(item)),\n meta\n };\n };\n\n const createTask = async (data: ITaskCreateData) => {\n const definition = context.tasks.getDefinition(data.definitionId);\n if (!definition) {\n throw new TaskDefinitionNotFoundError(data.definitionId);\n }\n\n await validateTaskInput({\n context,\n definition,\n data\n });\n\n const identityContext = context.container.resolve(IdentityContext);\n const eventPublisher = context.container.resolve(EventPublisher);\n\n const beforeCreateEvent = new TaskBeforeCreateEvent({\n input: data\n });\n await eventPublisher.publish(beforeCreateEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const createEntry = context.container.resolve(CreateEntryUseCase);\n return createEntry.execute(model, {\n values: {\n ...data,\n iterations: 0,\n taskStatus: TaskDataStatus.PENDING\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n const task = convertToTask(result.value as unknown as CmsEntry<TaskService.Task>);\n\n const afterCreateEvent = new TaskAfterCreateEvent({\n input: data,\n task\n });\n await eventPublisher.publish(afterCreateEvent);\n\n return task;\n };\n\n const updateTask = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n id: string,\n data: ITaskUpdateData<T, O>\n ) => {\n const original = await getTask<T, O>(id);\n if (!original) {\n throw new TaskNotFoundError();\n }\n\n const identityContext = context.container.resolve(IdentityContext);\n const eventPublisher = context.container.resolve(EventPublisher);\n\n const beforeUpdateEvent = new TaskBeforeUpdateEvent({\n input: data,\n original\n });\n await eventPublisher.publish(beforeUpdateEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const updateEntry = context.container.resolve(UpdateEntryUseCase);\n return updateEntry.execute(model, createRevisionId(id), {\n values: {\n ...data\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n const task = convertToTask<T, O>(\n result.value as unknown as CmsEntry<TaskService.Task<T, O>>\n );\n\n const afterUpdateEvent = new TaskAfterUpdateEvent({\n input: data,\n task\n });\n await eventPublisher.publish(afterUpdateEvent);\n\n return task;\n };\n\n const deleteTask = async (id: string) => {\n const task = await getTask(id);\n if (!task) {\n throw new TaskNotFoundError();\n }\n\n const identityContext = context.container.resolve(IdentityContext);\n const eventPublisher = context.container.resolve(EventPublisher);\n\n const beforeDeleteEvent = new TaskBeforeDeleteEvent({\n task\n });\n await eventPublisher.publish(beforeDeleteEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const deleteEntry = context.container.resolve(DeleteEntryUseCase);\n return deleteEntry.execute(model, createRevisionId(id));\n });\n\n if (result.isFail()) {\n throw new TaskNotFoundError();\n }\n\n const afterDeleteEvent = new TaskAfterDeleteEvent({ task });\n await eventPublisher.publish(afterDeleteEvent);\n\n return true;\n };\n\n const createLog = async (task: Pick<TaskService.Task, \"id\">, data: ITaskLogCreateInput) => {\n const identityContext = context.container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const createEntry = context.container.resolve(CreateEntryUseCase);\n return createEntry.execute(model, {\n values: {\n ...data,\n task: task.id\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n };\n\n const updateLog = async (id: string, data: ITaskLogUpdateInput) => {\n const identityContext = context.container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const updateEntry = context.container.resolve(UpdateEntryUseCase);\n return updateEntry.execute(model, createRevisionId(id), {\n values: data\n });\n });\n\n if (result.isFail()) {\n throw new TaskLogNotFoundError();\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n };\n\n const deleteLog = async (id: string) => {\n const identityContext = context.container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const deleteEntry = context.container.resolve(DeleteEntryUseCase);\n return deleteEntry.execute(model, id);\n });\n\n if (result.isFail()) {\n throw new TaskLogNotFoundError();\n }\n\n return true;\n };\n\n const getLog = async (id: string): Promise<ITaskLog | null> => {\n const identityContext = context.container.resolve(IdentityContext);\n try {\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const getEntryById = context.container.resolve(GetEntryByIdUseCase);\n return getEntryById.execute(model, id);\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n } catch (ex) {\n if (ex instanceof NotFoundError) {\n return null;\n }\n throw ex;\n }\n };\n\n const getLatestLog = async (taskId: string): Promise<ITaskLog> => {\n const identityContext = context.container.resolve(IdentityContext);\n const entry = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<ITaskLog>(model, {\n where: {\n values: {\n task: taskId\n }\n },\n sort: [\"createdOn_DESC\"],\n limit: 1\n });\n if (result.isFail()) {\n throw result.error;\n }\n const { entries } = result.value;\n const [item] = entries;\n if (!item) {\n throw new NotFoundError(`No existing latest log found for task \"${taskId}\".`);\n }\n return item;\n });\n\n return convertToLog(entry as unknown as CmsEntry<ITaskLog>);\n };\n\n const cleanupTaskSubtree = createCleanupTaskSubtree(context);\n\n const listLogs = async (params: IListTaskLogParams) => {\n const identityContext = context.container.resolve(IdentityContext);\n const { entries, meta } = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<ITaskLog>(model, {\n ...params,\n where: cmsWhereMapper.map({\n input: params.where,\n fields: model.fields\n })\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n\n return {\n items: entries.map(item => convertToLog(item)),\n meta\n };\n };\n\n return {\n getTask,\n listTasks,\n createTask,\n updateTask,\n deleteTask,\n cleanupTaskSubtree,\n createLog,\n updateLog,\n deleteLog,\n getLog,\n listLogs,\n getLatestLog,\n getTaskModel,\n getLogModel\n };\n};\n"],"names":["createRevisionId","id","entryId","parseIdentifier","convertToTask","entry","convertToLog","getZodSchema","schema","zod","validateTaskInput","params","definition","data","validate","result","createZodError","createTaskCrud","context","cmsWhereMapper","CmsWhereMapper","getTaskModel","identityContext","IdentityContext","getModel","GetModelUseCase","WEBINY_TASK_MODEL_ID","WebinyError","getLogModel","WEBINY_TASK_LOG_MODEL_ID","getTask","model","getEntryById","GetEntryByIdUseCase","listTasks","entries","meta","listLatestEntries","ListLatestEntriesUseCase","item","createTask","TaskDefinitionNotFoundError","eventPublisher","EventPublisher","beforeCreateEvent","TaskBeforeCreateEvent","createEntry","CreateEntryUseCase","TaskDataStatus","task","afterCreateEvent","TaskAfterCreateEvent","updateTask","original","TaskNotFoundError","beforeUpdateEvent","TaskBeforeUpdateEvent","updateEntry","UpdateEntryUseCase","afterUpdateEvent","TaskAfterUpdateEvent","deleteTask","beforeDeleteEvent","TaskBeforeDeleteEvent","deleteEntry","DeleteEntryUseCase","afterDeleteEvent","TaskAfterDeleteEvent","createLog","updateLog","TaskLogNotFoundError","deleteLog","getLog","ex","NotFoundError","getLatestLog","taskId","cleanupTaskSubtree","createCleanupTaskSubtree","listLogs"],"mappings":"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"}
1
+ {"version":3,"file":"api/crud/crud.tasks.js","sources":["../../../src/api/crud/crud.tasks.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n Context,\n IListTaskLogParams,\n IListTaskParams,\n ITaskCreateData,\n ITaskLog,\n ITaskLogCreateInput,\n ITaskLogUpdateInput,\n ITasksContextCrudObject,\n ITaskUpdateData\n} from \"~/api/types.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\nimport { WEBINY_TASK_MODEL_ID } from \"./TaskPrivateModel.js\";\nimport { WEBINY_TASK_LOG_MODEL_ID } from \"./TaskLogPrivateModel.js\";\nimport type { CmsEntry, CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { createZodError, parseIdentifier } from \"@webiny/utils\";\nimport zod from \"zod\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries\";\nimport { CreateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/CreateEntry\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport {\n TaskDefinitionNotFoundError,\n TaskLogNotFoundError,\n TaskNotFoundError\n} from \"~/api/domain/errors.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n TaskAfterCreateEvent,\n TaskAfterDeleteEvent,\n TaskAfterUpdateEvent,\n TaskBeforeCreateEvent,\n TaskBeforeDeleteEvent,\n TaskBeforeUpdateEvent\n} from \"~/api/events/index.js\";\nimport { CmsWhereMapper } from \"@webiny/api-headless-cms\";\nimport { createCleanupTaskSubtree } from \"./cleanupTaskSubtree.js\";\n\nconst createRevisionId = (id: string) => {\n const { id: entryId } = parseIdentifier(id);\n return `${entryId}#0001`;\n};\n\nconst convertToTask = <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n>(\n entry: CmsEntry<TaskService.Task<T, O>>\n): TaskService.Task<T, O> => {\n return {\n id: entry.entryId,\n createdOn: entry.createdOn,\n savedOn: entry.savedOn,\n createdBy: entry.createdBy,\n name: entry.values.name,\n definitionId: entry.values.definitionId,\n input: entry.values.input,\n output: entry.values.output,\n taskStatus: entry.values.taskStatus,\n executionName: entry.values.executionName || \"\",\n eventResponse: entry.values.eventResponse,\n startedOn: entry.values.startedOn,\n finishedOn: entry.values.finishedOn,\n iterations: entry.values.iterations,\n parentId: entry.values.parentId\n };\n};\n\nconst convertToLog = (entry: CmsEntry<ITaskLog>): ITaskLog => {\n return {\n id: entry.entryId,\n createdOn: entry.createdOn,\n createdBy: entry.createdBy,\n executionName: entry.values.executionName,\n task: entry.values.task,\n iteration: entry.values.iteration,\n items: entry.values.items || []\n };\n};\n\ninterface IValidateParams {\n definition: Pick<TaskDefinition.Interface, \"createInputValidation\">;\n data: Pick<ITaskCreateData, \"input\">;\n context: Context;\n}\n\nconst getZodSchema = (schema: GenericRecord<string, zod.ZodTypeAny> | zod.ZodTypeAny) => {\n if (!schema) {\n return zod.looseObject({});\n } else if (schema instanceof zod.ZodObject) {\n return schema.loose();\n } else if (schema instanceof zod.ZodType) {\n return schema;\n }\n return zod.looseObject(schema);\n};\n\nconst validateTaskInput = async (params: IValidateParams) => {\n const { definition, data } = params;\n if (!definition.createInputValidation) {\n return;\n }\n const schema = definition.createInputValidation({\n validator: zod\n });\n /**\n * If the schema is not an object, we need to wrap it with the `object` function.\n */\n const validate = getZodSchema(schema);\n\n const result = await validate.safeParseAsync(data.input);\n if (result.success) {\n return;\n }\n throw createZodError(result.error);\n};\n\nexport const createTaskCrud = (context: Context): ITasksContextCrudObject => {\n const cmsWhereMapper = context.container.resolve(CmsWhereMapper);\n\n const getTaskModel = async (): Promise<CmsModel> => {\n const identityContext = context.container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = context.container.resolve(GetModelUseCase);\n const result = await getModel.execute(WEBINY_TASK_MODEL_ID);\n if (result.isFail()) {\n throw new WebinyError(`There is no model \"${WEBINY_TASK_MODEL_ID}\".`);\n }\n return result.value;\n });\n };\n\n const getLogModel = async (): Promise<CmsModel> => {\n const identityContext = context.container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = context.container.resolve(GetModelUseCase);\n const result = await getModel.execute(WEBINY_TASK_LOG_MODEL_ID);\n if (result.isFail()) {\n throw new WebinyError(`There is no model \"${WEBINY_TASK_LOG_MODEL_ID}\".`);\n }\n return result.value;\n });\n };\n\n const getTask = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n id: string\n ) => {\n const identityContext = context.container.resolve(IdentityContext);\n\n const entry = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const getEntryById = context.container.resolve(GetEntryByIdUseCase);\n const result = await getEntryById.execute(model, createRevisionId(id));\n if (result.isFail()) {\n return null;\n }\n return result.value;\n });\n\n if (!entry) {\n return null;\n }\n\n return convertToTask(entry as unknown as CmsEntry<TaskService.Task<T, O>>);\n };\n\n const listTasks = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params?: IListTaskParams\n ) => {\n const identityContext = context.container.resolve(IdentityContext);\n const { entries, meta } = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<TaskService.Task<T, O>>(model, {\n ...params,\n where: cmsWhereMapper.map({\n input: params?.where,\n fields: model.fields\n })\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n\n return {\n items: entries.map(item => convertToTask<T, O>(item)),\n meta\n };\n };\n\n const createTask = async (data: ITaskCreateData) => {\n const definition = context.tasks.getDefinition(data.definitionId);\n if (!definition) {\n throw new TaskDefinitionNotFoundError(data.definitionId);\n }\n\n await validateTaskInput({\n context,\n definition,\n data\n });\n\n const identityContext = context.container.resolve(IdentityContext);\n const eventPublisher = context.container.resolve(EventPublisher);\n\n const beforeCreateEvent = new TaskBeforeCreateEvent({\n input: data\n });\n await eventPublisher.publish(beforeCreateEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const createEntry = context.container.resolve(CreateEntryUseCase);\n return createEntry.execute(model, {\n values: {\n ...data,\n iterations: 0,\n taskStatus: TaskDataStatus.PENDING\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n const task = convertToTask(result.value as unknown as CmsEntry<TaskService.Task>);\n\n const afterCreateEvent = new TaskAfterCreateEvent({\n input: data,\n task\n });\n await eventPublisher.publish(afterCreateEvent);\n\n return task;\n };\n\n const updateTask = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n id: string,\n data: ITaskUpdateData<T, O>\n ) => {\n const original = await getTask<T, O>(id);\n if (!original) {\n throw new TaskNotFoundError();\n }\n\n const identityContext = context.container.resolve(IdentityContext);\n const eventPublisher = context.container.resolve(EventPublisher);\n\n const beforeUpdateEvent = new TaskBeforeUpdateEvent({\n input: data,\n original\n });\n await eventPublisher.publish(beforeUpdateEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const updateEntry = context.container.resolve(UpdateEntryUseCase);\n return updateEntry.execute(model, createRevisionId(id), {\n values: {\n ...data\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n const task = convertToTask<T, O>(\n result.value as unknown as CmsEntry<TaskService.Task<T, O>>\n );\n\n const afterUpdateEvent = new TaskAfterUpdateEvent({\n input: data,\n task\n });\n await eventPublisher.publish(afterUpdateEvent);\n\n return task;\n };\n\n const deleteTask = async (id: string) => {\n const task = await getTask(id);\n if (!task) {\n throw new TaskNotFoundError();\n }\n\n const identityContext = context.container.resolve(IdentityContext);\n const eventPublisher = context.container.resolve(EventPublisher);\n\n const beforeDeleteEvent = new TaskBeforeDeleteEvent({\n task\n });\n await eventPublisher.publish(beforeDeleteEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const deleteEntry = context.container.resolve(DeleteEntryUseCase);\n return deleteEntry.execute(model, createRevisionId(id));\n });\n\n if (result.isFail()) {\n throw new TaskNotFoundError();\n }\n\n const afterDeleteEvent = new TaskAfterDeleteEvent({ task });\n await eventPublisher.publish(afterDeleteEvent);\n\n return true;\n };\n\n const createLog = async (task: Pick<TaskService.Task, \"id\">, data: ITaskLogCreateInput) => {\n const identityContext = context.container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const createEntry = context.container.resolve(CreateEntryUseCase);\n return createEntry.execute(model, {\n values: {\n ...data,\n task: task.id\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n };\n\n const updateLog = async (id: string, data: ITaskLogUpdateInput) => {\n const identityContext = context.container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const updateEntry = context.container.resolve(UpdateEntryUseCase);\n return updateEntry.execute(model, createRevisionId(id), {\n values: data\n });\n });\n\n if (result.isFail()) {\n throw new TaskLogNotFoundError();\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n };\n\n const deleteLog = async (id: string) => {\n const identityContext = context.container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const deleteEntry = context.container.resolve(DeleteEntryUseCase);\n return deleteEntry.execute(model, id);\n });\n\n if (result.isFail()) {\n throw new TaskLogNotFoundError();\n }\n\n return true;\n };\n\n const getLog = async (id: string): Promise<ITaskLog | null> => {\n const identityContext = context.container.resolve(IdentityContext);\n try {\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const getEntryById = context.container.resolve(GetEntryByIdUseCase);\n return getEntryById.execute(model, id);\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n } catch (ex) {\n if (ex instanceof NotFoundError) {\n return null;\n }\n throw ex;\n }\n };\n\n const getLatestLog = async (taskId: string): Promise<ITaskLog> => {\n const identityContext = context.container.resolve(IdentityContext);\n const entry = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<ITaskLog>(model, {\n where: {\n values: {\n task: taskId\n }\n },\n sort: [\"createdOn_DESC\"],\n limit: 1\n });\n if (result.isFail()) {\n throw result.error;\n }\n const { entries } = result.value;\n const [item] = entries;\n if (!item) {\n throw new NotFoundError(`No existing latest log found for task \"${taskId}\".`);\n }\n return item;\n });\n\n return convertToLog(entry as unknown as CmsEntry<ITaskLog>);\n };\n\n const cleanupTaskSubtree = createCleanupTaskSubtree(context);\n\n const listLogs = async (params: IListTaskLogParams) => {\n const identityContext = context.container.resolve(IdentityContext);\n const { entries, meta } = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<ITaskLog>(model, {\n ...params,\n where: cmsWhereMapper.map({\n input: params.where,\n fields: model.fields\n })\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n\n return {\n items: entries.map(item => convertToLog(item)),\n meta\n };\n };\n\n return {\n getTask,\n listTasks,\n createTask,\n updateTask,\n deleteTask,\n cleanupTaskSubtree,\n createLog,\n updateLog,\n deleteLog,\n getLog,\n listLogs,\n getLatestLog,\n getTaskModel,\n getLogModel\n };\n};\n"],"names":["createRevisionId","id","entryId","parseIdentifier","convertToTask","entry","convertToLog","getZodSchema","schema","zod","validateTaskInput","params","definition","data","validate","result","createZodError","createTaskCrud","context","cmsWhereMapper","CmsWhereMapper","getTaskModel","identityContext","IdentityContext","getModel","GetModelUseCase","WEBINY_TASK_MODEL_ID","WebinyError","getLogModel","WEBINY_TASK_LOG_MODEL_ID","getTask","model","getEntryById","GetEntryByIdUseCase","listTasks","entries","meta","listLatestEntries","ListLatestEntriesUseCase","item","createTask","TaskDefinitionNotFoundError","eventPublisher","EventPublisher","beforeCreateEvent","TaskBeforeCreateEvent","createEntry","CreateEntryUseCase","TaskDataStatus","task","afterCreateEvent","TaskAfterCreateEvent","updateTask","original","TaskNotFoundError","beforeUpdateEvent","TaskBeforeUpdateEvent","updateEntry","UpdateEntryUseCase","afterUpdateEvent","TaskAfterUpdateEvent","deleteTask","beforeDeleteEvent","TaskBeforeDeleteEvent","deleteEntry","DeleteEntryUseCase","afterDeleteEvent","TaskAfterDeleteEvent","createLog","updateLog","TaskLogNotFoundError","deleteLog","getLog","ex","NotFoundError","getLatestLog","taskId","cleanupTaskSubtree","createCleanupTaskSubtree","listLogs"],"mappings":";;;;;;;;;;;;;;;;;;;AA8CA,MAAMA,mBAAmB,CAACC;IACtB,MAAM,EAAE,IAAIC,OAAO,EAAE,GAAGC,gBAAgBF;IACxC,OAAO,GAAGC,QAAQ,KAAK,CAAC;AAC5B;AAEA,MAAME,gBAAgB,CAIlBC,QAEO;QACH,IAAIA,MAAM,OAAO;QACjB,WAAWA,MAAM,SAAS;QAC1B,SAASA,MAAM,OAAO;QACtB,WAAWA,MAAM,SAAS;QAC1B,MAAMA,MAAM,MAAM,CAAC,IAAI;QACvB,cAAcA,MAAM,MAAM,CAAC,YAAY;QACvC,OAAOA,MAAM,MAAM,CAAC,KAAK;QACzB,QAAQA,MAAM,MAAM,CAAC,MAAM;QAC3B,YAAYA,MAAM,MAAM,CAAC,UAAU;QACnC,eAAeA,MAAM,MAAM,CAAC,aAAa,IAAI;QAC7C,eAAeA,MAAM,MAAM,CAAC,aAAa;QACzC,WAAWA,MAAM,MAAM,CAAC,SAAS;QACjC,YAAYA,MAAM,MAAM,CAAC,UAAU;QACnC,YAAYA,MAAM,MAAM,CAAC,UAAU;QACnC,UAAUA,MAAM,MAAM,CAAC,QAAQ;IACnC;AAGJ,MAAMC,eAAe,CAACD,QACX;QACH,IAAIA,MAAM,OAAO;QACjB,WAAWA,MAAM,SAAS;QAC1B,WAAWA,MAAM,SAAS;QAC1B,eAAeA,MAAM,MAAM,CAAC,aAAa;QACzC,MAAMA,MAAM,MAAM,CAAC,IAAI;QACvB,WAAWA,MAAM,MAAM,CAAC,SAAS;QACjC,OAAOA,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;IACnC;AASJ,MAAME,eAAe,CAACC;IAClB,IAAI,CAACA,QACD,OAAOC,IAAI,WAAW,CAAC,CAAC;SACrB,IAAID,kBAAkBC,IAAI,SAAS,EACtC,OAAOD,OAAO,KAAK;SAChB,IAAIA,kBAAkBC,IAAI,OAAO,EACpC,OAAOD;IAEX,OAAOC,IAAI,WAAW,CAACD;AAC3B;AAEA,MAAME,oBAAoB,OAAOC;IAC7B,MAAM,EAAEC,UAAU,EAAEC,IAAI,EAAE,GAAGF;IAC7B,IAAI,CAACC,WAAW,qBAAqB,EACjC;IAEJ,MAAMJ,SAASI,WAAW,qBAAqB,CAAC;QAC5C,WAAWH;IACf;IAIA,MAAMK,WAAWP,aAAaC;IAE9B,MAAMO,SAAS,MAAMD,SAAS,cAAc,CAACD,KAAK,KAAK;IACvD,IAAIE,OAAO,OAAO,EACd;IAEJ,MAAMC,eAAeD,OAAO,KAAK;AACrC;AAEO,MAAME,iBAAiB,CAACC;IAC3B,MAAMC,iBAAiBD,QAAQ,SAAS,CAAC,OAAO,CAACE;IAEjD,MAAMC,eAAe;QACjB,MAAMC,kBAAkBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;QAClD,OAAO,MAAMD,gBAAgB,oBAAoB,CAAC;YAC9C,MAAME,WAAWN,QAAQ,SAAS,CAAC,OAAO,CAACO;YAC3C,MAAMV,SAAS,MAAMS,SAAS,OAAO,CAACE;YACtC,IAAIX,OAAO,MAAM,IACb,MAAM,IAAIY,MAAY,CAAC,mBAAmB,EAAED,qBAAqB,EAAE,CAAC;YAExE,OAAOX,OAAO,KAAK;QACvB;IACJ;IAEA,MAAMa,cAAc;QAChB,MAAMN,kBAAkBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;QAClD,OAAO,MAAMD,gBAAgB,oBAAoB,CAAC;YAC9C,MAAME,WAAWN,QAAQ,SAAS,CAAC,OAAO,CAACO;YAC3C,MAAMV,SAAS,MAAMS,SAAS,OAAO,CAACK;YACtC,IAAId,OAAO,MAAM,IACb,MAAM,IAAIY,MAAY,CAAC,mBAAmB,EAAEE,yBAAyB,EAAE,CAAC;YAE5E,OAAOd,OAAO,KAAK;QACvB;IACJ;IAEA,MAAMe,UAAU,OAIZ7B;QAEA,MAAMqB,kBAAkBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;QAElD,MAAMlB,QAAQ,MAAMiB,gBAAgB,oBAAoB,CAAC;YACrD,MAAMS,QAAQ,MAAMV;YACpB,MAAMW,eAAed,QAAQ,SAAS,CAAC,OAAO,CAACe;YAC/C,MAAMlB,SAAS,MAAMiB,aAAa,OAAO,CAACD,OAAO/B,iBAAiBC;YAClE,IAAIc,OAAO,MAAM,IACb,OAAO;YAEX,OAAOA,OAAO,KAAK;QACvB;QAEA,IAAI,CAACV,OACD,OAAO;QAGX,OAAOD,cAAcC;IACzB;IAEA,MAAM6B,YAAY,OAIdvB;QAEA,MAAMW,kBAAkBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;QAClD,MAAM,EAAEY,OAAO,EAAEC,IAAI,EAAE,GAAG,MAAMd,gBAAgB,oBAAoB,CAAC;YACjE,MAAMS,QAAQ,MAAMV;YACpB,MAAMgB,oBAAoBnB,QAAQ,SAAS,CAAC,OAAO,CAACoB;YACpD,MAAMvB,SAAS,MAAMsB,kBAAkB,OAAO,CAAyBN,OAAO;gBAC1E,GAAGpB,MAAM;gBACT,OAAOQ,eAAe,GAAG,CAAC;oBACtB,OAAOR,QAAQ;oBACf,QAAQoB,MAAM,MAAM;gBACxB;YACJ;YACA,IAAIhB,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;YAEtB,OAAOA,OAAO,KAAK;QACvB;QAEA,OAAO;YACH,OAAOoB,QAAQ,GAAG,CAACI,CAAAA,OAAQnC,cAAoBmC;YAC/CH;QACJ;IACJ;IAEA,MAAMI,aAAa,OAAO3B;QACtB,MAAMD,aAAaM,QAAQ,KAAK,CAAC,aAAa,CAACL,KAAK,YAAY;QAChE,IAAI,CAACD,YACD,MAAM,IAAI6B,4BAA4B5B,KAAK,YAAY;QAG3D,MAAMH,kBAAkB;YACpBQ;YACAN;YACAC;QACJ;QAEA,MAAMS,kBAAkBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;QAClD,MAAMmB,iBAAiBxB,QAAQ,SAAS,CAAC,OAAO,CAACyB;QAEjD,MAAMC,oBAAoB,IAAIC,sBAAsB;YAChD,OAAOhC;QACX;QACA,MAAM6B,eAAe,OAAO,CAACE;QAE7B,MAAM7B,SAAS,MAAMO,gBAAgB,oBAAoB,CAAC;YACtD,MAAMS,QAAQ,MAAMV;YACpB,MAAMyB,cAAc5B,QAAQ,SAAS,CAAC,OAAO,CAAC6B;YAC9C,OAAOD,YAAY,OAAO,CAACf,OAAO;gBAC9B,QAAQ;oBACJ,GAAGlB,IAAI;oBACP,YAAY;oBACZ,YAAYmC,eAAe,OAAO;gBACtC;YACJ;QACJ;QAEA,IAAIjC,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;QAGtB,MAAMkC,OAAO7C,cAAcW,OAAO,KAAK;QAEvC,MAAMmC,mBAAmB,IAAIC,qBAAqB;YAC9C,OAAOtC;YACPoC;QACJ;QACA,MAAMP,eAAe,OAAO,CAACQ;QAE7B,OAAOD;IACX;IAEA,MAAMG,aAAa,OAIfnD,IACAY;QAEA,MAAMwC,WAAW,MAAMvB,QAAc7B;QACrC,IAAI,CAACoD,UACD,MAAM,IAAIC;QAGd,MAAMhC,kBAAkBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;QAClD,MAAMmB,iBAAiBxB,QAAQ,SAAS,CAAC,OAAO,CAACyB;QAEjD,MAAMY,oBAAoB,IAAIC,sBAAsB;YAChD,OAAO3C;YACPwC;QACJ;QACA,MAAMX,eAAe,OAAO,CAACa;QAE7B,MAAMxC,SAAS,MAAMO,gBAAgB,oBAAoB,CAAC;YACtD,MAAMS,QAAQ,MAAMV;YACpB,MAAMoC,cAAcvC,QAAQ,SAAS,CAAC,OAAO,CAACwC;YAC9C,OAAOD,YAAY,OAAO,CAAC1B,OAAO/B,iBAAiBC,KAAK;gBACpD,QAAQ;oBACJ,GAAGY,IAAI;gBACX;YACJ;QACJ;QAEA,IAAIE,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;QAGtB,MAAMkC,OAAO7C,cACTW,OAAO,KAAK;QAGhB,MAAM4C,mBAAmB,IAAIC,qBAAqB;YAC9C,OAAO/C;YACPoC;QACJ;QACA,MAAMP,eAAe,OAAO,CAACiB;QAE7B,OAAOV;IACX;IAEA,MAAMY,aAAa,OAAO5D;QACtB,MAAMgD,OAAO,MAAMnB,QAAQ7B;QAC3B,IAAI,CAACgD,MACD,MAAM,IAAIK;QAGd,MAAMhC,kBAAkBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;QAClD,MAAMmB,iBAAiBxB,QAAQ,SAAS,CAAC,OAAO,CAACyB;QAEjD,MAAMmB,oBAAoB,IAAIC,sBAAsB;YAChDd;QACJ;QACA,MAAMP,eAAe,OAAO,CAACoB;QAE7B,MAAM/C,SAAS,MAAMO,gBAAgB,oBAAoB,CAAC;YACtD,MAAMS,QAAQ,MAAMV;YACpB,MAAM2C,cAAc9C,QAAQ,SAAS,CAAC,OAAO,CAAC+C;YAC9C,OAAOD,YAAY,OAAO,CAACjC,OAAO/B,iBAAiBC;QACvD;QAEA,IAAIc,OAAO,MAAM,IACb,MAAM,IAAIuC;QAGd,MAAMY,mBAAmB,IAAIC,qBAAqB;YAAElB;QAAK;QACzD,MAAMP,eAAe,OAAO,CAACwB;QAE7B,OAAO;IACX;IAEA,MAAME,YAAY,OAAOnB,MAAoCpC;QACzD,MAAMS,kBAAkBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;QAClD,MAAMR,SAAS,MAAMO,gBAAgB,oBAAoB,CAAC;YACtD,MAAMS,QAAQ,MAAMH;YACpB,MAAMkB,cAAc5B,QAAQ,SAAS,CAAC,OAAO,CAAC6B;YAC9C,OAAOD,YAAY,OAAO,CAACf,OAAO;gBAC9B,QAAQ;oBACJ,GAAGlB,IAAI;oBACP,MAAMoC,KAAK,EAAE;gBACjB;YACJ;QACJ;QAEA,IAAIlC,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;QAGtB,OAAOT,aAAaS,OAAO,KAAK;IACpC;IAEA,MAAMsD,YAAY,OAAOpE,IAAYY;QACjC,MAAMS,kBAAkBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;QAClD,MAAMR,SAAS,MAAMO,gBAAgB,oBAAoB,CAAC;YACtD,MAAMS,QAAQ,MAAMH;YACpB,MAAM6B,cAAcvC,QAAQ,SAAS,CAAC,OAAO,CAACwC;YAC9C,OAAOD,YAAY,OAAO,CAAC1B,OAAO/B,iBAAiBC,KAAK;gBACpD,QAAQY;YACZ;QACJ;QAEA,IAAIE,OAAO,MAAM,IACb,MAAM,IAAIuD;QAGd,OAAOhE,aAAaS,OAAO,KAAK;IACpC;IAEA,MAAMwD,YAAY,OAAOtE;QACrB,MAAMqB,kBAAkBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;QAClD,MAAMR,SAAS,MAAMO,gBAAgB,oBAAoB,CAAC;YACtD,MAAMS,QAAQ,MAAMH;YACpB,MAAMoC,cAAc9C,QAAQ,SAAS,CAAC,OAAO,CAAC+C;YAC9C,OAAOD,YAAY,OAAO,CAACjC,OAAO9B;QACtC;QAEA,IAAIc,OAAO,MAAM,IACb,MAAM,IAAIuD;QAGd,OAAO;IACX;IAEA,MAAME,SAAS,OAAOvE;QAClB,MAAMqB,kBAAkBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;QAClD,IAAI;YACA,MAAMR,SAAS,MAAMO,gBAAgB,oBAAoB,CAAC;gBACtD,MAAMS,QAAQ,MAAMH;gBACpB,MAAMI,eAAed,QAAQ,SAAS,CAAC,OAAO,CAACe;gBAC/C,OAAOD,aAAa,OAAO,CAACD,OAAO9B;YACvC;YAEA,IAAIc,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;YAGtB,OAAOT,aAAaS,OAAO,KAAK;QACpC,EAAE,OAAO0D,IAAI;YACT,IAAIA,cAAcC,eACd,OAAO;YAEX,MAAMD;QACV;IACJ;IAEA,MAAME,eAAe,OAAOC;QACxB,MAAMtD,kBAAkBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;QAClD,MAAMlB,QAAQ,MAAMiB,gBAAgB,oBAAoB,CAAC;YACrD,MAAMS,QAAQ,MAAMH;YACpB,MAAMS,oBAAoBnB,QAAQ,SAAS,CAAC,OAAO,CAACoB;YACpD,MAAMvB,SAAS,MAAMsB,kBAAkB,OAAO,CAAWN,OAAO;gBAC5D,OAAO;oBACH,QAAQ;wBACJ,MAAM6C;oBACV;gBACJ;gBACA,MAAM;oBAAC;iBAAiB;gBACxB,OAAO;YACX;YACA,IAAI7D,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;YAEtB,MAAM,EAAEoB,OAAO,EAAE,GAAGpB,OAAO,KAAK;YAChC,MAAM,CAACwB,KAAK,GAAGJ;YACf,IAAI,CAACI,MACD,MAAM,IAAImC,cAAc,CAAC,uCAAuC,EAAEE,OAAO,EAAE,CAAC;YAEhF,OAAOrC;QACX;QAEA,OAAOjC,aAAaD;IACxB;IAEA,MAAMwE,qBAAqBC,yBAAyB5D;IAEpD,MAAM6D,WAAW,OAAOpE;QACpB,MAAMW,kBAAkBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;QAClD,MAAM,EAAEY,OAAO,EAAEC,IAAI,EAAE,GAAG,MAAMd,gBAAgB,oBAAoB,CAAC;YACjE,MAAMS,QAAQ,MAAMH;YACpB,MAAMS,oBAAoBnB,QAAQ,SAAS,CAAC,OAAO,CAACoB;YACpD,MAAMvB,SAAS,MAAMsB,kBAAkB,OAAO,CAAWN,OAAO;gBAC5D,GAAGpB,MAAM;gBACT,OAAOQ,eAAe,GAAG,CAAC;oBACtB,OAAOR,OAAO,KAAK;oBACnB,QAAQoB,MAAM,MAAM;gBACxB;YACJ;YACA,IAAIhB,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;YAEtB,OAAOA,OAAO,KAAK;QACvB;QAEA,OAAO;YACH,OAAOoB,QAAQ,GAAG,CAACI,CAAAA,OAAQjC,aAAaiC;YACxCH;QACJ;IACJ;IAEA,OAAO;QACHN;QACAI;QACAM;QACAY;QACAS;QACAgB;QACAT;QACAC;QACAE;QACAC;QACAO;QACAJ;QACAtD;QACAO;IACJ;AACJ"}
@@ -8,7 +8,7 @@ const MAX_DELAY_DAYS = 355;
8
8
  const MAX_DELAY_SECONDS = 24 * MAX_DELAY_DAYS * 3600;
9
9
  const validateDelay = ({ input, delay })=>{
10
10
  if (!delay || delay < 0 || "number" != typeof delay || false === Number.isInteger(delay)) return;
11
- if (delay < MAX_DELAY_SECONDS) return;
11
+ else if (delay < MAX_DELAY_SECONDS) return;
12
12
  throw new error(`The maximum delay for a task is ${MAX_DELAY_DAYS} days.`, "MAX_DELAY_ERROR", {
13
13
  ...input,
14
14
  delay
@@ -1 +1 @@
1
- {"version":3,"file":"api/crud/service.tasks.js","sources":["../../../src/api/crud/service.tasks.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n Context,\n ITaskAbortParams,\n ITaskCreateData,\n ITaskLog,\n ITasksContextServiceObject,\n ITaskTriggerParams\n} from \"~/api/types.js\";\nimport { TaskDataStatus, TaskLogItemType } from \"~/api/types.js\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { createService } from \"~/api/service/index.js\";\nimport type { IStepFunctionServiceFetchResult } from \"~/api/service/StepFunctionServicePlugin.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { BaseError, Result } from \"@webiny/feature/api\";\nimport {\n TaskAbortError,\n TaskDefinitionNotFoundError,\n TaskNotFoundError,\n TaskServiceInfoError\n} from \"~/api/domain/errors.js\";\n\nconst MAX_DELAY_DAYS = 355;\nconst MAX_DELAY_SECONDS = MAX_DELAY_DAYS * 24 * 60 * 60;\n\ninterface ValidateDelayParams<T extends TaskService.TaskInput> {\n input: ITaskCreateData<T>;\n delay?: number;\n}\n\nconst validateDelay = <T extends TaskService.TaskInput = TaskService.TaskInput>({\n input,\n delay\n}: ValidateDelayParams<T>): void => {\n if (!delay || delay < 0 || typeof delay !== \"number\" || Number.isInteger(delay) === false) {\n return;\n } else if (delay < MAX_DELAY_SECONDS) {\n return;\n }\n throw new WebinyError(\n `The maximum delay for a task is ${MAX_DELAY_DAYS} days.`,\n \"MAX_DELAY_ERROR\",\n {\n ...input,\n delay\n }\n );\n};\n\nexport const createServiceCrud = (context: Context): ITasksContextServiceObject => {\n const service = createService({\n context\n });\n\n return {\n trigger: async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params: ITaskTriggerParams<T>\n ): Promise<Result<TaskService.Task<T, O>, BaseError>> => {\n const { definition: id, input: inputValues, name, parent, delay = 0 } = params;\n const definition = context.tasks.getDefinition(id);\n if (!definition) {\n throw new WebinyError(`Task definition was not found!`, \"TASK_DEFINITION_ERROR\", {\n id\n });\n }\n const input: TaskDefinition.TaskCreateData<T> = {\n name: name || definition.title,\n definitionId: id,\n input: inputValues || ({} as T),\n parentId: parent?.id\n };\n\n if (definition.onBeforeTrigger) {\n await definition.onBeforeTrigger({ data: input });\n }\n validateDelay<T>({\n input,\n delay\n });\n\n let task: TaskService.Task<T>;\n try {\n task = await context.tasks.createTask<T>(input);\n } catch (ex) {\n console.log(\"Could not create the task.\", ex);\n throw ex;\n }\n\n let result: Awaited<ReturnType<typeof service.send>> | null = null;\n try {\n result = await service.send(task, delay);\n\n if (!result) {\n throw new WebinyError(\n `Could not trigger the step function!`,\n \"TRIGGER_STEP_FUNCTION_ERROR\",\n {\n task\n }\n );\n }\n } catch (ex) {\n console.log(\"Could not trigger the step function.\");\n console.error(ex);\n /**\n * In case of failure to create the Event Bridge Event, we need to delete the task that was meant to be created.\n * TODO maybe we can leave the task and update it as failed - with event bridge error?\n */\n await context.tasks.deleteTask(task.id);\n throw ex;\n }\n\n const updatedTask = await context.tasks.updateTask<T, O>(task.id, {\n eventResponse: result\n });\n\n return Result.ok(updatedTask);\n },\n fetchServiceInfo: async (\n input: TaskService.Task | string\n ): Promise<Result<IStepFunctionServiceFetchResult, BaseError<any>>> => {\n const task = typeof input === \"object\" ? input : await context.tasks.getTask(input);\n if (!task && typeof input === \"string\") {\n throw new NotFoundError(`Task \"${input}\" was not found!`);\n } else if (!task) {\n throw new WebinyError(`Task was not found!`, \"TASK_FETCH_ERROR\", {\n input\n });\n }\n\n try {\n const info = (await service.fetch(task)) as IStepFunctionServiceFetchResult | null;\n if (info) {\n return Result.ok(info);\n }\n\n return Result.fail(new TaskServiceInfoError());\n } catch (ex) {\n console.log(\"Service fetch error.\");\n console.error(ex);\n return Result.fail(new TaskServiceInfoError());\n }\n },\n abort: async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params: ITaskAbortParams\n ): Promise<Result<TaskService.Task<T, O>, BaseError<any>>> => {\n const task = await context.tasks.getTask<T, O>(params.id);\n if (!task) {\n return Result.fail(new TaskNotFoundError());\n }\n\n const definition = context.tasks.getDefinition<T, O>(task.definitionId);\n if (!definition) {\n return Result.fail(new TaskDefinitionNotFoundError(task.definitionId));\n }\n /**\n * We should only be able to abort a task which is pending or running\n */\n if (\n [TaskDataStatus.PENDING, TaskDataStatus.RUNNING].includes(task.taskStatus) === false\n ) {\n return Result.fail(\n new TaskAbortError({\n id: params.id,\n status: task.taskStatus\n })\n );\n }\n let taskLog: ITaskLog | null = null;\n try {\n taskLog = await context.tasks.getLatestLog(task.id);\n } catch {}\n if (!taskLog) {\n taskLog = await context.tasks.createLog(task, {\n iteration: 1,\n executionName: task.executionName\n });\n }\n try {\n const updatedTask = await context.tasks.updateTask<T, O>(task.id, {\n taskStatus: TaskDataStatus.ABORTED\n });\n await context.tasks.updateLog(taskLog.id, {\n items: taskLog.items.concat([\n {\n message: params.message || \"Task aborted.\",\n type: TaskLogItemType.INFO,\n createdOn: new Date().toISOString()\n }\n ])\n });\n /**\n * TODO: determine when to kick off the onAbort hook\n */\n if (definition.onAbort) {\n await definition.onAbort({\n task: updatedTask\n });\n }\n\n return Result.ok(updatedTask);\n } catch (ex) {\n throw new WebinyError(`Could not abort the task!`, \"TASK_ABORT_ERROR\", {\n id: params.id,\n message: ex.message\n });\n }\n }\n };\n};\n"],"names":["MAX_DELAY_DAYS","MAX_DELAY_SECONDS","validateDelay","input","delay","Number","WebinyError","createServiceCrud","context","service","createService","params","id","inputValues","name","parent","definition","task","ex","console","result","updatedTask","Result","NotFoundError","info","TaskServiceInfoError","TaskNotFoundError","TaskDefinitionNotFoundError","TaskDataStatus","TaskAbortError","taskLog","TaskLogItemType","Date"],"mappings":"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"}
1
+ {"version":3,"file":"api/crud/service.tasks.js","sources":["../../../src/api/crud/service.tasks.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n Context,\n ITaskAbortParams,\n ITaskCreateData,\n ITaskLog,\n ITasksContextServiceObject,\n ITaskTriggerParams\n} from \"~/api/types.js\";\nimport { TaskDataStatus, TaskLogItemType } from \"~/api/types.js\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { createService } from \"~/api/service/index.js\";\nimport type { IStepFunctionServiceFetchResult } from \"~/api/service/StepFunctionServicePlugin.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { BaseError, Result } from \"@webiny/feature/api\";\nimport {\n TaskAbortError,\n TaskDefinitionNotFoundError,\n TaskNotFoundError,\n TaskServiceInfoError\n} from \"~/api/domain/errors.js\";\n\nconst MAX_DELAY_DAYS = 355;\nconst MAX_DELAY_SECONDS = MAX_DELAY_DAYS * 24 * 60 * 60;\n\ninterface ValidateDelayParams<T extends TaskService.TaskInput> {\n input: ITaskCreateData<T>;\n delay?: number;\n}\n\nconst validateDelay = <T extends TaskService.TaskInput = TaskService.TaskInput>({\n input,\n delay\n}: ValidateDelayParams<T>): void => {\n if (!delay || delay < 0 || typeof delay !== \"number\" || Number.isInteger(delay) === false) {\n return;\n } else if (delay < MAX_DELAY_SECONDS) {\n return;\n }\n throw new WebinyError(\n `The maximum delay for a task is ${MAX_DELAY_DAYS} days.`,\n \"MAX_DELAY_ERROR\",\n {\n ...input,\n delay\n }\n );\n};\n\nexport const createServiceCrud = (context: Context): ITasksContextServiceObject => {\n const service = createService({\n context\n });\n\n return {\n trigger: async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params: ITaskTriggerParams<T>\n ): Promise<Result<TaskService.Task<T, O>, BaseError>> => {\n const { definition: id, input: inputValues, name, parent, delay = 0 } = params;\n const definition = context.tasks.getDefinition(id);\n if (!definition) {\n throw new WebinyError(`Task definition was not found!`, \"TASK_DEFINITION_ERROR\", {\n id\n });\n }\n const input: TaskDefinition.TaskCreateData<T> = {\n name: name || definition.title,\n definitionId: id,\n input: inputValues || ({} as T),\n parentId: parent?.id\n };\n\n if (definition.onBeforeTrigger) {\n await definition.onBeforeTrigger({ data: input });\n }\n validateDelay<T>({\n input,\n delay\n });\n\n let task: TaskService.Task<T>;\n try {\n task = await context.tasks.createTask<T>(input);\n } catch (ex) {\n console.log(\"Could not create the task.\", ex);\n throw ex;\n }\n\n let result: Awaited<ReturnType<typeof service.send>> | null = null;\n try {\n result = await service.send(task, delay);\n\n if (!result) {\n throw new WebinyError(\n `Could not trigger the step function!`,\n \"TRIGGER_STEP_FUNCTION_ERROR\",\n {\n task\n }\n );\n }\n } catch (ex) {\n console.log(\"Could not trigger the step function.\");\n console.error(ex);\n /**\n * In case of failure to create the Event Bridge Event, we need to delete the task that was meant to be created.\n * TODO maybe we can leave the task and update it as failed - with event bridge error?\n */\n await context.tasks.deleteTask(task.id);\n throw ex;\n }\n\n const updatedTask = await context.tasks.updateTask<T, O>(task.id, {\n eventResponse: result\n });\n\n return Result.ok(updatedTask);\n },\n fetchServiceInfo: async (\n input: TaskService.Task | string\n ): Promise<Result<IStepFunctionServiceFetchResult, BaseError<any>>> => {\n const task = typeof input === \"object\" ? input : await context.tasks.getTask(input);\n if (!task && typeof input === \"string\") {\n throw new NotFoundError(`Task \"${input}\" was not found!`);\n } else if (!task) {\n throw new WebinyError(`Task was not found!`, \"TASK_FETCH_ERROR\", {\n input\n });\n }\n\n try {\n const info = (await service.fetch(task)) as IStepFunctionServiceFetchResult | null;\n if (info) {\n return Result.ok(info);\n }\n\n return Result.fail(new TaskServiceInfoError());\n } catch (ex) {\n console.log(\"Service fetch error.\");\n console.error(ex);\n return Result.fail(new TaskServiceInfoError());\n }\n },\n abort: async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params: ITaskAbortParams\n ): Promise<Result<TaskService.Task<T, O>, BaseError<any>>> => {\n const task = await context.tasks.getTask<T, O>(params.id);\n if (!task) {\n return Result.fail(new TaskNotFoundError());\n }\n\n const definition = context.tasks.getDefinition<T, O>(task.definitionId);\n if (!definition) {\n return Result.fail(new TaskDefinitionNotFoundError(task.definitionId));\n }\n /**\n * We should only be able to abort a task which is pending or running\n */\n if (\n [TaskDataStatus.PENDING, TaskDataStatus.RUNNING].includes(task.taskStatus) === false\n ) {\n return Result.fail(\n new TaskAbortError({\n id: params.id,\n status: task.taskStatus\n })\n );\n }\n let taskLog: ITaskLog | null = null;\n try {\n taskLog = await context.tasks.getLatestLog(task.id);\n } catch {}\n if (!taskLog) {\n taskLog = await context.tasks.createLog(task, {\n iteration: 1,\n executionName: task.executionName\n });\n }\n try {\n const updatedTask = await context.tasks.updateTask<T, O>(task.id, {\n taskStatus: TaskDataStatus.ABORTED\n });\n await context.tasks.updateLog(taskLog.id, {\n items: taskLog.items.concat([\n {\n message: params.message || \"Task aborted.\",\n type: TaskLogItemType.INFO,\n createdOn: new Date().toISOString()\n }\n ])\n });\n /**\n * TODO: determine when to kick off the onAbort hook\n */\n if (definition.onAbort) {\n await definition.onAbort({\n task: updatedTask\n });\n }\n\n return Result.ok(updatedTask);\n } catch (ex) {\n throw new WebinyError(`Could not abort the task!`, \"TASK_ABORT_ERROR\", {\n id: params.id,\n message: ex.message\n });\n }\n }\n };\n};\n"],"names":["MAX_DELAY_DAYS","MAX_DELAY_SECONDS","validateDelay","input","delay","Number","WebinyError","createServiceCrud","context","service","createService","params","id","inputValues","name","parent","definition","task","ex","console","result","updatedTask","Result","NotFoundError","info","TaskServiceInfoError","TaskNotFoundError","TaskDefinitionNotFoundError","TaskDataStatus","TaskAbortError","taskLog","TaskLogItemType","Date"],"mappings":"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"}
@@ -16,7 +16,7 @@ declare class RunnableTaskDecoratorImpl implements TaskDefinition.Interface {
16
16
  get databaseLogs(): boolean;
17
17
  get maxIterations(): number;
18
18
  get selfCleanup(): import("@webiny/api-core/features/task/TaskDefinition/abstractions").ISelfCleanup | undefined;
19
- get createInputValidation(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskCreateInputValidationParams) => import("@webiny/api/types").GenericRecord<PropertyKey, import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>> | import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>) | undefined;
19
+ get createInputValidation(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskCreateInputValidationParams) => import("@webiny/api/types").GenericRecord<PropertyKey, import("zod").Schema<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>> | import("zod").Schema<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>) | undefined;
20
20
  get run(): (params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskRunParams<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>) => Promise<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskResult<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
21
21
  get onBeforeTrigger(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskBeforeTriggerParams<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput>) => Promise<void>) | undefined;
22
22
  get onDone(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskLifecycleHook<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>) => Promise<void>) | undefined;
@@ -13,7 +13,7 @@ export declare class SelfCleaningTaskDecoratorImpl implements TaskDefinition.Int
13
13
  get isPrivate(): boolean | undefined;
14
14
  get maxIterations(): number | undefined;
15
15
  get selfCleanup(): import("@webiny/api-core/features/task/TaskDefinition/abstractions").ISelfCleanup | undefined;
16
- get createInputValidation(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskCreateInputValidationParams) => import("@webiny/api/types").GenericRecord<PropertyKey, import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>> | import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>) | undefined;
16
+ get createInputValidation(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskCreateInputValidationParams) => import("@webiny/api/types").GenericRecord<PropertyKey, import("zod").Schema<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>> | import("zod").Schema<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>) | undefined;
17
17
  get run(): (params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskRunParams<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>) => Promise<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskResult<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
18
18
  get onBeforeTrigger(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskBeforeTriggerParams<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput>) => Promise<void>) | undefined;
19
19
  get onMaxIterations(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskLifecycleHook<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>) => Promise<void>) | undefined;
@@ -53,12 +53,12 @@ class TaskControl {
53
53
  });
54
54
  }
55
55
  if (task.taskStatus === TaskDataStatus.ABORTED) return this.response.aborted();
56
- if (task.taskStatus === TaskDataStatus.SUCCESS) return this.response.error({
56
+ else if (task.taskStatus === TaskDataStatus.SUCCESS) return this.response.error({
57
57
  error: {
58
58
  message: "Task is already done, cannot run it again."
59
59
  }
60
60
  });
61
- if (task.taskStatus === TaskDataStatus.FAILED) return this.response.error({
61
+ else if (task.taskStatus === TaskDataStatus.FAILED) return this.response.error({
62
62
  error: {
63
63
  message: "Task has failed, cannot run it again."
64
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api/runner/TaskControl.js","sources":["../../../src/api/runner/TaskControl.ts"],"sourcesContent":["import type { ITaskEvent } from \"~/api/handler/types.js\";\nimport type { Context, ITask, ITaskDataInput, ITaskLog } from \"~/api/types.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\nimport type { ITaskControl, ITaskRunner } from \"./abstractions/index.js\";\nimport { TaskManager } from \"./TaskManager.js\";\nimport type { IResponse, IResponseResult } from \"~/api/response/abstractions/index.js\";\nimport { DatabaseResponse, TaskResponse } from \"~/api/response/index.js\";\nimport { TaskManagerStore } from \"./TaskManagerStore.js\";\nimport { getErrorProperties } from \"~/api/utils/getErrorProperties.js\";\nimport { AuthenticatedIdentity } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { TaskExecutionContext } from \"~/api/features/TaskExecutionContext/index.js\";\nimport {\n TaskDefinition,\n TaskResultStatus\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\ninterface IGetTaskLogParams {\n task: ITask;\n databaseLogs: boolean;\n}\n\nexport class TaskControl implements ITaskControl {\n public readonly runner: ITaskRunner;\n public readonly response: IResponse;\n public readonly context: Context;\n\n public constructor(runner: ITaskRunner, response: IResponse, context: Context) {\n this.runner = runner;\n this.context = context;\n this.response = response;\n }\n\n public async run(event: Pick<ITaskEvent, \"webinyTaskId\">): Promise<IResponseResult> {\n const taskId = event.webinyTaskId;\n /**\n * This is the initial getTask idea.\n * We will need to take care of child tasks:\n * * child tasks can be in multiple levels (child task creates a child task, etc...).\n * * child tasks could be executed in parallel.\n */\n let task: ITask<ITaskDataInput>;\n try {\n task = await this.getTask(taskId);\n this.context.security.setIdentity(\n new AuthenticatedIdentity({\n id: task.createdBy.id,\n type: task.createdBy.type,\n displayName: task.createdBy.displayName ?? \"\",\n context: {\n canAccessTenant: true\n }\n })\n );\n } catch (error) {\n /**\n * TODO Refactor error handling.\n */\n // @ts-expect-error\n return this.response.error({\n ...getErrorProperties(error)\n });\n }\n /**\n * Let's get the task definition.\n */\n const definition = this.context.tasks.getDefinition(task.definitionId);\n if (!definition) {\n return this.response.error({\n error: {\n message: `Task \"${task.id}\" cannot be executed because there is no \"${task.definitionId}\" definition plugin.`,\n code: \"TASK_DEFINITION_ERROR\",\n data: {\n definitionId: task.definitionId\n }\n }\n });\n }\n /**\n * Only enable logs if definition explicitly allows them.\n */\n const databaseLogs = definition.databaseLogs === true;\n\n /**\n * As this as a run of the task, we need to create a new log entry.\n */\n let taskLog: ITaskLog;\n try {\n taskLog = await this.getTaskLog({\n task,\n databaseLogs\n });\n } catch (error) {\n return this.response.error({\n error\n });\n }\n /**\n * Make sure that task does not run if it is aborted.\n * This will effectively end the Step Function execution with a \"success\" status.\n */\n if (task.taskStatus === TaskDataStatus.ABORTED) {\n return this.response.aborted();\n }\n /**\n * Do not run if already a success (done).\n */\n //\n else if (task.taskStatus === TaskDataStatus.SUCCESS) {\n return this.response.error({\n error: {\n message: \"Task is already done, cannot run it again.\"\n }\n });\n }\n /**\n * Do not run if already failed.\n */\n //\n else if (task.taskStatus === TaskDataStatus.FAILED) {\n return this.response.error({\n error: {\n message: \"Task has failed, cannot run it again.\"\n }\n });\n }\n\n const store = new TaskManagerStore({\n context: this.context,\n task,\n log: taskLog,\n databaseLogs\n });\n\n // Populate TaskExecutionContext BEFORE executing task\n const executionContext = this.context.container.resolve(TaskExecutionContext);\n executionContext.setStore(store);\n executionContext.setRunner(this.runner);\n executionContext.setTimer(this.runner.timer);\n executionContext.setResponse(new TaskResponse(this.response));\n\n const manager = new TaskManager(this.context, this.response, store);\n\n const databaseResponse = new DatabaseResponse(this.response, store);\n\n try {\n const result = await manager.run(definition);\n\n const responseResult = await databaseResponse.from(result);\n\n // Get the updated task from store (no database read needed - store maintains local cache)\n await this.runEvents(result, definition, store.getTask());\n\n return responseResult;\n } catch (ex) {\n /**\n * We always want to store the error in the task log.\n */\n return await databaseResponse.from(\n this.response.error({\n error: {\n message: ex.message,\n code: ex.code || \"TASK_ERROR\",\n stack: ex.stack,\n data: {\n ...ex.data,\n input: task.input\n }\n }\n })\n );\n } finally {\n // Clear execution context after task completes\n executionContext.clear();\n }\n }\n\n private async runEvents(\n result: IResponseResult,\n definition: TaskDefinition.Runnable,\n task: ITask\n ): Promise<void> {\n if (result.status === TaskResultStatus.ERROR && definition.onError) {\n try {\n await definition.onError({ task });\n } catch (ex) {\n console.error(`Error executing onError hook for task \"${task.id}\".`);\n console.log(getErrorProperties(ex));\n }\n } else if (result.status === TaskResultStatus.DONE && definition.onDone) {\n try {\n await definition.onDone({ task });\n } catch (ex) {\n console.error(`Error executing onDone hook for task \"${task.id}\".`);\n console.log(getErrorProperties(ex));\n }\n }\n }\n\n private async getTask<T extends TaskDefinition.TaskInput>(id: string): Promise<ITask<T>> {\n try {\n const task = await this.runner.context.tasks.getTask<T>(id);\n if (task) {\n return task;\n }\n } catch (ex) {\n throw this.response.error({\n error: {\n message: ex.message,\n code: ex.code || \"TASK_ERROR\",\n stack: ex.stack,\n data: ex.data\n }\n });\n }\n throw this.response.error({\n error: {\n message: `Task \"${id}\" cannot be executed because it does not exist.`,\n code: \"TASK_NOT_FOUND\"\n }\n });\n }\n\n private async getTaskLog(params: IGetTaskLogParams): Promise<ITaskLog> {\n const { task, databaseLogs } = params;\n /**\n * If logs are disabled, let's return a mocked one.\n */\n if (!databaseLogs) {\n return {\n id: `${task.id}-log`,\n createdOn: task.createdOn,\n createdBy: task.createdBy,\n executionName: task.executionName,\n task: task.id,\n iteration: task.iterations,\n items: []\n };\n }\n let taskLog: ITaskLog | null = null;\n /**\n * First we are trying to get existing latest log.\n */\n try {\n taskLog = await this.context.tasks.getLatestLog(task.id);\n } catch (error) {\n /**\n * If error is not the NotFoundError, we need to throw it.\n */\n if (error.code !== \"NOT_FOUND\") {\n throw this.response.error({\n error\n });\n }\n /**\n * Otherwise just continue and create a new log.\n */\n }\n\n const currentIteration = taskLog?.iteration || 0;\n\n try {\n return await this.context.tasks.createLog(task, {\n executionName: this.response.event.executionName,\n iteration: currentIteration + 1\n });\n } catch (error) {\n throw this.response.error({\n error\n });\n }\n }\n}\n"],"names":["TaskControl","runner","response","context","event","taskId","task","AuthenticatedIdentity","error","getErrorProperties","definition","databaseLogs","taskLog","TaskDataStatus","store","TaskManagerStore","executionContext","TaskExecutionContext","TaskResponse","manager","TaskManager","databaseResponse","DatabaseResponse","result","responseResult","ex","TaskResultStatus","console","id","params","currentIteration"],"mappings":"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"}
1
+ {"version":3,"file":"api/runner/TaskControl.js","sources":["../../../src/api/runner/TaskControl.ts"],"sourcesContent":["import type { ITaskEvent } from \"~/api/handler/types.js\";\nimport type { Context, ITask, ITaskDataInput, ITaskLog } from \"~/api/types.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\nimport type { ITaskControl, ITaskRunner } from \"./abstractions/index.js\";\nimport { TaskManager } from \"./TaskManager.js\";\nimport type { IResponse, IResponseResult } from \"~/api/response/abstractions/index.js\";\nimport { DatabaseResponse, TaskResponse } from \"~/api/response/index.js\";\nimport { TaskManagerStore } from \"./TaskManagerStore.js\";\nimport { getErrorProperties } from \"~/api/utils/getErrorProperties.js\";\nimport { AuthenticatedIdentity } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { TaskExecutionContext } from \"~/api/features/TaskExecutionContext/index.js\";\nimport {\n TaskDefinition,\n TaskResultStatus\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\ninterface IGetTaskLogParams {\n task: ITask;\n databaseLogs: boolean;\n}\n\nexport class TaskControl implements ITaskControl {\n public readonly runner: ITaskRunner;\n public readonly response: IResponse;\n public readonly context: Context;\n\n public constructor(runner: ITaskRunner, response: IResponse, context: Context) {\n this.runner = runner;\n this.context = context;\n this.response = response;\n }\n\n public async run(event: Pick<ITaskEvent, \"webinyTaskId\">): Promise<IResponseResult> {\n const taskId = event.webinyTaskId;\n /**\n * This is the initial getTask idea.\n * We will need to take care of child tasks:\n * * child tasks can be in multiple levels (child task creates a child task, etc...).\n * * child tasks could be executed in parallel.\n */\n let task: ITask<ITaskDataInput>;\n try {\n task = await this.getTask(taskId);\n this.context.security.setIdentity(\n new AuthenticatedIdentity({\n id: task.createdBy.id,\n type: task.createdBy.type,\n displayName: task.createdBy.displayName ?? \"\",\n context: {\n canAccessTenant: true\n }\n })\n );\n } catch (error) {\n /**\n * TODO Refactor error handling.\n */\n // @ts-expect-error\n return this.response.error({\n ...getErrorProperties(error)\n });\n }\n /**\n * Let's get the task definition.\n */\n const definition = this.context.tasks.getDefinition(task.definitionId);\n if (!definition) {\n return this.response.error({\n error: {\n message: `Task \"${task.id}\" cannot be executed because there is no \"${task.definitionId}\" definition plugin.`,\n code: \"TASK_DEFINITION_ERROR\",\n data: {\n definitionId: task.definitionId\n }\n }\n });\n }\n /**\n * Only enable logs if definition explicitly allows them.\n */\n const databaseLogs = definition.databaseLogs === true;\n\n /**\n * As this as a run of the task, we need to create a new log entry.\n */\n let taskLog: ITaskLog;\n try {\n taskLog = await this.getTaskLog({\n task,\n databaseLogs\n });\n } catch (error) {\n return this.response.error({\n error\n });\n }\n /**\n * Make sure that task does not run if it is aborted.\n * This will effectively end the Step Function execution with a \"success\" status.\n */\n if (task.taskStatus === TaskDataStatus.ABORTED) {\n return this.response.aborted();\n }\n /**\n * Do not run if already a success (done).\n */\n //\n else if (task.taskStatus === TaskDataStatus.SUCCESS) {\n return this.response.error({\n error: {\n message: \"Task is already done, cannot run it again.\"\n }\n });\n }\n /**\n * Do not run if already failed.\n */\n //\n else if (task.taskStatus === TaskDataStatus.FAILED) {\n return this.response.error({\n error: {\n message: \"Task has failed, cannot run it again.\"\n }\n });\n }\n\n const store = new TaskManagerStore({\n context: this.context,\n task,\n log: taskLog,\n databaseLogs\n });\n\n // Populate TaskExecutionContext BEFORE executing task\n const executionContext = this.context.container.resolve(TaskExecutionContext);\n executionContext.setStore(store);\n executionContext.setRunner(this.runner);\n executionContext.setTimer(this.runner.timer);\n executionContext.setResponse(new TaskResponse(this.response));\n\n const manager = new TaskManager(this.context, this.response, store);\n\n const databaseResponse = new DatabaseResponse(this.response, store);\n\n try {\n const result = await manager.run(definition);\n\n const responseResult = await databaseResponse.from(result);\n\n // Get the updated task from store (no database read needed - store maintains local cache)\n await this.runEvents(result, definition, store.getTask());\n\n return responseResult;\n } catch (ex) {\n /**\n * We always want to store the error in the task log.\n */\n return await databaseResponse.from(\n this.response.error({\n error: {\n message: ex.message,\n code: ex.code || \"TASK_ERROR\",\n stack: ex.stack,\n data: {\n ...ex.data,\n input: task.input\n }\n }\n })\n );\n } finally {\n // Clear execution context after task completes\n executionContext.clear();\n }\n }\n\n private async runEvents(\n result: IResponseResult,\n definition: TaskDefinition.Runnable,\n task: ITask\n ): Promise<void> {\n if (result.status === TaskResultStatus.ERROR && definition.onError) {\n try {\n await definition.onError({ task });\n } catch (ex) {\n console.error(`Error executing onError hook for task \"${task.id}\".`);\n console.log(getErrorProperties(ex));\n }\n } else if (result.status === TaskResultStatus.DONE && definition.onDone) {\n try {\n await definition.onDone({ task });\n } catch (ex) {\n console.error(`Error executing onDone hook for task \"${task.id}\".`);\n console.log(getErrorProperties(ex));\n }\n }\n }\n\n private async getTask<T extends TaskDefinition.TaskInput>(id: string): Promise<ITask<T>> {\n try {\n const task = await this.runner.context.tasks.getTask<T>(id);\n if (task) {\n return task;\n }\n } catch (ex) {\n throw this.response.error({\n error: {\n message: ex.message,\n code: ex.code || \"TASK_ERROR\",\n stack: ex.stack,\n data: ex.data\n }\n });\n }\n throw this.response.error({\n error: {\n message: `Task \"${id}\" cannot be executed because it does not exist.`,\n code: \"TASK_NOT_FOUND\"\n }\n });\n }\n\n private async getTaskLog(params: IGetTaskLogParams): Promise<ITaskLog> {\n const { task, databaseLogs } = params;\n /**\n * If logs are disabled, let's return a mocked one.\n */\n if (!databaseLogs) {\n return {\n id: `${task.id}-log`,\n createdOn: task.createdOn,\n createdBy: task.createdBy,\n executionName: task.executionName,\n task: task.id,\n iteration: task.iterations,\n items: []\n };\n }\n let taskLog: ITaskLog | null = null;\n /**\n * First we are trying to get existing latest log.\n */\n try {\n taskLog = await this.context.tasks.getLatestLog(task.id);\n } catch (error) {\n /**\n * If error is not the NotFoundError, we need to throw it.\n */\n if (error.code !== \"NOT_FOUND\") {\n throw this.response.error({\n error\n });\n }\n /**\n * Otherwise just continue and create a new log.\n */\n }\n\n const currentIteration = taskLog?.iteration || 0;\n\n try {\n return await this.context.tasks.createLog(task, {\n executionName: this.response.event.executionName,\n iteration: currentIteration + 1\n });\n } catch (error) {\n throw this.response.error({\n error\n });\n }\n }\n}\n"],"names":["TaskControl","runner","response","context","event","taskId","task","AuthenticatedIdentity","error","getErrorProperties","definition","databaseLogs","taskLog","TaskDataStatus","store","TaskManagerStore","executionContext","TaskExecutionContext","TaskResponse","manager","TaskManager","databaseResponse","DatabaseResponse","result","responseResult","ex","TaskResultStatus","console","id","params","currentIteration"],"mappings":"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"}
@@ -10,7 +10,7 @@ class TaskManager {
10
10
  }
11
11
  async run(definition) {
12
12
  if (this.store.getStatus() === TaskDataStatus.ABORTED) return this.response.aborted();
13
- if (this.store.getStatus() === TaskDataStatus.PENDING) try {
13
+ else if (this.store.getStatus() === TaskDataStatus.PENDING) try {
14
14
  await this.store.updateTask({
15
15
  taskStatus: TaskDataStatus.RUNNING,
16
16
  startedOn: new Date().toISOString(),
@@ -66,10 +66,10 @@ class TaskManager {
66
66
  input: result.input,
67
67
  wait: result.wait
68
68
  });
69
- if (result.status === TaskResultStatus.ERROR) return this.response.error({
69
+ else if (result.status === TaskResultStatus.ERROR) return this.response.error({
70
70
  error: result.error
71
71
  });
72
- if (result.status === TaskResultStatus.ABORTED) return this.response.aborted();
72
+ else if (result.status === TaskResultStatus.ABORTED) return this.response.aborted();
73
73
  return this.response.done({
74
74
  message: result.message,
75
75
  output: result.output
@@ -1 +1 @@
1
- {"version":3,"file":"api/runner/TaskManager.js","sources":["../../../src/api/runner/TaskManager.ts"],"sourcesContent":["import type { ITaskManager, ITaskManagerStorePrivate } from \"./abstractions/index.js\";\nimport type { Context } from \"~/api/types.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\nimport type { IResponse, IResponseResult } from \"~/api/response/abstractions/index.js\";\nimport { getErrorProperties } from \"~/api/utils/getErrorProperties.js\";\nimport {\n TaskDefinition,\n TaskResultStatus\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { TaskController } from \"@webiny/api-core/features/task/TaskController/abstractions.js\";\n\nexport class TaskManager implements ITaskManager {\n private readonly context: Context;\n private readonly response: IResponse;\n private readonly store: ITaskManagerStorePrivate;\n\n public constructor(context: Context, response: IResponse, store: ITaskManagerStorePrivate) {\n this.context = context;\n this.response = response;\n this.store = store;\n }\n\n public async run(definition: TaskDefinition.Runnable): Promise<IResponseResult> {\n /**\n * If task was aborted, do not run it again, return as it was done.\n */\n if (this.store.getStatus() === TaskDataStatus.ABORTED) {\n return this.response.aborted();\n }\n /**\n * If the task status is pending, update it to running and add a log.\n */\n //\n else if (this.store.getStatus() === TaskDataStatus.PENDING) {\n try {\n await this.store.updateTask({\n taskStatus: TaskDataStatus.RUNNING,\n startedOn: new Date().toISOString(),\n executionName: this.response.event.executionName,\n iterations: 1\n });\n await this.store.save();\n } catch (error) {\n return this.response.error({\n error\n });\n }\n }\n /**\n * We do not want to run the task indefinitely.\n * If the task has reached the max iterations, we will stop it and execute the onMaxIterations handler, if any.\n */\n //\n else if (this.store.getTask().iterations >= definition.maxIterations) {\n try {\n if (definition.onMaxIterations) {\n await definition.onMaxIterations({\n task: this.store.getTask()\n });\n }\n return this.response.error({\n error: {\n message: \"Task reached max iterations.\"\n }\n });\n } catch (ex) {\n return this.response.error({\n error: {\n message: \"Failed to execute onMaxIterations handler.\",\n data: getErrorProperties(ex)\n }\n });\n }\n }\n /**\n * Always update the task iteration.\n */\n //\n else {\n try {\n await this.store.updateTask(task => {\n return {\n iterations: task.iterations + 1\n };\n });\n } catch (error) {\n return this.response.error({\n error\n });\n }\n }\n\n let result: TaskDefinition.Result;\n\n try {\n const input = structuredClone(this.store.getInput());\n const controller = this.context.container.resolve(TaskController);\n /**\n * We always run the task without authorization because we are running a task without a user - nothing to authorize against.\n */\n result = await this.context.security.withoutAuthorization(async () => {\n return await definition.run({\n input,\n controller\n });\n });\n } catch (ex) {\n return this.response.error({\n error: getErrorProperties(ex)\n });\n }\n\n // Convert TaskDefinition.Result to IResponseResult\n if (result.status === TaskResultStatus.CONTINUE) {\n return this.response.continue({\n input: result.input,\n wait: result.wait\n });\n } else if (result.status === TaskResultStatus.ERROR) {\n return this.response.error({\n error: result.error\n });\n } else if (result.status === TaskResultStatus.ABORTED) {\n return this.response.aborted();\n }\n return this.response.done({\n message: result.message,\n output: result.output\n });\n }\n}\n"],"names":["TaskManager","context","response","store","definition","TaskDataStatus","Date","error","ex","getErrorProperties","task","result","input","structuredClone","controller","TaskController","TaskResultStatus"],"mappings":";;;;AAWO,MAAMA;IAKT,YAAmBC,OAAgB,EAAEC,QAAmB,EAAEC,KAA+B,CAAE;QACvF,IAAI,CAAC,OAAO,GAAGF;QACf,IAAI,CAAC,QAAQ,GAAGC;QAChB,IAAI,CAAC,KAAK,GAAGC;IACjB;IAEA,MAAa,IAAIC,UAAmC,EAA4B;QAI5E,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,OAAOC,eAAe,OAAO,EACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO;QAM3B,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,OAAOA,eAAe,OAAO,EACtD,IAAI;YACA,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;gBACxB,YAAYA,eAAe,OAAO;gBAClC,WAAW,IAAIC,OAAO,WAAW;gBACjC,eAAe,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa;gBAChD,YAAY;YAChB;YACA,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI;QACzB,EAAE,OAAOC,OAAO;YACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvBA;YACJ;QACJ;aAOC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,IAAIH,WAAW,aAAa,EAChE,IAAI;YACA,IAAIA,WAAW,eAAe,EAC1B,MAAMA,WAAW,eAAe,CAAC;gBAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO;YAC5B;YAEJ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAO;oBACH,SAAS;gBACb;YACJ;QACJ,EAAE,OAAOI,IAAI;YACT,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAO;oBACH,SAAS;oBACT,MAAMC,mBAAmBD;gBAC7B;YACJ;QACJ;aAOA,IAAI;YACA,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAACE,CAAAA,OACjB;oBACH,YAAYA,KAAK,UAAU,GAAG;gBAClC;QAER,EAAE,OAAOH,OAAO;YACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvBA;YACJ;QACJ;QAGJ,IAAII;QAEJ,IAAI;YACA,MAAMC,QAAQC,gBAAgB,IAAI,CAAC,KAAK,CAAC,QAAQ;YACjD,MAAMC,aAAa,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAACC;YAIlDJ,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,UAC/C,MAAMP,WAAW,GAAG,CAAC;oBACxBQ;oBACAE;gBACJ;QAER,EAAE,OAAON,IAAI;YACT,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAOC,mBAAmBD;YAC9B;QACJ;QAGA,IAAIG,OAAO,MAAM,KAAKK,iBAAiB,QAAQ,EAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,OAAOL,OAAO,KAAK;YACnB,MAAMA,OAAO,IAAI;QACrB;QACG,IAAIA,OAAO,MAAM,KAAKK,iBAAiB,KAAK,EAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvB,OAAOL,OAAO,KAAK;QACvB;QACG,IAAIA,OAAO,MAAM,KAAKK,iBAAiB,OAAO,EACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO;QAEhC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACtB,SAASL,OAAO,OAAO;YACvB,QAAQA,OAAO,MAAM;QACzB;IACJ;AACJ"}
1
+ {"version":3,"file":"api/runner/TaskManager.js","sources":["../../../src/api/runner/TaskManager.ts"],"sourcesContent":["import type { ITaskManager, ITaskManagerStorePrivate } from \"./abstractions/index.js\";\nimport type { Context } from \"~/api/types.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\nimport type { IResponse, IResponseResult } from \"~/api/response/abstractions/index.js\";\nimport { getErrorProperties } from \"~/api/utils/getErrorProperties.js\";\nimport {\n TaskDefinition,\n TaskResultStatus\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { TaskController } from \"@webiny/api-core/features/task/TaskController/abstractions.js\";\n\nexport class TaskManager implements ITaskManager {\n private readonly context: Context;\n private readonly response: IResponse;\n private readonly store: ITaskManagerStorePrivate;\n\n public constructor(context: Context, response: IResponse, store: ITaskManagerStorePrivate) {\n this.context = context;\n this.response = response;\n this.store = store;\n }\n\n public async run(definition: TaskDefinition.Runnable): Promise<IResponseResult> {\n /**\n * If task was aborted, do not run it again, return as it was done.\n */\n if (this.store.getStatus() === TaskDataStatus.ABORTED) {\n return this.response.aborted();\n }\n /**\n * If the task status is pending, update it to running and add a log.\n */\n //\n else if (this.store.getStatus() === TaskDataStatus.PENDING) {\n try {\n await this.store.updateTask({\n taskStatus: TaskDataStatus.RUNNING,\n startedOn: new Date().toISOString(),\n executionName: this.response.event.executionName,\n iterations: 1\n });\n await this.store.save();\n } catch (error) {\n return this.response.error({\n error\n });\n }\n }\n /**\n * We do not want to run the task indefinitely.\n * If the task has reached the max iterations, we will stop it and execute the onMaxIterations handler, if any.\n */\n //\n else if (this.store.getTask().iterations >= definition.maxIterations) {\n try {\n if (definition.onMaxIterations) {\n await definition.onMaxIterations({\n task: this.store.getTask()\n });\n }\n return this.response.error({\n error: {\n message: \"Task reached max iterations.\"\n }\n });\n } catch (ex) {\n return this.response.error({\n error: {\n message: \"Failed to execute onMaxIterations handler.\",\n data: getErrorProperties(ex)\n }\n });\n }\n }\n /**\n * Always update the task iteration.\n */\n //\n else {\n try {\n await this.store.updateTask(task => {\n return {\n iterations: task.iterations + 1\n };\n });\n } catch (error) {\n return this.response.error({\n error\n });\n }\n }\n\n let result: TaskDefinition.Result;\n\n try {\n const input = structuredClone(this.store.getInput());\n const controller = this.context.container.resolve(TaskController);\n /**\n * We always run the task without authorization because we are running a task without a user - nothing to authorize against.\n */\n result = await this.context.security.withoutAuthorization(async () => {\n return await definition.run({\n input,\n controller\n });\n });\n } catch (ex) {\n return this.response.error({\n error: getErrorProperties(ex)\n });\n }\n\n // Convert TaskDefinition.Result to IResponseResult\n if (result.status === TaskResultStatus.CONTINUE) {\n return this.response.continue({\n input: result.input,\n wait: result.wait\n });\n } else if (result.status === TaskResultStatus.ERROR) {\n return this.response.error({\n error: result.error\n });\n } else if (result.status === TaskResultStatus.ABORTED) {\n return this.response.aborted();\n }\n return this.response.done({\n message: result.message,\n output: result.output\n });\n }\n}\n"],"names":["TaskManager","context","response","store","definition","TaskDataStatus","Date","error","ex","getErrorProperties","task","result","input","structuredClone","controller","TaskController","TaskResultStatus"],"mappings":";;;;AAWO,MAAMA;IAKT,YAAmBC,OAAgB,EAAEC,QAAmB,EAAEC,KAA+B,CAAE;QACvF,IAAI,CAAC,OAAO,GAAGF;QACf,IAAI,CAAC,QAAQ,GAAGC;QAChB,IAAI,CAAC,KAAK,GAAGC;IACjB;IAEA,MAAa,IAAIC,UAAmC,EAA4B;QAI5E,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,OAAOC,eAAe,OAAO,EACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO;aAM3B,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,OAAOA,eAAe,OAAO,EACtD,IAAI;YACA,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;gBACxB,YAAYA,eAAe,OAAO;gBAClC,WAAW,IAAIC,OAAO,WAAW;gBACjC,eAAe,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa;gBAChD,YAAY;YAChB;YACA,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI;QACzB,EAAE,OAAOC,OAAO;YACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvBA;YACJ;QACJ;aAOC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,IAAIH,WAAW,aAAa,EAChE,IAAI;YACA,IAAIA,WAAW,eAAe,EAC1B,MAAMA,WAAW,eAAe,CAAC;gBAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO;YAC5B;YAEJ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAO;oBACH,SAAS;gBACb;YACJ;QACJ,EAAE,OAAOI,IAAI;YACT,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAO;oBACH,SAAS;oBACT,MAAMC,mBAAmBD;gBAC7B;YACJ;QACJ;aAOA,IAAI;YACA,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAACE,CAAAA,OACjB;oBACH,YAAYA,KAAK,UAAU,GAAG;gBAClC;QAER,EAAE,OAAOH,OAAO;YACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvBA;YACJ;QACJ;QAGJ,IAAII;QAEJ,IAAI;YACA,MAAMC,QAAQC,gBAAgB,IAAI,CAAC,KAAK,CAAC,QAAQ;YACjD,MAAMC,aAAa,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAACC;YAIlDJ,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,UAC/C,MAAMP,WAAW,GAAG,CAAC;oBACxBQ;oBACAE;gBACJ;QAER,EAAE,OAAON,IAAI;YACT,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAOC,mBAAmBD;YAC9B;QACJ;QAGA,IAAIG,OAAO,MAAM,KAAKK,iBAAiB,QAAQ,EAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,OAAOL,OAAO,KAAK;YACnB,MAAMA,OAAO,IAAI;QACrB;aACG,IAAIA,OAAO,MAAM,KAAKK,iBAAiB,KAAK,EAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvB,OAAOL,OAAO,KAAK;QACvB;aACG,IAAIA,OAAO,MAAM,KAAKK,iBAAiB,OAAO,EACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO;QAEhC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACtB,SAASL,OAAO,OAAO;YACvB,QAAQA,OAAO,MAAM;QACzB;IACJ;AACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/background-tasks",
3
- "version": "6.5.0-beta.1",
3
+ "version": "6.5.0-beta.11",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -19,39 +19,39 @@
19
19
  },
20
20
  "license": "MIT",
21
21
  "dependencies": {
22
- "@webiny/admin-ui": "6.5.0-beta.1",
23
- "@webiny/api": "6.5.0-beta.1",
24
- "@webiny/api-core": "6.5.0-beta.1",
25
- "@webiny/api-headless-cms": "6.5.0-beta.1",
26
- "@webiny/app": "6.5.0-beta.1",
27
- "@webiny/app-admin": "6.5.0-beta.1",
28
- "@webiny/aws-sdk": "6.5.0-beta.1",
29
- "@webiny/error": "6.5.0-beta.1",
30
- "@webiny/feature": "6.5.0-beta.1",
31
- "@webiny/handler": "6.5.0-beta.1",
32
- "@webiny/handler-aws": "6.5.0-beta.1",
33
- "@webiny/handler-graphql": "6.5.0-beta.1",
34
- "@webiny/icons": "6.5.0-beta.1",
35
- "@webiny/plugins": "6.5.0-beta.1",
36
- "@webiny/sdk": "6.5.0-beta.1",
37
- "@webiny/utils": "6.5.0-beta.1",
22
+ "@webiny/admin-ui": "6.5.0-beta.11",
23
+ "@webiny/api": "6.5.0-beta.11",
24
+ "@webiny/api-core": "6.5.0-beta.11",
25
+ "@webiny/api-headless-cms": "6.5.0-beta.11",
26
+ "@webiny/app": "6.5.0-beta.11",
27
+ "@webiny/app-admin": "6.5.0-beta.11",
28
+ "@webiny/aws-sdk": "6.5.0-beta.11",
29
+ "@webiny/error": "6.5.0-beta.11",
30
+ "@webiny/feature": "6.5.0-beta.11",
31
+ "@webiny/handler": "6.5.0-beta.11",
32
+ "@webiny/handler-aws": "6.5.0-beta.11",
33
+ "@webiny/handler-graphql": "6.5.0-beta.11",
34
+ "@webiny/icons": "6.5.0-beta.11",
35
+ "@webiny/plugins": "6.5.0-beta.11",
36
+ "@webiny/sdk": "6.5.0-beta.11",
37
+ "@webiny/utils": "6.5.0-beta.11",
38
38
  "deep-equal": "2.2.3",
39
39
  "lodash": "4.18.1",
40
- "mobx": "6.16.1",
41
- "mobx-react-lite": "4.1.1",
42
- "object-merge-advanced": "14.1.3",
40
+ "mobx": "7.0.6",
41
+ "mobx-react-lite": "5.1.0",
42
+ "object-merge-advanced": "14.2.5",
43
43
  "object-sizeof": "2.6.5",
44
44
  "react": "18.3.1",
45
45
  "react-dom": "18.3.1",
46
- "zod": "4.4.3"
46
+ "zod": "4.6.5"
47
47
  },
48
48
  "devDependencies": {
49
- "@webiny/build-tools": "6.5.0-beta.1",
50
- "@webiny/project-utils": "6.5.0-beta.1",
49
+ "@webiny/build-tools": "6.5.0-beta.11",
50
+ "@webiny/project-utils": "6.5.0-beta.11",
51
51
  "rimraf": "6.1.3",
52
- "type-fest": "5.8.0",
52
+ "type-fest": "5.10.0",
53
53
  "typescript": "7.0.2",
54
- "vitest": "4.1.10"
54
+ "vitest": "5.0.3"
55
55
  },
56
56
  "publishConfig": {
57
57
  "access": "public"