From 247954c0fa9ff36d2a14ef1bcc0376bf0bd5b082 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Wed, 6 Nov 2019 19:58:18 -0500 Subject: [PATCH] freshdesk-node-setup --- .../credentials/FreshdeskApi.credentials.ts | 18 ++++++ .../nodes/Freshdesk/Freskdesk.node.ts | 56 ++++++++++++++++++ .../nodes/Freshdesk/GenericFunctions.ts | 52 ++++++++++++++++ .../nodes-base/nodes/Freshdesk/freshdesk.png | Bin 0 -> 4956 bytes packages/nodes-base/package.json | 6 +- 5 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 packages/nodes-base/credentials/FreshdeskApi.credentials.ts create mode 100644 packages/nodes-base/nodes/Freshdesk/Freskdesk.node.ts create mode 100644 packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts create mode 100644 packages/nodes-base/nodes/Freshdesk/freshdesk.png diff --git a/packages/nodes-base/credentials/FreshdeskApi.credentials.ts b/packages/nodes-base/credentials/FreshdeskApi.credentials.ts new file mode 100644 index 000000000..0f06b4e35 --- /dev/null +++ b/packages/nodes-base/credentials/FreshdeskApi.credentials.ts @@ -0,0 +1,18 @@ +import { + ICredentialType, + NodePropertyTypes, +} from 'n8n-workflow'; + + +export class FreshdeskApi implements ICredentialType { + name = 'freshdeskApi'; + displayName = 'Freshdesk API'; + properties = [ + { + displayName: 'API Key', + name: 'apiKey', + type: 'string' as NodePropertyTypes, + default: '', + }, + ]; +} diff --git a/packages/nodes-base/nodes/Freshdesk/Freskdesk.node.ts b/packages/nodes-base/nodes/Freshdesk/Freskdesk.node.ts new file mode 100644 index 000000000..d03991448 --- /dev/null +++ b/packages/nodes-base/nodes/Freshdesk/Freskdesk.node.ts @@ -0,0 +1,56 @@ +import { + IExecuteSingleFunctions, +} from 'n8n-core'; +import { + IDataObject, + INodeTypeDescription, + INodeExecutionData, + INodeType, + ILoadOptionsFunctions, + INodePropertyOptions, +} from 'n8n-workflow'; +import { + freshdeskApiRequest +} from './GenericFunctions'; + +import moment = require('moment'); +import _ = require('lodash') + +export class Freshdesk implements INodeType { + + description: INodeTypeDescription = { + displayName: 'Freshdesk', + name: 'freshdesk', + icon: 'file:freshdesk.png', + group: ['output'], + version: 1, + subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', + description: 'Consume Freshdesk API', + defaults: { + name: 'Freshdesk', + color: '#c02428', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'freshdeskApi', + required: true, + } + ], + properties: [ + ] + }; + + + methods = { + loadOptions: { + } + }; + + // async executeSingle(this: IExecuteSingleFunctions): Promise { + + + + // } +} diff --git a/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts b/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts new file mode 100644 index 000000000..a967f44b9 --- /dev/null +++ b/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts @@ -0,0 +1,52 @@ +import { OptionsWithUri } from 'request'; + +import { + IExecuteFunctions, + IHookFunctions, + ILoadOptionsFunctions, + IExecuteSingleFunctions +} from 'n8n-core'; + +import * as _ from 'lodash'; +import { IDataObject } from 'n8n-workflow'; + +export async function freshdeskApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, resource: string, method: string, action: string, body: any = {}, headers?: object): Promise { // tslint:disable-line:no-any + const credentials = this.getCredentials('mandrillApi'); + + if (credentials === undefined) { + throw new Error('No credentials got returned!'); + } + + const data = Object.assign({}, body, { key: credentials.apiKey }); + + const endpoint = 'mandrillapp.com/api/1.0'; + + const options: OptionsWithUri = { + headers, + method, + uri: `https://${endpoint}${resource}${action}.json`, + body: data, + json: true + }; + + + try { + return await this.helpers.request!(options); + } catch (error) { + console.error(error); + + const errorMessage = error.response.body.message || error.response.body.Message; + if (error.name === 'Invalid_Key') { + throw new Error('The provided API key is not a valid Mandrill API key'); + } else if (error.name === 'ValidationError') { + throw new Error('The parameters passed to the API call are invalid or not provided when required'); + } else if (error.name === 'GeneralError') { + throw new Error('An unexpected error occurred processing the request. Mandrill developers will be notified.'); + } + + if (errorMessage !== undefined) { + throw errorMessage; + } + throw error.response.body; + } +} diff --git a/packages/nodes-base/nodes/Freshdesk/freshdesk.png b/packages/nodes-base/nodes/Freshdesk/freshdesk.png new file mode 100644 index 0000000000000000000000000000000000000000..36692057e456cb3763124a1d9ac216fd6c4b01a8 GIT binary patch literal 4956 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