Fix issue with thrown errors for nodes with multiple webhooks

This commit is contained in:
Jan Oberhauser 2020-10-21 17:50:23 +02:00
parent 717708d3cc
commit b171cfbb10
4 changed files with 25 additions and 28 deletions

View file

@ -258,17 +258,20 @@ export class ActiveWorkflowRunner {
await Db.collections.Webhook?.insert(webhook); await Db.collections.Webhook?.insert(webhook);
const webhookExists = await workflow.runWebhookMethod('checkExists', webhookData, NodeExecuteFunctions, mode, false); const webhookExists = await workflow.runWebhookMethod('checkExists', webhookData, NodeExecuteFunctions, mode, false);
if (webhookExists === false) { if (webhookExists !== true) {
// If webhook does not exist yet create it // If webhook does not exist yet create it
await workflow.runWebhookMethod('create', webhookData, NodeExecuteFunctions, mode, false); await workflow.runWebhookMethod('create', webhookData, NodeExecuteFunctions, mode, false);
} }
} catch (error) { } catch (error) {
try {
await this.removeWorkflowWebhooks(workflow.id as string);
} catch (error) {
console.error(`Could not remove webhooks of workflow "${workflow.id}" because of error: "${error.message}"`);
}
let errorMessage = ''; let errorMessage = '';
await Db.collections.Webhook?.delete({ workflowId: workflow.id });
// if it's a workflow from the the insert // if it's a workflow from the the insert
// TODO check if there is standard error code for deplicate key violation that works // TODO check if there is standard error code for deplicate key violation that works
// with all databases // with all databases

View file

@ -156,9 +156,12 @@ export class TestWebhooks {
}, 120000); }, 120000);
let key: string; let key: string;
const activatedKey: string[] = [];
for (const webhookData of webhooks) { for (const webhookData of webhooks) {
key = this.activeWebhooks!.getWebhookKey(webhookData.httpMethod, webhookData.path); key = this.activeWebhooks!.getWebhookKey(webhookData.httpMethod, webhookData.path);
activatedKey.push(key);
this.testWebhookData[key] = { this.testWebhookData[key] = {
sessionId, sessionId,
timeout, timeout,
@ -166,7 +169,13 @@ export class TestWebhooks {
workflowData, workflowData,
}; };
try {
await this.activeWebhooks!.add(workflow, webhookData, mode); await this.activeWebhooks!.add(workflow, webhookData, mode);
} catch (error) {
activatedKey.forEach(deleteKey => delete this.testWebhookData[deleteKey] );
await this.activeWebhooks!.removeWorkflow(workflow);
throw error;
}
} }
return true; return true;
@ -189,8 +198,6 @@ export class TestWebhooks {
continue; continue;
} }
foundWebhook = true;
clearTimeout(this.testWebhookData[webhookKey].timeout); clearTimeout(this.testWebhookData[webhookKey].timeout);
// Inform editor-ui that webhook got received // Inform editor-ui that webhook got received
@ -207,9 +214,15 @@ export class TestWebhooks {
// Remove the webhook // Remove the webhook
delete this.testWebhookData[webhookKey]; delete this.testWebhookData[webhookKey];
if (foundWebhook === false) {
// As it removes all webhooks of the workflow execute only once
this.activeWebhooks!.removeWorkflow(workflow); this.activeWebhooks!.removeWorkflow(workflow);
} }
foundWebhook = true;
}
return foundWebhook; return foundWebhook;
} }

View file

@ -52,7 +52,7 @@ export class ActiveWebhooks {
try { try {
const webhookExists = await workflow.runWebhookMethod('checkExists', webhookData, NodeExecuteFunctions, mode, this.testWebhooks); const webhookExists = await workflow.runWebhookMethod('checkExists', webhookData, NodeExecuteFunctions, mode, this.testWebhooks);
if (webhookExists === false) { if (webhookExists !== true) {
// If webhook does not exist yet create it // If webhook does not exist yet create it
await workflow.runWebhookMethod('create', webhookData, NodeExecuteFunctions, mode, this.testWebhooks); await workflow.runWebhookMethod('create', webhookData, NodeExecuteFunctions, mode, this.testWebhooks);
@ -60,7 +60,6 @@ export class ActiveWebhooks {
} catch (error) { } catch (error) {
// If there was a problem unregister the webhook again // If there was a problem unregister the webhook again
delete this.webhookUrls[webhookKey]; delete this.webhookUrls[webhookKey];
delete this.workflowWebhooks[webhookData.workflowId];
throw error; throw error;
} }
@ -159,7 +158,7 @@ export class ActiveWebhooks {
/** /**
* Removes all the webhooks of the given workflow * Removes all the webhooks of the given workflows
*/ */
async removeAll(workflows: Workflow[]): Promise<void> { async removeAll(workflows: Workflow[]): Promise<void> {
const removePromises = []; const removePromises = [];

View file

@ -68,12 +68,6 @@ export class TrelloTrigger implements INodeType {
webhookMethods = { webhookMethods = {
default: { default: {
async checkExists(this: IHookFunctions): Promise<boolean> { async checkExists(this: IHookFunctions): Promise<boolean> {
if (this.getWebhookName() === 'setup') {
// Is setup-webhook which only gets used once when
// the webhook gets created so nothing to do.
return true;
}
const credentials = this.getCredentials('trelloApi'); const credentials = this.getCredentials('trelloApi');
if (credentials === undefined) { if (credentials === undefined) {
@ -101,12 +95,6 @@ export class TrelloTrigger implements INodeType {
return false; return false;
}, },
async create(this: IHookFunctions): Promise<boolean> { async create(this: IHookFunctions): Promise<boolean> {
if (this.getWebhookName() === 'setup') {
// Is setup-webhook which only gets used once when
// the webhook gets created so nothing to do.
return true;
}
const webhookUrl = this.getNodeWebhookUrl('default'); const webhookUrl = this.getNodeWebhookUrl('default');
const credentials = this.getCredentials('trelloApi'); const credentials = this.getCredentials('trelloApi');
@ -137,12 +125,6 @@ export class TrelloTrigger implements INodeType {
return true; return true;
}, },
async delete(this: IHookFunctions): Promise<boolean> { async delete(this: IHookFunctions): Promise<boolean> {
if (this.getWebhookName() === 'setup') {
// Is setup-webhook which only gets used once when
// the webhook gets created so nothing to do.
return true;
}
const webhookData = this.getWorkflowStaticData('node'); const webhookData = this.getWorkflowStaticData('node');
if (webhookData.webhookId !== undefined) { if (webhookData.webhookId !== undefined) {