@xtr-dev/payload-automation 0.0.36 → 0.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/dist/collections/Workflow.js +30 -305
- package/dist/collections/Workflow.js.map +1 -1
- package/dist/components/ErrorDisplay.js +3 -3
- package/dist/components/ErrorDisplay.js.map +1 -1
- package/dist/core/workflow-executor.d.ts +33 -85
- package/dist/core/workflow-executor.js +136 -229
- package/dist/core/workflow-executor.js.map +1 -1
- package/dist/exports/client.d.ts +0 -2
- package/dist/exports/client.js +1 -3
- package/dist/exports/client.js.map +1 -1
- package/dist/fields/parameter.d.ts +4 -0
- package/dist/fields/parameter.js +32 -0
- package/dist/fields/parameter.js.map +1 -0
- package/dist/plugin/collection-hook.d.ts +1 -0
- package/dist/plugin/collection-hook.js +58 -0
- package/dist/plugin/collection-hook.js.map +1 -0
- package/dist/plugin/config-types.d.ts +14 -17
- package/dist/plugin/config-types.js.map +1 -1
- package/dist/plugin/global-hook.d.ts +1 -0
- package/dist/plugin/global-hook.js +83 -0
- package/dist/plugin/global-hook.js.map +1 -0
- package/dist/plugin/index.js +83 -197
- package/dist/plugin/index.js.map +1 -1
- package/dist/test/workflow-executor.test.js +2 -2
- package/dist/test/workflow-executor.test.js.map +1 -1
- package/dist/triggers/collection-trigger.d.ts +2 -0
- package/dist/triggers/collection-trigger.js +36 -0
- package/dist/triggers/collection-trigger.js.map +1 -0
- package/dist/triggers/global-trigger.d.ts +2 -0
- package/dist/triggers/global-trigger.js +29 -0
- package/dist/triggers/global-trigger.js.map +1 -0
- package/dist/triggers/index.d.ts +2 -0
- package/dist/triggers/index.js +4 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/triggers/types.d.ts +5 -0
- package/dist/triggers/types.js +3 -0
- package/dist/triggers/types.js.map +1 -0
- package/package.json +1 -1
- package/dist/components/TriggerWorkflowButton.d.ts +0 -7
- package/dist/components/TriggerWorkflowButton.js +0 -46
- package/dist/components/TriggerWorkflowButton.js.map +0 -1
- package/dist/components/WorkflowExecutionStatus.d.ts +0 -6
- package/dist/components/WorkflowExecutionStatus.js +0 -287
- package/dist/components/WorkflowExecutionStatus.js.map +0 -1
- package/dist/exports/helpers.d.ts +0 -25
- package/dist/exports/helpers.js +0 -28
- package/dist/exports/helpers.js.map +0 -1
- package/dist/plugin/cron-scheduler.d.ts +0 -32
- package/dist/plugin/cron-scheduler.js +0 -537
- package/dist/plugin/cron-scheduler.js.map +0 -1
- package/dist/plugin/init-collection-hooks.d.ts +0 -4
- package/dist/plugin/init-collection-hooks.js +0 -100
- package/dist/plugin/init-collection-hooks.js.map +0 -1
- package/dist/plugin/init-global-hooks.d.ts +0 -3
- package/dist/plugin/init-global-hooks.js +0 -83
- package/dist/plugin/init-global-hooks.js.map +0 -1
- package/dist/plugin/init-step-tasks.d.ts +0 -3
- package/dist/plugin/init-step-tasks.js +0 -22
- package/dist/plugin/init-step-tasks.js.map +0 -1
- package/dist/plugin/init-webhook.d.ts +0 -2
- package/dist/plugin/init-webhook.js +0 -158
- package/dist/plugin/init-webhook.js.map +0 -1
- package/dist/plugin/init-workflow-hooks.d.ts +0 -6
- package/dist/plugin/init-workflow-hooks.js +0 -46
- package/dist/plugin/init-workflow-hooks.js.map +0 -1
- package/dist/utils/trigger-helpers.d.ts +0 -60
- package/dist/utils/trigger-helpers.js +0 -130
- package/dist/utils/trigger-helpers.js.map +0 -1
- package/dist/utils/trigger-presets.d.ts +0 -24
- package/dist/utils/trigger-presets.js +0 -177
- package/dist/utils/trigger-presets.js.map +0 -1
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
export function initCollectionHooks(pluginOptions, payload, logger, executor) {
|
|
2
|
-
if (!pluginOptions.collectionTriggers || Object.keys(pluginOptions.collectionTriggers).length === 0) {
|
|
3
|
-
logger.warn('No collection triggers configured in plugin options');
|
|
4
|
-
return;
|
|
5
|
-
}
|
|
6
|
-
logger.info({
|
|
7
|
-
configuredCollections: Object.keys(pluginOptions.collectionTriggers),
|
|
8
|
-
availableCollections: Object.keys(payload.collections)
|
|
9
|
-
}, 'Starting collection hook registration');
|
|
10
|
-
// Add hooks to configured collections
|
|
11
|
-
for (const [collectionSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)){
|
|
12
|
-
if (!triggerConfig) {
|
|
13
|
-
logger.debug({
|
|
14
|
-
collectionSlug
|
|
15
|
-
}, 'Skipping collection with falsy trigger config');
|
|
16
|
-
continue;
|
|
17
|
-
}
|
|
18
|
-
const collection = payload.collections[collectionSlug];
|
|
19
|
-
const crud = triggerConfig === true ? {
|
|
20
|
-
create: true,
|
|
21
|
-
delete: true,
|
|
22
|
-
read: true,
|
|
23
|
-
update: true
|
|
24
|
-
} : triggerConfig;
|
|
25
|
-
if (!collection.config.hooks) {
|
|
26
|
-
collection.config.hooks = {};
|
|
27
|
-
}
|
|
28
|
-
if (crud.update || crud.create) {
|
|
29
|
-
collection.config.hooks.afterChange = collection.config.hooks.afterChange || [];
|
|
30
|
-
collection.config.hooks.afterChange.push(async (change)=>{
|
|
31
|
-
const operation = change.operation;
|
|
32
|
-
logger.info({
|
|
33
|
-
slug: change.collection.slug,
|
|
34
|
-
operation,
|
|
35
|
-
docId: change.doc?.id,
|
|
36
|
-
previousDocId: change.previousDoc?.id,
|
|
37
|
-
hasExecutor: !!executor,
|
|
38
|
-
executorType: typeof executor
|
|
39
|
-
}, 'Collection automation hook triggered');
|
|
40
|
-
try {
|
|
41
|
-
// Execute workflows for this trigger
|
|
42
|
-
await executor.executeTriggeredWorkflows(change.collection.slug, operation, change.doc, change.previousDoc, change.req);
|
|
43
|
-
logger.info({
|
|
44
|
-
slug: change.collection.slug,
|
|
45
|
-
operation,
|
|
46
|
-
docId: change.doc?.id
|
|
47
|
-
}, 'Workflow execution completed successfully');
|
|
48
|
-
} catch (error) {
|
|
49
|
-
logger.error({
|
|
50
|
-
slug: change.collection.slug,
|
|
51
|
-
operation,
|
|
52
|
-
docId: change.doc?.id,
|
|
53
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
54
|
-
stack: error instanceof Error ? error.stack : undefined
|
|
55
|
-
}, 'AUTOMATION PLUGIN: executeTriggeredWorkflows failed');
|
|
56
|
-
// Don't re-throw to avoid breaking other hooks
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
if (crud.read) {
|
|
61
|
-
collection.config.hooks.afterRead = collection.config.hooks.afterRead || [];
|
|
62
|
-
collection.config.hooks.afterRead.push(async (change)=>{
|
|
63
|
-
logger.debug({
|
|
64
|
-
slug: change.collection.slug,
|
|
65
|
-
operation: 'read'
|
|
66
|
-
}, 'Collection hook triggered');
|
|
67
|
-
// Execute workflows for this trigger
|
|
68
|
-
await executor.executeTriggeredWorkflows(change.collection.slug, 'read', change.doc, undefined, change.req);
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
if (crud.delete) {
|
|
72
|
-
collection.config.hooks.afterDelete = collection.config.hooks.afterDelete || [];
|
|
73
|
-
collection.config.hooks.afterDelete.push(async (change)=>{
|
|
74
|
-
logger.debug({
|
|
75
|
-
slug: change.collection.slug,
|
|
76
|
-
operation: 'delete'
|
|
77
|
-
}, 'Collection hook triggered');
|
|
78
|
-
// Execute workflows for this trigger
|
|
79
|
-
await executor.executeTriggeredWorkflows(change.collection.slug, 'delete', change.doc, undefined, change.req);
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
if (collection) {
|
|
83
|
-
logger.info({
|
|
84
|
-
collectionSlug,
|
|
85
|
-
hooksRegistered: {
|
|
86
|
-
afterChange: crud.update || crud.create,
|
|
87
|
-
afterRead: crud.read,
|
|
88
|
-
afterDelete: crud.delete
|
|
89
|
-
}
|
|
90
|
-
}, 'Collection hooks registered successfully');
|
|
91
|
-
} else {
|
|
92
|
-
logger.error({
|
|
93
|
-
collectionSlug,
|
|
94
|
-
availableCollections: Object.keys(payload.collections)
|
|
95
|
-
}, 'Collection not found for trigger configuration - check collection slug spelling');
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
//# sourceMappingURL=init-collection-hooks.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugin/init-collection-hooks.ts"],"sourcesContent":["import type {Payload} from \"payload\"\nimport type {Logger} from \"pino\"\n\nimport type { WorkflowExecutor } from \"../core/workflow-executor.js\"\nimport type {CollectionTriggerConfigCrud, WorkflowsPluginConfig} from \"./config-types.js\"\n\nexport function initCollectionHooks<T extends string>(pluginOptions: WorkflowsPluginConfig<T>, payload: Payload, logger: Payload['logger'], executor: WorkflowExecutor) {\n \n if (!pluginOptions.collectionTriggers || Object.keys(pluginOptions.collectionTriggers).length === 0) {\n logger.warn('No collection triggers configured in plugin options')\n return\n }\n\n logger.info({\n configuredCollections: Object.keys(pluginOptions.collectionTriggers),\n availableCollections: Object.keys(payload.collections)\n }, 'Starting collection hook registration')\n\n // Add hooks to configured collections\n for (const [collectionSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)) {\n if (!triggerConfig) {\n logger.debug({collectionSlug}, 'Skipping collection with falsy trigger config')\n continue\n }\n\n const collection = payload.collections[collectionSlug as T]\n const crud: CollectionTriggerConfigCrud = triggerConfig === true ? {\n create: true,\n delete: true,\n read: true,\n update: true,\n } : triggerConfig\n\n if (!collection.config.hooks) {\n collection.config.hooks = {} as typeof collection.config.hooks\n }\n\n if (crud.update || crud.create) {\n collection.config.hooks.afterChange = collection.config.hooks.afterChange || []\n collection.config.hooks.afterChange.push(async (change) => {\n const operation = change.operation as 'create' | 'update'\n \n \n logger.info({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id,\n previousDocId: change.previousDoc?.id,\n hasExecutor: !!executor,\n executorType: typeof executor\n }, 'Collection automation hook triggered')\n\n try {\n \n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n operation,\n change.doc,\n change.previousDoc,\n change.req\n )\n \n \n logger.info({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id\n }, 'Workflow execution completed successfully')\n } catch (error) {\n \n logger.error({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id,\n error: error instanceof Error ? error.message : 'Unknown error',\n stack: error instanceof Error ? error.stack : undefined\n }, 'AUTOMATION PLUGIN: executeTriggeredWorkflows failed')\n // Don't re-throw to avoid breaking other hooks\n }\n })\n }\n\n if (crud.read) {\n collection.config.hooks.afterRead = collection.config.hooks.afterRead || []\n collection.config.hooks.afterRead.push(async (change) => {\n logger.debug({\n slug: change.collection.slug,\n operation: 'read',\n }, 'Collection hook triggered')\n\n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n 'read',\n change.doc,\n undefined,\n change.req\n )\n })\n }\n\n if (crud.delete) {\n collection.config.hooks.afterDelete = collection.config.hooks.afterDelete || []\n collection.config.hooks.afterDelete.push(async (change) => {\n logger.debug({\n slug: change.collection.slug,\n operation: 'delete',\n }, 'Collection hook triggered')\n\n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n 'delete',\n change.doc,\n undefined,\n change.req\n )\n })\n }\n\n if (collection) {\n logger.info({\n collectionSlug,\n hooksRegistered: {\n afterChange: crud.update || crud.create,\n afterRead: crud.read,\n afterDelete: crud.delete\n }\n }, 'Collection hooks registered successfully')\n } else {\n logger.error({\n collectionSlug,\n availableCollections: Object.keys(payload.collections)\n }, 'Collection not found for trigger configuration - check collection slug spelling')\n }\n }\n}\n"],"names":["initCollectionHooks","pluginOptions","payload","logger","executor","collectionTriggers","Object","keys","length","warn","info","configuredCollections","availableCollections","collections","collectionSlug","triggerConfig","entries","debug","collection","crud","create","delete","read","update","config","hooks","afterChange","push","change","operation","slug","docId","doc","id","previousDocId","previousDoc","hasExecutor","executorType","executeTriggeredWorkflows","req","error","Error","message","stack","undefined","afterRead","afterDelete","hooksRegistered"],"mappings":"AAMA,OAAO,SAASA,oBAAsCC,aAAuC,EAAEC,OAAgB,EAAEC,MAAyB,EAAEC,QAA0B;IAEpK,IAAI,CAACH,cAAcI,kBAAkB,IAAIC,OAAOC,IAAI,CAACN,cAAcI,kBAAkB,EAAEG,MAAM,KAAK,GAAG;QACnGL,OAAOM,IAAI,CAAC;QACZ;IACF;IAEAN,OAAOO,IAAI,CAAC;QACVC,uBAAuBL,OAAOC,IAAI,CAACN,cAAcI,kBAAkB;QACnEO,sBAAsBN,OAAOC,IAAI,CAACL,QAAQW,WAAW;IACvD,GAAG;IAEH,sCAAsC;IACtC,KAAK,MAAM,CAACC,gBAAgBC,cAAc,IAAIT,OAAOU,OAAO,CAACf,cAAcI,kBAAkB,EAAG;QAC9F,IAAI,CAACU,eAAe;YAClBZ,OAAOc,KAAK,CAAC;gBAACH;YAAc,GAAG;YAC/B;QACF;QAEA,MAAMI,aAAahB,QAAQW,WAAW,CAACC,eAAoB;QAC3D,MAAMK,OAAoCJ,kBAAkB,OAAO;YACjEK,QAAQ;YACRC,QAAQ;YACRC,MAAM;YACNC,QAAQ;QACV,IAAIR;QAEJ,IAAI,CAACG,WAAWM,MAAM,CAACC,KAAK,EAAE;YAC5BP,WAAWM,MAAM,CAACC,KAAK,GAAG,CAAC;QAC7B;QAEA,IAAIN,KAAKI,MAAM,IAAIJ,KAAKC,MAAM,EAAE;YAC9BF,WAAWM,MAAM,CAACC,KAAK,CAACC,WAAW,GAAGR,WAAWM,MAAM,CAACC,KAAK,CAACC,WAAW,IAAI,EAAE;YAC/ER,WAAWM,MAAM,CAACC,KAAK,CAACC,WAAW,CAACC,IAAI,CAAC,OAAOC;gBAC9C,MAAMC,YAAYD,OAAOC,SAAS;gBAGlC1B,OAAOO,IAAI,CAAC;oBACVoB,MAAMF,OAAOV,UAAU,CAACY,IAAI;oBAC5BD;oBACAE,OAAOH,OAAOI,GAAG,EAAEC;oBACnBC,eAAeN,OAAOO,WAAW,EAAEF;oBACnCG,aAAa,CAAC,CAAChC;oBACfiC,cAAc,OAAOjC;gBACvB,GAAG;gBAEH,IAAI;oBAEF,qCAAqC;oBACrC,MAAMA,SAASkC,yBAAyB,CACtCV,OAAOV,UAAU,CAACY,IAAI,EACtBD,WACAD,OAAOI,GAAG,EACVJ,OAAOO,WAAW,EAClBP,OAAOW,GAAG;oBAIZpC,OAAOO,IAAI,CAAC;wBACVoB,MAAMF,OAAOV,UAAU,CAACY,IAAI;wBAC5BD;wBACAE,OAAOH,OAAOI,GAAG,EAAEC;oBACrB,GAAG;gBACL,EAAE,OAAOO,OAAO;oBAEdrC,OAAOqC,KAAK,CAAC;wBACXV,MAAMF,OAAOV,UAAU,CAACY,IAAI;wBAC5BD;wBACAE,OAAOH,OAAOI,GAAG,EAAEC;wBACnBO,OAAOA,iBAAiBC,QAAQD,MAAME,OAAO,GAAG;wBAChDC,OAAOH,iBAAiBC,QAAQD,MAAMG,KAAK,GAAGC;oBAChD,GAAG;gBACH,+CAA+C;gBACjD;YACF;QACF;QAEA,IAAIzB,KAAKG,IAAI,EAAE;YACbJ,WAAWM,MAAM,CAACC,KAAK,CAACoB,SAAS,GAAG3B,WAAWM,MAAM,CAACC,KAAK,CAACoB,SAAS,IAAI,EAAE;YAC3E3B,WAAWM,MAAM,CAACC,KAAK,CAACoB,SAAS,CAAClB,IAAI,CAAC,OAAOC;gBAC5CzB,OAAOc,KAAK,CAAC;oBACXa,MAAMF,OAAOV,UAAU,CAACY,IAAI;oBAC5BD,WAAW;gBACb,GAAG;gBAEH,qCAAqC;gBACrC,MAAMzB,SAASkC,yBAAyB,CACtCV,OAAOV,UAAU,CAACY,IAAI,EACtB,QACAF,OAAOI,GAAG,EACVY,WACAhB,OAAOW,GAAG;YAEd;QACF;QAEA,IAAIpB,KAAKE,MAAM,EAAE;YACfH,WAAWM,MAAM,CAACC,KAAK,CAACqB,WAAW,GAAG5B,WAAWM,MAAM,CAACC,KAAK,CAACqB,WAAW,IAAI,EAAE;YAC/E5B,WAAWM,MAAM,CAACC,KAAK,CAACqB,WAAW,CAACnB,IAAI,CAAC,OAAOC;gBAC9CzB,OAAOc,KAAK,CAAC;oBACXa,MAAMF,OAAOV,UAAU,CAACY,IAAI;oBAC5BD,WAAW;gBACb,GAAG;gBAEH,qCAAqC;gBACrC,MAAMzB,SAASkC,yBAAyB,CACtCV,OAAOV,UAAU,CAACY,IAAI,EACtB,UACAF,OAAOI,GAAG,EACVY,WACAhB,OAAOW,GAAG;YAEd;QACF;QAEA,IAAIrB,YAAY;YACdf,OAAOO,IAAI,CAAC;gBACVI;gBACAiC,iBAAiB;oBACfrB,aAAaP,KAAKI,MAAM,IAAIJ,KAAKC,MAAM;oBACvCyB,WAAW1B,KAAKG,IAAI;oBACpBwB,aAAa3B,KAAKE,MAAM;gBAC1B;YACF,GAAG;QACL,OAAO;YACLlB,OAAOqC,KAAK,CAAC;gBACX1B;gBACAF,sBAAsBN,OAAOC,IAAI,CAACL,QAAQW,WAAW;YACvD,GAAG;QACL;IACF;AACF"}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
export function initGlobalHooks(payload, logger, executor) {
|
|
2
|
-
// Get all globals from the config
|
|
3
|
-
const globals = payload.config.globals || [];
|
|
4
|
-
for (const globalConfig of globals){
|
|
5
|
-
const globalSlug = globalConfig.slug;
|
|
6
|
-
// Add afterChange hook to global
|
|
7
|
-
if (!globalConfig.hooks) {
|
|
8
|
-
globalConfig.hooks = {
|
|
9
|
-
afterChange: [],
|
|
10
|
-
afterRead: [],
|
|
11
|
-
beforeChange: [],
|
|
12
|
-
beforeRead: [],
|
|
13
|
-
beforeValidate: []
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
if (!globalConfig.hooks.afterChange) {
|
|
17
|
-
globalConfig.hooks.afterChange = [];
|
|
18
|
-
}
|
|
19
|
-
globalConfig.hooks.afterChange.push(async (change)=>{
|
|
20
|
-
logger.debug({
|
|
21
|
-
global: globalSlug,
|
|
22
|
-
operation: 'update'
|
|
23
|
-
}, 'Global hook triggered');
|
|
24
|
-
// Execute workflows for this global trigger
|
|
25
|
-
await executeTriggeredGlobalWorkflows(globalSlug, 'update', change.doc, change.previousDoc, change.req, payload, logger, executor);
|
|
26
|
-
});
|
|
27
|
-
logger.info({
|
|
28
|
-
globalSlug
|
|
29
|
-
}, 'Global hooks registered');
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
async function executeTriggeredGlobalWorkflows(globalSlug, operation, doc, previousDoc, req, payload, logger, executor) {
|
|
33
|
-
try {
|
|
34
|
-
// Find workflows with matching global triggers
|
|
35
|
-
const workflows = await payload.find({
|
|
36
|
-
collection: 'workflows',
|
|
37
|
-
depth: 2,
|
|
38
|
-
limit: 100,
|
|
39
|
-
req,
|
|
40
|
-
where: {
|
|
41
|
-
'triggers.global': {
|
|
42
|
-
equals: globalSlug
|
|
43
|
-
},
|
|
44
|
-
'triggers.globalOperation': {
|
|
45
|
-
equals: operation
|
|
46
|
-
},
|
|
47
|
-
'triggers.type': {
|
|
48
|
-
equals: 'global-trigger'
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
for (const workflow of workflows.docs){
|
|
53
|
-
logger.info({
|
|
54
|
-
globalSlug,
|
|
55
|
-
operation,
|
|
56
|
-
workflowId: workflow.id,
|
|
57
|
-
workflowName: workflow.name
|
|
58
|
-
}, 'Triggering global workflow');
|
|
59
|
-
// Create execution context
|
|
60
|
-
const context = {
|
|
61
|
-
steps: {},
|
|
62
|
-
trigger: {
|
|
63
|
-
type: 'global',
|
|
64
|
-
doc,
|
|
65
|
-
global: globalSlug,
|
|
66
|
-
operation,
|
|
67
|
-
previousDoc,
|
|
68
|
-
req
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
// Execute the workflow
|
|
72
|
-
await executor.execute(workflow, context, req);
|
|
73
|
-
}
|
|
74
|
-
} catch (error) {
|
|
75
|
-
logger.error({
|
|
76
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
77
|
-
globalSlug,
|
|
78
|
-
operation
|
|
79
|
-
}, 'Failed to execute triggered global workflows');
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
//# sourceMappingURL=init-global-hooks.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugin/init-global-hooks.ts"],"sourcesContent":["import type { Payload, PayloadRequest } from \"payload\"\nimport type { Logger } from \"pino\"\n\nimport type { WorkflowExecutor, PayloadWorkflow } from \"../core/workflow-executor.js\"\n\nexport function initGlobalHooks(payload: Payload, logger: Payload['logger'], executor: WorkflowExecutor) {\n // Get all globals from the config\n const globals = payload.config.globals || []\n\n for (const globalConfig of globals) {\n const globalSlug = globalConfig.slug\n\n // Add afterChange hook to global\n if (!globalConfig.hooks) {\n globalConfig.hooks = {\n afterChange: [],\n afterRead: [],\n beforeChange: [],\n beforeRead: [],\n beforeValidate: []\n }\n }\n\n if (!globalConfig.hooks.afterChange) {\n globalConfig.hooks.afterChange = []\n }\n\n globalConfig.hooks.afterChange.push(async (change) => {\n logger.debug({\n global: globalSlug,\n operation: 'update'\n }, 'Global hook triggered')\n\n // Execute workflows for this global trigger\n await executeTriggeredGlobalWorkflows(\n globalSlug,\n 'update',\n change.doc,\n change.previousDoc,\n change.req,\n payload,\n logger,\n executor\n )\n })\n\n logger.info({ globalSlug }, 'Global hooks registered')\n }\n}\n\nasync function executeTriggeredGlobalWorkflows(\n globalSlug: string,\n operation: 'update',\n doc: Record<string, any>,\n previousDoc: Record<string, any>,\n req: PayloadRequest,\n payload: Payload,\n logger: Payload['logger'],\n executor: WorkflowExecutor\n): Promise<void> {\n try {\n // Find workflows with matching global triggers\n const workflows = await payload.find({\n collection: 'workflows',\n depth: 2,\n limit: 100,\n req,\n where: {\n 'triggers.global': {\n equals: globalSlug\n },\n 'triggers.globalOperation': {\n equals: operation\n },\n 'triggers.type': {\n equals: 'global-trigger'\n }\n }\n })\n\n for (const workflow of workflows.docs) {\n logger.info({\n globalSlug,\n operation,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Triggering global workflow')\n\n // Create execution context\n const context = {\n steps: {},\n trigger: {\n type: 'global',\n doc,\n global: globalSlug,\n operation,\n previousDoc,\n req\n }\n }\n\n // Execute the workflow\n await executor.execute(workflow as PayloadWorkflow, context, req)\n }\n } catch (error) {\n logger.error({\n error: error instanceof Error ? error.message : 'Unknown error',\n globalSlug,\n operation\n }, 'Failed to execute triggered global workflows')\n }\n}\n"],"names":["initGlobalHooks","payload","logger","executor","globals","config","globalConfig","globalSlug","slug","hooks","afterChange","afterRead","beforeChange","beforeRead","beforeValidate","push","change","debug","global","operation","executeTriggeredGlobalWorkflows","doc","previousDoc","req","info","workflows","find","collection","depth","limit","where","equals","workflow","docs","workflowId","id","workflowName","name","context","steps","trigger","type","execute","error","Error","message"],"mappings":"AAKA,OAAO,SAASA,gBAAgBC,OAAgB,EAAEC,MAAyB,EAAEC,QAA0B;IACrG,kCAAkC;IAClC,MAAMC,UAAUH,QAAQI,MAAM,CAACD,OAAO,IAAI,EAAE;IAE5C,KAAK,MAAME,gBAAgBF,QAAS;QAClC,MAAMG,aAAaD,aAAaE,IAAI;QAEpC,iCAAiC;QACjC,IAAI,CAACF,aAAaG,KAAK,EAAE;YACvBH,aAAaG,KAAK,GAAG;gBACnBC,aAAa,EAAE;gBACfC,WAAW,EAAE;gBACbC,cAAc,EAAE;gBAChBC,YAAY,EAAE;gBACdC,gBAAgB,EAAE;YACpB;QACF;QAEA,IAAI,CAACR,aAAaG,KAAK,CAACC,WAAW,EAAE;YACnCJ,aAAaG,KAAK,CAACC,WAAW,GAAG,EAAE;QACrC;QAEAJ,aAAaG,KAAK,CAACC,WAAW,CAACK,IAAI,CAAC,OAAOC;YACzCd,OAAOe,KAAK,CAAC;gBACXC,QAAQX;gBACRY,WAAW;YACb,GAAG;YAEH,4CAA4C;YAC5C,MAAMC,gCACJb,YACA,UACAS,OAAOK,GAAG,EACVL,OAAOM,WAAW,EAClBN,OAAOO,GAAG,EACVtB,SACAC,QACAC;QAEJ;QAEAD,OAAOsB,IAAI,CAAC;YAAEjB;QAAW,GAAG;IAC9B;AACF;AAEA,eAAea,gCACbb,UAAkB,EAClBY,SAAmB,EACnBE,GAAwB,EACxBC,WAAgC,EAChCC,GAAmB,EACnBtB,OAAgB,EAChBC,MAAyB,EACzBC,QAA0B;IAE1B,IAAI;QACF,+CAA+C;QAC/C,MAAMsB,YAAY,MAAMxB,QAAQyB,IAAI,CAAC;YACnCC,YAAY;YACZC,OAAO;YACPC,OAAO;YACPN;YACAO,OAAO;gBACL,mBAAmB;oBACjBC,QAAQxB;gBACV;gBACA,4BAA4B;oBAC1BwB,QAAQZ;gBACV;gBACA,iBAAiB;oBACfY,QAAQ;gBACV;YACF;QACF;QAEA,KAAK,MAAMC,YAAYP,UAAUQ,IAAI,CAAE;YACrC/B,OAAOsB,IAAI,CAAC;gBACVjB;gBACAY;gBACAe,YAAYF,SAASG,EAAE;gBACvBC,cAAcJ,SAASK,IAAI;YAC7B,GAAG;YAEH,2BAA2B;YAC3B,MAAMC,UAAU;gBACdC,OAAO,CAAC;gBACRC,SAAS;oBACPC,MAAM;oBACNpB;oBACAH,QAAQX;oBACRY;oBACAG;oBACAC;gBACF;YACF;YAEA,uBAAuB;YACvB,MAAMpB,SAASuC,OAAO,CAACV,UAA6BM,SAASf;QAC/D;IACF,EAAE,OAAOoB,OAAO;QACdzC,OAAOyC,KAAK,CAAC;YACXA,OAAOA,iBAAiBC,QAAQD,MAAME,OAAO,GAAG;YAChDtC;YACAY;QACF,GAAG;IACL;AACF"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export function initStepTasks(pluginOptions, payload, logger) {
|
|
2
|
-
logger.info({
|
|
3
|
-
stepCount: pluginOptions.steps.length,
|
|
4
|
-
steps: pluginOptions.steps.map((s)=>s.slug)
|
|
5
|
-
}, 'Step tasks were registered during config phase');
|
|
6
|
-
// Verify that the tasks are available in the job system
|
|
7
|
-
const availableTasks = payload.config.jobs?.tasks?.map((t)=>t.slug) || [];
|
|
8
|
-
const pluginTasks = pluginOptions.steps.map((s)=>s.slug);
|
|
9
|
-
pluginTasks.forEach((taskSlug)=>{
|
|
10
|
-
if (availableTasks.includes(taskSlug)) {
|
|
11
|
-
logger.info({
|
|
12
|
-
taskSlug
|
|
13
|
-
}, 'Step task confirmed available in job system');
|
|
14
|
-
} else {
|
|
15
|
-
logger.error({
|
|
16
|
-
taskSlug
|
|
17
|
-
}, 'Step task not found in job system - this will cause execution failures');
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
//# sourceMappingURL=init-step-tasks.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugin/init-step-tasks.ts"],"sourcesContent":["import type {Payload} from \"payload\"\nimport type {Logger} from \"pino\"\n\nimport type {WorkflowsPluginConfig} from \"./config-types.js\"\n\nexport function initStepTasks<T extends string>(pluginOptions: WorkflowsPluginConfig<T>, payload: Payload, logger: Payload['logger']) {\n logger.info({ stepCount: pluginOptions.steps.length, steps: pluginOptions.steps.map(s => s.slug) }, 'Step tasks were registered during config phase')\n\n // Verify that the tasks are available in the job system\n const availableTasks = payload.config.jobs?.tasks?.map(t => t.slug) || []\n const pluginTasks = pluginOptions.steps.map(s => s.slug)\n \n pluginTasks.forEach(taskSlug => {\n if (availableTasks.includes(taskSlug)) {\n logger.info({ taskSlug }, 'Step task confirmed available in job system')\n } else {\n logger.error({ taskSlug }, 'Step task not found in job system - this will cause execution failures')\n }\n })\n}\n"],"names":["initStepTasks","pluginOptions","payload","logger","info","stepCount","steps","length","map","s","slug","availableTasks","config","jobs","tasks","t","pluginTasks","forEach","taskSlug","includes","error"],"mappings":"AAKA,OAAO,SAASA,cAAgCC,aAAuC,EAAEC,OAAgB,EAAEC,MAAyB;IAClIA,OAAOC,IAAI,CAAC;QAAEC,WAAWJ,cAAcK,KAAK,CAACC,MAAM;QAAED,OAAOL,cAAcK,KAAK,CAACE,GAAG,CAACC,CAAAA,IAAKA,EAAEC,IAAI;IAAE,GAAG;IAEpG,wDAAwD;IACxD,MAAMC,iBAAiBT,QAAQU,MAAM,CAACC,IAAI,EAAEC,OAAON,IAAIO,CAAAA,IAAKA,EAAEL,IAAI,KAAK,EAAE;IACzE,MAAMM,cAAcf,cAAcK,KAAK,CAACE,GAAG,CAACC,CAAAA,IAAKA,EAAEC,IAAI;IAEvDM,YAAYC,OAAO,CAACC,CAAAA;QAClB,IAAIP,eAAeQ,QAAQ,CAACD,WAAW;YACrCf,OAAOC,IAAI,CAAC;gBAAEc;YAAS,GAAG;QAC5B,OAAO;YACLf,OAAOiB,KAAK,CAAC;gBAAEF;YAAS,GAAG;QAC7B;IACF;AACF"}
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import { WorkflowExecutor } from '../core/workflow-executor.js';
|
|
2
|
-
import { getConfigLogger, initializeLogger } from './logger.js';
|
|
3
|
-
export function initWebhookEndpoint(config, webhookPrefix = 'webhook') {
|
|
4
|
-
const logger = getConfigLogger();
|
|
5
|
-
// Ensure the prefix starts with a slash
|
|
6
|
-
const normalizedPrefix = webhookPrefix.startsWith('/') ? webhookPrefix : `/${webhookPrefix}`;
|
|
7
|
-
// Define webhook endpoint
|
|
8
|
-
const webhookEndpoint = {
|
|
9
|
-
handler: async (req)=>{
|
|
10
|
-
const { path } = req.routeParams;
|
|
11
|
-
const webhookData = req.body || {};
|
|
12
|
-
logger.debug('Webhook endpoint handler called, path: ' + path);
|
|
13
|
-
try {
|
|
14
|
-
// Find workflows with matching webhook triggers
|
|
15
|
-
const workflows = await req.payload.find({
|
|
16
|
-
collection: 'workflows',
|
|
17
|
-
depth: 2,
|
|
18
|
-
limit: 100,
|
|
19
|
-
req,
|
|
20
|
-
where: {
|
|
21
|
-
'triggers.type': {
|
|
22
|
-
equals: 'webhook-trigger'
|
|
23
|
-
},
|
|
24
|
-
'triggers.webhookPath': {
|
|
25
|
-
equals: path
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
if (workflows.docs.length === 0) {
|
|
30
|
-
return new Response(JSON.stringify({
|
|
31
|
-
error: 'No workflows found for this webhook path'
|
|
32
|
-
}), {
|
|
33
|
-
headers: {
|
|
34
|
-
'Content-Type': 'application/json'
|
|
35
|
-
},
|
|
36
|
-
status: 404
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
// Create a workflow executor for this request
|
|
40
|
-
const logger = initializeLogger(req.payload);
|
|
41
|
-
const executor = new WorkflowExecutor(req.payload, logger);
|
|
42
|
-
const executionPromises = workflows.docs.map(async (workflow)=>{
|
|
43
|
-
try {
|
|
44
|
-
// Create execution context for the webhook trigger
|
|
45
|
-
const context = {
|
|
46
|
-
steps: {},
|
|
47
|
-
trigger: {
|
|
48
|
-
type: 'webhook',
|
|
49
|
-
data: webhookData,
|
|
50
|
-
headers: Object.fromEntries(req.headers?.entries() || []),
|
|
51
|
-
path,
|
|
52
|
-
req
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
// Find the matching trigger and check its condition if present
|
|
56
|
-
const triggers = workflow.triggers;
|
|
57
|
-
const matchingTrigger = triggers?.find((trigger)=>trigger.type === 'webhook-trigger' && trigger.parameters?.webhookPath === path);
|
|
58
|
-
// Check trigger condition if present
|
|
59
|
-
if (matchingTrigger?.condition) {
|
|
60
|
-
logger.debug({
|
|
61
|
-
condition: matchingTrigger.condition,
|
|
62
|
-
path,
|
|
63
|
-
webhookData: JSON.stringify(webhookData).substring(0, 200),
|
|
64
|
-
headers: Object.keys(context.trigger.headers || {}),
|
|
65
|
-
workflowId: workflow.id,
|
|
66
|
-
workflowName: workflow.name
|
|
67
|
-
}, 'Evaluating webhook trigger condition');
|
|
68
|
-
const conditionMet = executor.evaluateCondition(matchingTrigger.condition, context);
|
|
69
|
-
if (!conditionMet) {
|
|
70
|
-
logger.info({
|
|
71
|
-
condition: matchingTrigger.condition,
|
|
72
|
-
path,
|
|
73
|
-
webhookDataSnapshot: JSON.stringify(webhookData).substring(0, 200),
|
|
74
|
-
workflowId: workflow.id,
|
|
75
|
-
workflowName: workflow.name
|
|
76
|
-
}, 'Webhook trigger condition not met, skipping workflow');
|
|
77
|
-
return {
|
|
78
|
-
reason: 'Condition not met',
|
|
79
|
-
status: 'skipped',
|
|
80
|
-
workflowId: workflow.id
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
logger.info({
|
|
84
|
-
condition: matchingTrigger.condition,
|
|
85
|
-
path,
|
|
86
|
-
webhookDataSnapshot: JSON.stringify(webhookData).substring(0, 200),
|
|
87
|
-
workflowId: workflow.id,
|
|
88
|
-
workflowName: workflow.name
|
|
89
|
-
}, 'Webhook trigger condition met');
|
|
90
|
-
}
|
|
91
|
-
// Execute the workflow
|
|
92
|
-
await executor.execute(workflow, context, req);
|
|
93
|
-
return {
|
|
94
|
-
status: 'triggered',
|
|
95
|
-
workflowId: workflow.id
|
|
96
|
-
};
|
|
97
|
-
} catch (error) {
|
|
98
|
-
return {
|
|
99
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
100
|
-
status: 'failed',
|
|
101
|
-
workflowId: workflow.id
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
const results = await Promise.allSettled(executionPromises);
|
|
106
|
-
const resultsData = results.map((result, index)=>{
|
|
107
|
-
const baseResult = {
|
|
108
|
-
workflowId: workflows.docs[index].id
|
|
109
|
-
};
|
|
110
|
-
if (result.status === 'fulfilled') {
|
|
111
|
-
return {
|
|
112
|
-
...baseResult,
|
|
113
|
-
...result.value
|
|
114
|
-
};
|
|
115
|
-
} else {
|
|
116
|
-
return {
|
|
117
|
-
...baseResult,
|
|
118
|
-
error: result.reason,
|
|
119
|
-
status: 'failed'
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
return new Response(JSON.stringify({
|
|
124
|
-
message: `Triggered ${workflows.docs.length} workflow(s)`,
|
|
125
|
-
results: resultsData
|
|
126
|
-
}), {
|
|
127
|
-
headers: {
|
|
128
|
-
'Content-Type': 'application/json'
|
|
129
|
-
},
|
|
130
|
-
status: 200
|
|
131
|
-
});
|
|
132
|
-
} catch (error) {
|
|
133
|
-
return new Response(JSON.stringify({
|
|
134
|
-
details: error instanceof Error ? error.message : 'Unknown error',
|
|
135
|
-
error: 'Failed to process webhook'
|
|
136
|
-
}), {
|
|
137
|
-
headers: {
|
|
138
|
-
'Content-Type': 'application/json'
|
|
139
|
-
},
|
|
140
|
-
status: 500
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
},
|
|
144
|
-
method: 'post',
|
|
145
|
-
path: `${normalizedPrefix}/:path`
|
|
146
|
-
};
|
|
147
|
-
// Check if the webhook endpoint already exists to avoid duplicates
|
|
148
|
-
const existingEndpoint = config.endpoints?.find((endpoint)=>endpoint.path === webhookEndpoint.path && endpoint.method === webhookEndpoint.method);
|
|
149
|
-
if (!existingEndpoint) {
|
|
150
|
-
// Combine existing endpoints with the webhook endpoint
|
|
151
|
-
config.endpoints = [
|
|
152
|
-
...config.endpoints || [],
|
|
153
|
-
webhookEndpoint
|
|
154
|
-
];
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
//# sourceMappingURL=init-webhook.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugin/init-webhook.ts"],"sourcesContent":["import type {Config, PayloadRequest} from 'payload'\n\nimport {type PayloadWorkflow, WorkflowExecutor} from '../core/workflow-executor.js'\nimport {getConfigLogger, initializeLogger} from './logger.js'\n\nexport function initWebhookEndpoint(config: Config, webhookPrefix = 'webhook'): void {\n const logger = getConfigLogger()\n // Ensure the prefix starts with a slash\n const normalizedPrefix = webhookPrefix.startsWith('/') ? webhookPrefix : `/${webhookPrefix}`\n\n // Define webhook endpoint\n const webhookEndpoint = {\n handler: async (req: PayloadRequest) => {\n const {path} = req.routeParams as { path: string }\n const webhookData = req.body || {}\n\n logger.debug('Webhook endpoint handler called, path: ' + path)\n\n try {\n // Find workflows with matching webhook triggers\n const workflows = await req.payload.find({\n collection: 'workflows',\n depth: 2,\n limit: 100,\n req,\n where: {\n 'triggers.type': {\n equals: 'webhook-trigger'\n },\n 'triggers.webhookPath': {\n equals: path\n }\n }\n })\n\n if (workflows.docs.length === 0) {\n return new Response(\n JSON.stringify({error: 'No workflows found for this webhook path'}),\n {\n headers: {'Content-Type': 'application/json'},\n status: 404\n }\n )\n }\n\n // Create a workflow executor for this request\n const logger = initializeLogger(req.payload)\n const executor = new WorkflowExecutor(req.payload, logger)\n\n const executionPromises = workflows.docs.map(async (workflow) => {\n try {\n // Create execution context for the webhook trigger\n const context = {\n steps: {},\n trigger: {\n type: 'webhook',\n data: webhookData,\n headers: Object.fromEntries(req.headers?.entries() || []),\n path,\n req\n }\n }\n\n // Find the matching trigger and check its condition if present\n const triggers = workflow.triggers as Array<{\n condition?: string\n type: string\n parameters?: {\n webhookPath?: string\n [key: string]: any\n }\n }>\n\n const matchingTrigger = triggers?.find(trigger =>\n trigger.type === 'webhook-trigger' &&\n trigger.parameters?.webhookPath === path\n )\n\n // Check trigger condition if present\n if (matchingTrigger?.condition) {\n logger.debug({\n condition: matchingTrigger.condition,\n path,\n webhookData: JSON.stringify(webhookData).substring(0, 200),\n headers: Object.keys(context.trigger.headers || {}),\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Evaluating webhook trigger condition')\n\n const conditionMet = executor.evaluateCondition(matchingTrigger.condition, context)\n\n if (!conditionMet) {\n logger.info({\n condition: matchingTrigger.condition,\n path,\n webhookDataSnapshot: JSON.stringify(webhookData).substring(0, 200),\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Webhook trigger condition not met, skipping workflow')\n\n return { reason: 'Condition not met', status: 'skipped', workflowId: workflow.id }\n }\n\n logger.info({\n condition: matchingTrigger.condition,\n path,\n webhookDataSnapshot: JSON.stringify(webhookData).substring(0, 200),\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Webhook trigger condition met')\n }\n\n // Execute the workflow\n await executor.execute(workflow as PayloadWorkflow, context, req)\n\n return { status: 'triggered', workflowId: workflow.id }\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : 'Unknown error',\n status: 'failed',\n workflowId: workflow.id\n }\n }\n })\n\n const results = await Promise.allSettled(executionPromises)\n const resultsData = results.map((result, index) => {\n const baseResult = { workflowId: workflows.docs[index].id }\n if (result.status === 'fulfilled') {\n return { ...baseResult, ...result.value }\n } else {\n return { ...baseResult, error: result.reason, status: 'failed' }\n }\n })\n\n return new Response(\n JSON.stringify({\n message: `Triggered ${workflows.docs.length} workflow(s)`,\n results: resultsData\n }),\n {\n headers: { 'Content-Type': 'application/json' },\n status: 200\n }\n )\n\n } catch (error) {\n return new Response(\n JSON.stringify({\n details: error instanceof Error ? error.message : 'Unknown error',\n error: 'Failed to process webhook'\n }),\n {\n headers: { 'Content-Type': 'application/json' },\n status: 500\n }\n )\n }\n },\n method: 'post' as const,\n path: `${normalizedPrefix}/:path`\n }\n\n // Check if the webhook endpoint already exists to avoid duplicates\n const existingEndpoint = config.endpoints?.find(endpoint =>\n endpoint.path === webhookEndpoint.path && endpoint.method === webhookEndpoint.method\n )\n\n if (!existingEndpoint) {\n // Combine existing endpoints with the webhook endpoint\n config.endpoints = [...(config.endpoints || []), webhookEndpoint]\n }\n}\n"],"names":["WorkflowExecutor","getConfigLogger","initializeLogger","initWebhookEndpoint","config","webhookPrefix","logger","normalizedPrefix","startsWith","webhookEndpoint","handler","req","path","routeParams","webhookData","body","debug","workflows","payload","find","collection","depth","limit","where","equals","docs","length","Response","JSON","stringify","error","headers","status","executor","executionPromises","map","workflow","context","steps","trigger","type","data","Object","fromEntries","entries","triggers","matchingTrigger","parameters","webhookPath","condition","substring","keys","workflowId","id","workflowName","name","conditionMet","evaluateCondition","info","webhookDataSnapshot","reason","execute","Error","message","results","Promise","allSettled","resultsData","result","index","baseResult","value","details","method","existingEndpoint","endpoints","endpoint"],"mappings":"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"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { updateWorkflowCronJobs, removeWorkflowCronJobs } from './cron-scheduler.js';
|
|
2
|
-
/**
|
|
3
|
-
* Initialize hooks for the workflows collection itself
|
|
4
|
-
* to manage cron jobs when workflows are created/updated
|
|
5
|
-
*/ export function initWorkflowHooks(payload, logger) {
|
|
6
|
-
// Add afterChange hook to workflows collection to update cron jobs
|
|
7
|
-
const workflowsCollection = payload.collections.workflows;
|
|
8
|
-
if (!workflowsCollection) {
|
|
9
|
-
logger.warn('Workflows collection not found, cannot initialize workflow hooks');
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
// Add afterChange hook to register/update cron jobs
|
|
13
|
-
if (!workflowsCollection.config.hooks?.afterChange) {
|
|
14
|
-
if (!workflowsCollection.config.hooks) {
|
|
15
|
-
// @ts-expect-error - hooks object will be populated by Payload
|
|
16
|
-
workflowsCollection.config.hooks = {};
|
|
17
|
-
}
|
|
18
|
-
workflowsCollection.config.hooks.afterChange = [];
|
|
19
|
-
}
|
|
20
|
-
workflowsCollection.config.hooks.afterChange.push(async ({ doc, operation })=>{
|
|
21
|
-
if (operation === 'create' || operation === 'update') {
|
|
22
|
-
logger.debug({
|
|
23
|
-
operation,
|
|
24
|
-
workflowId: doc.id,
|
|
25
|
-
workflowName: doc.name
|
|
26
|
-
}, 'Workflow changed, updating cron jobs selectively');
|
|
27
|
-
// Update cron jobs for this specific workflow only
|
|
28
|
-
await updateWorkflowCronJobs(doc.id, payload, logger);
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
// Add afterDelete hook to clean up cron jobs
|
|
32
|
-
if (!workflowsCollection.config.hooks?.afterDelete) {
|
|
33
|
-
workflowsCollection.config.hooks.afterDelete = [];
|
|
34
|
-
}
|
|
35
|
-
workflowsCollection.config.hooks.afterDelete.push(async ({ doc })=>{
|
|
36
|
-
logger.debug({
|
|
37
|
-
workflowId: doc.id,
|
|
38
|
-
workflowName: doc.name
|
|
39
|
-
}, 'Workflow deleted, removing cron jobs');
|
|
40
|
-
// Remove cron jobs for the deleted workflow
|
|
41
|
-
removeWorkflowCronJobs(doc.id, payload, logger);
|
|
42
|
-
});
|
|
43
|
-
logger.info('Workflow hooks initialized for cron job management');
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
//# sourceMappingURL=init-workflow-hooks.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugin/init-workflow-hooks.ts"],"sourcesContent":["import type {Payload} from 'payload'\n\nimport {updateWorkflowCronJobs, removeWorkflowCronJobs} from './cron-scheduler.js'\n\n/**\n * Initialize hooks for the workflows collection itself\n * to manage cron jobs when workflows are created/updated\n */\nexport function initWorkflowHooks(payload: Payload, logger: Payload['logger']): void {\n // Add afterChange hook to workflows collection to update cron jobs\n const workflowsCollection = payload.collections.workflows\n \n if (!workflowsCollection) {\n logger.warn('Workflows collection not found, cannot initialize workflow hooks')\n return\n }\n \n // Add afterChange hook to register/update cron jobs\n if (!workflowsCollection.config.hooks?.afterChange) {\n if (!workflowsCollection.config.hooks) {\n // @ts-expect-error - hooks object will be populated by Payload\n workflowsCollection.config.hooks = {}\n }\n workflowsCollection.config.hooks.afterChange = []\n }\n \n workflowsCollection.config.hooks.afterChange.push(async ({ doc, operation }) => {\n if (operation === 'create' || operation === 'update') {\n logger.debug({\n operation,\n workflowId: doc.id,\n workflowName: doc.name\n }, 'Workflow changed, updating cron jobs selectively')\n \n // Update cron jobs for this specific workflow only\n await updateWorkflowCronJobs(doc.id, payload, logger)\n }\n })\n \n // Add afterDelete hook to clean up cron jobs\n if (!workflowsCollection.config.hooks?.afterDelete) {\n workflowsCollection.config.hooks.afterDelete = []\n }\n \n workflowsCollection.config.hooks.afterDelete.push(async ({ doc }) => {\n logger.debug({\n workflowId: doc.id,\n workflowName: doc.name\n }, 'Workflow deleted, removing cron jobs')\n \n // Remove cron jobs for the deleted workflow\n removeWorkflowCronJobs(doc.id, payload, logger)\n })\n \n logger.info('Workflow hooks initialized for cron job management')\n}"],"names":["updateWorkflowCronJobs","removeWorkflowCronJobs","initWorkflowHooks","payload","logger","workflowsCollection","collections","workflows","warn","config","hooks","afterChange","push","doc","operation","debug","workflowId","id","workflowName","name","afterDelete","info"],"mappings":"AAEA,SAAQA,sBAAsB,EAAEC,sBAAsB,QAAO,sBAAqB;AAElF;;;CAGC,GACD,OAAO,SAASC,kBAAkBC,OAAgB,EAAEC,MAAyB;IAC3E,mEAAmE;IACnE,MAAMC,sBAAsBF,QAAQG,WAAW,CAACC,SAAS;IAEzD,IAAI,CAACF,qBAAqB;QACxBD,OAAOI,IAAI,CAAC;QACZ;IACF;IAEA,oDAAoD;IACpD,IAAI,CAACH,oBAAoBI,MAAM,CAACC,KAAK,EAAEC,aAAa;QAClD,IAAI,CAACN,oBAAoBI,MAAM,CAACC,KAAK,EAAE;YACrC,+DAA+D;YAC/DL,oBAAoBI,MAAM,CAACC,KAAK,GAAG,CAAC;QACtC;QACAL,oBAAoBI,MAAM,CAACC,KAAK,CAACC,WAAW,GAAG,EAAE;IACnD;IAEAN,oBAAoBI,MAAM,CAACC,KAAK,CAACC,WAAW,CAACC,IAAI,CAAC,OAAO,EAAEC,GAAG,EAAEC,SAAS,EAAE;QACzE,IAAIA,cAAc,YAAYA,cAAc,UAAU;YACpDV,OAAOW,KAAK,CAAC;gBACXD;gBACAE,YAAYH,IAAII,EAAE;gBAClBC,cAAcL,IAAIM,IAAI;YACxB,GAAG;YAEH,mDAAmD;YACnD,MAAMnB,uBAAuBa,IAAII,EAAE,EAAEd,SAASC;QAChD;IACF;IAEA,6CAA6C;IAC7C,IAAI,CAACC,oBAAoBI,MAAM,CAACC,KAAK,EAAEU,aAAa;QAClDf,oBAAoBI,MAAM,CAACC,KAAK,CAACU,WAAW,GAAG,EAAE;IACnD;IAEAf,oBAAoBI,MAAM,CAACC,KAAK,CAACU,WAAW,CAACR,IAAI,CAAC,OAAO,EAAEC,GAAG,EAAE;QAC9DT,OAAOW,KAAK,CAAC;YACXC,YAAYH,IAAII,EAAE;YAClBC,cAAcL,IAAIM,IAAI;QACxB,GAAG;QAEH,4CAA4C;QAC5ClB,uBAAuBY,IAAII,EAAE,EAAEd,SAASC;IAC1C;IAEAA,OAAOiB,IAAI,CAAC;AACd"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import type { Field } from 'payload';
|
|
2
|
-
import type { CustomTriggerConfig } from '../plugin/config-types.js';
|
|
3
|
-
interface FieldWithName {
|
|
4
|
-
name: string;
|
|
5
|
-
[key: string]: unknown;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Creates a virtual field for a trigger parameter that stores its value in the parameters JSON field
|
|
9
|
-
*
|
|
10
|
-
* @param field - Standard PayloadCMS field configuration (must be a data field with a name)
|
|
11
|
-
* @param triggerSlug - The slug of the trigger this field belongs to
|
|
12
|
-
* @returns Modified field with virtual storage hooks and proper naming
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```typescript
|
|
16
|
-
* const myTrigger: CustomTriggerConfig = {
|
|
17
|
-
* slug: 'my-trigger',
|
|
18
|
-
* inputs: [
|
|
19
|
-
* createTriggerField({
|
|
20
|
-
* name: 'webhookUrl',
|
|
21
|
-
* type: 'text',
|
|
22
|
-
* required: true,
|
|
23
|
-
* admin: {
|
|
24
|
-
* description: 'URL to call when triggered'
|
|
25
|
-
* }
|
|
26
|
-
* }, 'my-trigger')
|
|
27
|
-
* ]
|
|
28
|
-
* }
|
|
29
|
-
* ```
|
|
30
|
-
*/
|
|
31
|
-
export declare function createTriggerField(field: FieldWithName, triggerSlug: string): Field;
|
|
32
|
-
/**
|
|
33
|
-
* Creates a custom trigger configuration with the provided fields
|
|
34
|
-
*
|
|
35
|
-
* @param slug - Unique identifier for the trigger
|
|
36
|
-
* @param fields - Array of PayloadCMS fields that will be shown as trigger parameters
|
|
37
|
-
* @returns Complete trigger configuration
|
|
38
|
-
*
|
|
39
|
-
* @example
|
|
40
|
-
* ```typescript
|
|
41
|
-
* const webhookTrigger = createTrigger('webhook', [
|
|
42
|
-
* {
|
|
43
|
-
* name: 'url',
|
|
44
|
-
* type: 'text',
|
|
45
|
-
* required: true,
|
|
46
|
-
* admin: {
|
|
47
|
-
* description: 'Webhook URL'
|
|
48
|
-
* }
|
|
49
|
-
* },
|
|
50
|
-
* {
|
|
51
|
-
* name: 'method',
|
|
52
|
-
* type: 'select',
|
|
53
|
-
* options: ['GET', 'POST', 'PUT', 'DELETE'],
|
|
54
|
-
* defaultValue: 'POST'
|
|
55
|
-
* }
|
|
56
|
-
* ])
|
|
57
|
-
* ```
|
|
58
|
-
*/
|
|
59
|
-
export declare function createTrigger(slug: string, fields: FieldWithName[]): CustomTriggerConfig;
|
|
60
|
-
export {};
|