Reuse trigger and target on Zendesk-Trigger (#767)

*  Reuse trigger and target on Zendesk-Trigger

* 🐛 Fix bug
This commit is contained in:
Ricardo Espinoza
2020-08-25 15:50:13 -04:00
committed by GitHub
parent b78145f2ec
commit e3e39c4f62
2 changed files with 83 additions and 12 deletions

View File

@@ -43,6 +43,8 @@ export async function zendeskApiRequest(this: IHookFunctions | IExecuteFunctions
options.uri = `https://${credentials.subdomain}.zendesk.com/api/v2${resource}.json`; options.uri = `https://${credentials.subdomain}.zendesk.com/api/v2${resource}.json`;
options.headers!['Authorization'] = `Basic ${base64Key}`; options.headers!['Authorization'] = `Basic ${base64Key}`;
//console.log(options);
return await this.helpers.request!(options); return await this.helpers.request!(options);
} else { } else {
const credentials = this.getCredentials('zendeskOAuth2Api'); const credentials = this.getCredentials('zendeskOAuth2Api');

View File

@@ -375,14 +375,14 @@ export class ZendeskTrigger implements INodeType {
displayName: 'All', displayName: 'All',
values: [ values: [
...conditionFields, ...conditionFields,
] ],
}, },
{ {
name: 'any', name: 'any',
displayName: 'Any', displayName: 'Any',
values: [ values: [
...conditionFields, ...conditionFields,
] ],
}, },
], ],
}, },
@@ -435,17 +435,74 @@ export class ZendeskTrigger implements INodeType {
webhookMethods = { webhookMethods = {
default: { default: {
async checkExists(this: IHookFunctions): Promise<boolean> { async checkExists(this: IHookFunctions): Promise<boolean> {
const webhookUrl = this.getNodeWebhookUrl('default') as string;
const webhookData = this.getWorkflowStaticData('node'); const webhookData = this.getWorkflowStaticData('node');
if (webhookData.webhookId === undefined) { const conditions = this.getNodeParameter('conditions') as IDataObject;
const conditionsAll = conditions.all as [IDataObject];
let endpoint = '';
const aux: IDataObject = {};
const resultAll = [], resultAny = [];
if (conditionsAll) {
for (const conditionAll of conditionsAll) {
aux.field = conditionAll.field;
aux.operator = conditionAll.operation;
if (conditionAll.operation !== 'changed'
&& conditionAll.operation !== 'not_changed') {
aux.value = conditionAll.value;
} else {
aux.value = null;
}
resultAll.push(aux);
}
}
const conditionsAny = conditions.any as [IDataObject];
if (conditionsAny) {
for (const conditionAny of conditionsAny) {
aux.field = conditionAny.field;
aux.operator = conditionAny.operation;
if (conditionAny.operation !== 'changed'
&& conditionAny.operation !== 'not_changed') {
aux.value = conditionAny.value;
} else {
aux.value = null;
}
resultAny.push(aux);
}
}
// check if there is a target already created
endpoint = `/targets`;
const targets = await zendeskApiRequestAllItems.call(this, 'targets', 'GET', endpoint);
for (const target of targets) {
if (target.target_url === webhookUrl) {
webhookData.targetId = target.id.toString();
break;
}
}
// no target was found
if (webhookData.targetId === undefined) {
return false; return false;
} }
const endpoint = `/triggers/${webhookData.webhookId}`;
try { endpoint = `/triggers/active`;
await zendeskApiRequest.call(this, 'GET', endpoint); const triggers = await zendeskApiRequestAllItems.call(this, 'triggers', 'GET', endpoint);
} catch (e) { for (const trigger of triggers) {
return false; const toDeleteTriggers = [];
// this trigger belong to the current target
if (trigger.actions[0].value[0].toString() === webhookData.targetId?.toString()) {
toDeleteTriggers.push(trigger.id);
}
// delete all trigger attach to this target;
if (toDeleteTriggers.length !== 0) {
await zendeskApiRequest.call(this, 'DELETE', '/triggers/destroy_many', {}, { ids: toDeleteTriggers.join(',') } );
}
} }
return true;
return false;
}, },
async create(this: IHookFunctions): Promise<boolean> { async create(this: IHookFunctions): Promise<boolean> {
const webhookUrl = this.getNodeWebhookUrl('default') as string; const webhookUrl = this.getNodeWebhookUrl('default') as string;
@@ -509,8 +566,8 @@ export class ZendeskTrigger implements INodeType {
{ {
field: 'notification_target', field: 'notification_target',
value: [], value: [],
} },
] ],
}, },
}; };
const bodyTarget: IDataObject = { const bodyTarget: IDataObject = {
@@ -523,9 +580,21 @@ export class ZendeskTrigger implements INodeType {
content_type: 'application/json', content_type: 'application/json',
}, },
}; };
const { target } = await zendeskApiRequest.call(this, 'POST', '/targets', bodyTarget); let target: IDataObject = {};
// if target id exists but trigger does not then reuse the target
// and create the trigger else create both
if (webhookData.targetId !== undefined) {
target.id = webhookData.targetId;
} else {
target = await zendeskApiRequest.call(this, 'POST', '/targets', bodyTarget);
target = target.target as IDataObject;
}
// @ts-ignore // @ts-ignore
bodyTrigger.trigger.actions[0].value = [target.id, JSON.stringify(message)]; bodyTrigger.trigger.actions[0].value = [target.id, JSON.stringify(message)];
//@ts-ignore
const { trigger } = await zendeskApiRequest.call(this, 'POST', '/triggers', bodyTrigger); const { trigger } = await zendeskApiRequest.call(this, 'POST', '/triggers', bodyTrigger);
webhookData.webhookId = trigger.id; webhookData.webhookId = trigger.id;
webhookData.targetId = target.id; webhookData.targetId = target.id;