mirror of
https://github.com/n8n-io/n8n.git
synced 2025-01-13 22:07:35 -08:00
done
This commit is contained in:
parent
f92a42dfe1
commit
0d4a7f5408
|
@ -18,7 +18,7 @@ export async function zendeskApiRequest(this: IHookFunctions | IExecuteFunctions
|
||||||
method,
|
method,
|
||||||
qs,
|
qs,
|
||||||
body,
|
body,
|
||||||
uri: uri ||`${credentials.domain}/api/v2${resource}.json`,
|
uri: uri ||`${credentials.url}/api/v2${resource}.json`,
|
||||||
json: true
|
json: true
|
||||||
};
|
};
|
||||||
options = Object.assign({}, options, option);
|
options = Object.assign({}, options, option);
|
||||||
|
@ -29,9 +29,33 @@ export async function zendeskApiRequest(this: IHookFunctions | IExecuteFunctions
|
||||||
return await this.helpers.request!(options);
|
return await this.helpers.request!(options);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
let errorMessage = '';
|
let errorMessage = '';
|
||||||
if (err.error && err.description) {
|
if (err.message && err.error) {
|
||||||
errorMessage = err.description;
|
errorMessage = err.message;
|
||||||
}
|
}
|
||||||
throw new Error(errorMessage);
|
throw new Error(errorMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make an API request to paginated flow endpoint
|
||||||
|
* and return all results
|
||||||
|
*/
|
||||||
|
export async function zendeskApiRequestAllItems(this: IHookFunctions | IExecuteFunctions| ILoadOptionsFunctions, propertyName: string, method: string, resource: string, body: any = {}, query: IDataObject = {}): Promise<any> { // tslint:disable-line:no-any
|
||||||
|
|
||||||
|
const returnData: IDataObject[] = [];
|
||||||
|
|
||||||
|
let responseData;
|
||||||
|
|
||||||
|
let uri: string | undefined;
|
||||||
|
|
||||||
|
do {
|
||||||
|
responseData = await zendeskApiRequest.call(this, method, resource, body, query, uri);
|
||||||
|
uri = responseData.next_page
|
||||||
|
returnData.push.apply(returnData, responseData[propertyName]);
|
||||||
|
} while (
|
||||||
|
responseData.next_page !== undefined &&
|
||||||
|
responseData.next_page !== null
|
||||||
|
);
|
||||||
|
|
||||||
|
return returnData;
|
||||||
|
}
|
||||||
|
|
|
@ -8,10 +8,13 @@ import {
|
||||||
INodeType,
|
INodeType,
|
||||||
IWebhookResponseData,
|
IWebhookResponseData,
|
||||||
IDataObject,
|
IDataObject,
|
||||||
|
INodePropertyOptions,
|
||||||
|
ILoadOptionsFunctions,
|
||||||
} from 'n8n-workflow';
|
} from 'n8n-workflow';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
zendeskApiRequest,
|
zendeskApiRequest,
|
||||||
|
zendeskApiRequestAllItems,
|
||||||
} from './GenericFunctions';
|
} from './GenericFunctions';
|
||||||
|
|
||||||
export class ZendeskTrigger implements INodeType {
|
export class ZendeskTrigger implements INodeType {
|
||||||
|
@ -24,7 +27,7 @@ export class ZendeskTrigger implements INodeType {
|
||||||
description: 'Handle Zendesk events via webhooks',
|
description: 'Handle Zendesk events via webhooks',
|
||||||
defaults: {
|
defaults: {
|
||||||
name: 'Zendesk Trigger',
|
name: 'Zendesk Trigger',
|
||||||
color: '#559922',
|
color: '#13353c',
|
||||||
},
|
},
|
||||||
inputs: [],
|
inputs: [],
|
||||||
outputs: ['main'],
|
outputs: ['main'],
|
||||||
|
@ -58,9 +61,9 @@ export class ZendeskTrigger implements INodeType {
|
||||||
description: '',
|
description: '',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
displayName: 'Events',
|
displayName: 'Title',
|
||||||
name: 'events',
|
name: 'title',
|
||||||
type: 'options',
|
type: 'string',
|
||||||
displayOptions: {
|
displayOptions: {
|
||||||
show: {
|
show: {
|
||||||
service: [
|
service: [
|
||||||
|
@ -68,19 +71,669 @@ export class ZendeskTrigger implements INodeType {
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
options: [
|
|
||||||
{
|
|
||||||
name: 'ticket.created',
|
|
||||||
value: 'ticket.created',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
required: true,
|
required: true,
|
||||||
default: '',
|
default: '',
|
||||||
description: '',
|
description: '',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Options',
|
||||||
|
name: 'options',
|
||||||
|
type: 'collection',
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
service: [
|
||||||
|
'support'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
default: {},
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
displayName: 'Fields',
|
||||||
|
name: 'fields',
|
||||||
|
type: 'multiOptions',
|
||||||
|
default: [],
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'Title',
|
||||||
|
value: 'ticket.title',
|
||||||
|
description: `Ticket's subject`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Description',
|
||||||
|
value: 'ticket.description',
|
||||||
|
description: `Ticket's description`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'URL',
|
||||||
|
value: 'ticket.url',
|
||||||
|
description: `Ticket's URL`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'ID',
|
||||||
|
value: 'ticket.id',
|
||||||
|
description: `Ticket's ID`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'External ID',
|
||||||
|
value: 'ticket.external_id',
|
||||||
|
description: `Ticket's external ID`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Via',
|
||||||
|
value: 'ticket.via',
|
||||||
|
description: `Ticket's source`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Status',
|
||||||
|
value: 'ticket.status',
|
||||||
|
description: `Ticket's status`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Priority',
|
||||||
|
value: 'ticket.priority',
|
||||||
|
description: `Ticket's priority`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Type',
|
||||||
|
value: 'ticket.ticket_type',
|
||||||
|
description: `Ticket's type`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Group Name',
|
||||||
|
value: 'ticket.group.name',
|
||||||
|
description: `Ticket's assigned group`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Brand Name',
|
||||||
|
value: 'ticket.brand.name',
|
||||||
|
description: `Ticket's brand`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Due Date',
|
||||||
|
value: 'ticket.due_date',
|
||||||
|
description: `Ticket's due date (relevant for tickets of type Task)`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Account',
|
||||||
|
value: 'ticket.account',
|
||||||
|
description: `This Zendesk Support's account name`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Assignee Email',
|
||||||
|
value: 'ticket.assignee.email',
|
||||||
|
description: `Ticket assignee email (if any)`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Assignee Name',
|
||||||
|
value: 'ticket.assignee.name',
|
||||||
|
description: `Assignee's full name`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Assignee First Name',
|
||||||
|
value: 'ticket.assignee.first_name',
|
||||||
|
description: `Assignee's first name`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Assignee Last Name',
|
||||||
|
value: 'ticket.assignee.last_name',
|
||||||
|
description: `Assignee's last name`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Requester Full Name',
|
||||||
|
value: 'ticket.requester.name',
|
||||||
|
description: `Requester's full name`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Requester First Name',
|
||||||
|
value: 'ticket.requester.first_name',
|
||||||
|
description: `Requester's first name`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Requester Last Name',
|
||||||
|
value: 'ticket.requester.last_name',
|
||||||
|
description: `Requester's last name`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Requester Email',
|
||||||
|
value: 'ticket.requester.email',
|
||||||
|
description: `Requester's email`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Requester Language',
|
||||||
|
value: 'ticket.requester.language',
|
||||||
|
description: `Requester's language`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Requester Phone',
|
||||||
|
value: 'ticket.requester.phone',
|
||||||
|
description: `Requester's phone number`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Requester External ID',
|
||||||
|
value: 'ticket.requester.external_id',
|
||||||
|
description: `Requester's external ID`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Requester Field',
|
||||||
|
value: 'ticket.requester.requester_field',
|
||||||
|
description: `Name or email`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Requester Details',
|
||||||
|
value: 'ticket.requester.details',
|
||||||
|
description: `Detailed information about the ticket's requester`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Requester Organization',
|
||||||
|
value: 'ticket.organization.name',
|
||||||
|
description: `Requester's organization`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Ticket's Organization External ID`,
|
||||||
|
value: 'ticket.organization.external_id',
|
||||||
|
description: `Ticket's organization external ID`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Organization details`,
|
||||||
|
value: 'ticket.organization.details',
|
||||||
|
description: `The details about the organization of the ticket's requester`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Organization Note`,
|
||||||
|
value: 'ticket.organization.notes',
|
||||||
|
description: `The notes about the organization of the ticket's requester`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Ticket's CCs`,
|
||||||
|
value: 'ticket.ccs',
|
||||||
|
description: `Ticket's CCs`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Ticket's CCs names`,
|
||||||
|
value: 'ticket.cc_names',
|
||||||
|
description: `Ticket's CCs names`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Ticket's tags`,
|
||||||
|
value: 'ticket.tags',
|
||||||
|
description: `Ticket's tags`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Current Holiday Name`,
|
||||||
|
value: 'ticket.current_holiday_name',
|
||||||
|
description: `Displays the name of the current holiday on the ticket's schedule`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Current User Name `,
|
||||||
|
value: 'current_user.name',
|
||||||
|
description: `Your full name`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Current User First Name `,
|
||||||
|
value: 'current_user.first_name',
|
||||||
|
description: 'Your first name',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Current User Email `,
|
||||||
|
value: 'current_user.email',
|
||||||
|
description: 'Your primary email',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Current User Organization Name `,
|
||||||
|
value: 'current_user.organization.name',
|
||||||
|
description: 'Your default organization',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Current User Organization Details `,
|
||||||
|
value: 'current_user.organization.details',
|
||||||
|
description: `Your default organization's details`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Current User Organization Notes `,
|
||||||
|
value: 'current_user.organization.notes',
|
||||||
|
description: `Your default organization's note`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Current User Language `,
|
||||||
|
value: 'current_user.language',
|
||||||
|
description: `Your chosen language`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Current User External ID `,
|
||||||
|
value: 'current_user.external_id',
|
||||||
|
description: 'Your external ID',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Current User Notes `,
|
||||||
|
value: 'current_user.notes',
|
||||||
|
description: 'Your notes, stored in your profile',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Satisfation Current Rating `,
|
||||||
|
value: 'satisfaction.current_rating',
|
||||||
|
description: 'The text of the current satisfaction rating',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Satisfation Current Comment `,
|
||||||
|
value: 'satisfaction.current_comment',
|
||||||
|
description: 'The text of the current satisfaction rating comment``',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
placeholder: 'Add Option',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Conditions',
|
||||||
|
name: 'conditions',
|
||||||
|
placeholder: 'Add Condition',
|
||||||
|
type: 'fixedCollection',
|
||||||
|
typeOptions: {
|
||||||
|
multipleValues: true,
|
||||||
|
},
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
service: [
|
||||||
|
'support'
|
||||||
|
],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
description: 'The condition to set.',
|
||||||
|
default: {},
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'all',
|
||||||
|
displayName: 'All',
|
||||||
|
values: [
|
||||||
|
{
|
||||||
|
displayName: 'Resource',
|
||||||
|
name: 'resource',
|
||||||
|
type: 'options',
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'Ticket',
|
||||||
|
value: 'ticket',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
default: 'ticket',
|
||||||
|
description: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Field',
|
||||||
|
name: 'field',
|
||||||
|
type: 'options',
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
'resource': [
|
||||||
|
'ticket'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'Status',
|
||||||
|
value: 'status',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Type',
|
||||||
|
value: 'type',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Priority',
|
||||||
|
value: 'priority',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Group',
|
||||||
|
value: 'group',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Assignee',
|
||||||
|
value: 'assignee',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
default: 'status',
|
||||||
|
description: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Operation',
|
||||||
|
name: 'operation',
|
||||||
|
type: 'options',
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'Is',
|
||||||
|
value: 'is',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Is Not',
|
||||||
|
value: 'is_not',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Less Than',
|
||||||
|
value: 'less_than',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Greater Than',
|
||||||
|
value: 'greater_than',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Changed',
|
||||||
|
value: 'changed',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Changed To',
|
||||||
|
value: 'value',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Changed From',
|
||||||
|
value: 'value_previous',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Not Changed',
|
||||||
|
value: 'not_changed',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Not Changed To',
|
||||||
|
value: 'not_value',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Not Changed From',
|
||||||
|
value: 'not_value_previous',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
displayOptions: {
|
||||||
|
hide: {
|
||||||
|
field: [
|
||||||
|
'assignee',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
default: 'is',
|
||||||
|
description: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Operation',
|
||||||
|
name: 'operation',
|
||||||
|
type: 'options',
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'Is',
|
||||||
|
value: 'is',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Is Not',
|
||||||
|
value: 'is_not',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Changed',
|
||||||
|
value: 'changed',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Changed To',
|
||||||
|
value: 'value',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Changed From',
|
||||||
|
value: 'value_previous',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Not Changed',
|
||||||
|
value: 'not_changed',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Not Changed To',
|
||||||
|
value: 'not_value',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Not Changed From',
|
||||||
|
value: 'not_value_previous',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
field: [
|
||||||
|
'assignee',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
default: 'is',
|
||||||
|
description: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Value',
|
||||||
|
name: 'value',
|
||||||
|
type: 'options',
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
field: [
|
||||||
|
'status'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
hide: {
|
||||||
|
operation:[
|
||||||
|
'changed',
|
||||||
|
'not_changed',
|
||||||
|
],
|
||||||
|
field: [
|
||||||
|
'assignee',
|
||||||
|
'group',
|
||||||
|
'priority',
|
||||||
|
'type',
|
||||||
|
],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'Open',
|
||||||
|
value: 'open',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'New',
|
||||||
|
value: 'new',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Pending',
|
||||||
|
value: 'pending',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Solved',
|
||||||
|
value: 'solved',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Closed',
|
||||||
|
value: 'closed',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
default: 'open',
|
||||||
|
description: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Value',
|
||||||
|
name: 'value',
|
||||||
|
type: 'options',
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
field: [
|
||||||
|
'type'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
hide: {
|
||||||
|
operation:[
|
||||||
|
'changed',
|
||||||
|
'not_changed',
|
||||||
|
],
|
||||||
|
field: [
|
||||||
|
'assignee',
|
||||||
|
'group',
|
||||||
|
'priority',
|
||||||
|
'status',
|
||||||
|
],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'Question',
|
||||||
|
value: 'question',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Incident',
|
||||||
|
value: 'incident',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Problem',
|
||||||
|
value: 'problem',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Task',
|
||||||
|
value: 'task',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
default: 'question',
|
||||||
|
description: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Value',
|
||||||
|
name: 'value',
|
||||||
|
type: 'options',
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
field: [
|
||||||
|
'priority'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
hide: {
|
||||||
|
operation:[
|
||||||
|
'changed',
|
||||||
|
'not_changed',
|
||||||
|
],
|
||||||
|
field: [
|
||||||
|
'assignee',
|
||||||
|
'group',
|
||||||
|
'type',
|
||||||
|
'status',
|
||||||
|
],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'Low',
|
||||||
|
value: 'low',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Normal',
|
||||||
|
value: 'normal',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'High',
|
||||||
|
value: 'high',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Urgent',
|
||||||
|
value: 'urgent',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
default: 'low',
|
||||||
|
description: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Value',
|
||||||
|
name: 'value',
|
||||||
|
type: 'options',
|
||||||
|
typeOptions: {
|
||||||
|
loadOptionsMethod: 'getGroups',
|
||||||
|
},
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
field: [
|
||||||
|
'group'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
hide: {
|
||||||
|
field: [
|
||||||
|
'assignee',
|
||||||
|
'priority',
|
||||||
|
'type',
|
||||||
|
'status',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
default: '',
|
||||||
|
description: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Value',
|
||||||
|
name: 'value',
|
||||||
|
type: 'options',
|
||||||
|
typeOptions: {
|
||||||
|
loadOptionsMethod: 'getUsers',
|
||||||
|
},
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
field: [
|
||||||
|
'assignee'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
hide: {
|
||||||
|
field: [
|
||||||
|
'group',
|
||||||
|
'priority',
|
||||||
|
'type',
|
||||||
|
'status',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
default: '',
|
||||||
|
description: '',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
},
|
||||||
],
|
],
|
||||||
|
|
||||||
};
|
};
|
||||||
|
methods = {
|
||||||
|
loadOptions: {
|
||||||
|
// Get all the groups to display them to user so that he can
|
||||||
|
// select them easily
|
||||||
|
async getGroups(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
|
||||||
|
const returnData: INodePropertyOptions[] = [];
|
||||||
|
const groups = await zendeskApiRequestAllItems.call(this, 'groups', 'GET', '/groups');
|
||||||
|
for (const group of groups) {
|
||||||
|
const groupName = group.name;
|
||||||
|
const groupId = group.id;
|
||||||
|
returnData.push({
|
||||||
|
name: groupName,
|
||||||
|
value: groupId,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return returnData;
|
||||||
|
},
|
||||||
|
// Get all the users to display them to user so that he can
|
||||||
|
// select them easily
|
||||||
|
async getUsers(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
|
||||||
|
const returnData: INodePropertyOptions[] = [];
|
||||||
|
const users = await zendeskApiRequestAllItems.call(this, 'users', 'GET', '/users');
|
||||||
|
for (const user of users) {
|
||||||
|
const userName = user.name;
|
||||||
|
const userId = user.id;
|
||||||
|
returnData.push({
|
||||||
|
name: userName,
|
||||||
|
value: userId,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
returnData.push({
|
||||||
|
name: 'Current User',
|
||||||
|
value: 'current_user',
|
||||||
|
})
|
||||||
|
returnData.push({
|
||||||
|
name: 'Requester',
|
||||||
|
value: 'requester_id',
|
||||||
|
})
|
||||||
|
return returnData;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
webhookMethods = {
|
webhookMethods = {
|
||||||
default: {
|
default: {
|
||||||
|
@ -98,23 +751,48 @@ export class ZendeskTrigger implements INodeType {
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
async create(this: IHookFunctions): Promise<boolean> {
|
async create(this: IHookFunctions): Promise<boolean> {
|
||||||
let condition: IDataObject = {};
|
|
||||||
const webhookUrl = this.getNodeWebhookUrl('default');
|
const webhookUrl = this.getNodeWebhookUrl('default');
|
||||||
const webhookData = this.getWorkflowStaticData('node');
|
const webhookData = this.getWorkflowStaticData('node');
|
||||||
const event = this.getNodeParameter('event') as string;
|
const service = this.getNodeParameter('service') as string;
|
||||||
if (event === 'ticket.created') {
|
if (service === 'support') {
|
||||||
condition = {
|
const aux: IDataObject = {};
|
||||||
all: [
|
const message: IDataObject = {};
|
||||||
{
|
const resultAll = [];
|
||||||
field: 'status',
|
const title = this.getNodeParameter('title') as string;
|
||||||
value: 'open',
|
const conditions = this.getNodeParameter('conditions') as IDataObject;
|
||||||
},
|
const options = this.getNodeParameter('options') as IDataObject;
|
||||||
],
|
if (Object.keys(conditions).length === 0) {
|
||||||
|
throw new Error('You must have at least one condition');
|
||||||
}
|
}
|
||||||
|
console.log(options)
|
||||||
|
if (options.fields) {
|
||||||
|
// @ts-ignore
|
||||||
|
for (let field of options.fields) {
|
||||||
|
// @ts-ignore
|
||||||
|
message[field] = `{{${field}}}`;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
message['ticket.id'] = '{{ticket.id}}'
|
||||||
|
}
|
||||||
|
const conditionsAll = conditions.all as [IDataObject];
|
||||||
|
for (let 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 bodyTrigger: IDataObject = {
|
const bodyTrigger: IDataObject = {
|
||||||
trigger: {
|
trigger: {
|
||||||
conditions: { ...condition },
|
title,
|
||||||
|
conditions: {
|
||||||
|
all: resultAll,
|
||||||
|
any: [],
|
||||||
|
},
|
||||||
actions: [
|
actions: [
|
||||||
{
|
{
|
||||||
field: 'notification_target',
|
field: 'notification_target',
|
||||||
|
@ -132,13 +810,14 @@ export class ZendeskTrigger implements INodeType {
|
||||||
active: true,
|
active: true,
|
||||||
content_type: 'application/json',
|
content_type: 'application/json',
|
||||||
},
|
},
|
||||||
}
|
};
|
||||||
const { target } = await zendeskApiRequest.call(this, 'POST', '/targets', bodyTarget);
|
const { target } = await zendeskApiRequest.call(this, 'POST', '/targets', bodyTarget);
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
bodyTrigger.trigger.actions[0].value = [target.id, ''];
|
bodyTrigger.trigger.actions[0].value = [target.id, JSON.stringify(message)];
|
||||||
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;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
async delete(this: IHookFunctions): Promise<boolean> {
|
async delete(this: IHookFunctions): Promise<boolean> {
|
||||||
|
|
Loading…
Reference in a new issue