From 06282ff7de82177d7363ce0d50d54e42eedd30ae Mon Sep 17 00:00:00 2001 From: rons4 Date: Tue, 19 Jan 2021 13:25:21 +0100 Subject: [PATCH 1/6] SIGNL4: Attachment Support Attachment support added to SIGNL4. --- .../nodes/Signl4/GenericFunctions.ts | 11 +- .../nodes-base/nodes/Signl4/Signl4.node.json | 4 +- .../nodes-base/nodes/Signl4/Signl4.node.ts | 103 ++++++++++++------ 3 files changed, 81 insertions(+), 37 deletions(-) diff --git a/packages/nodes-base/nodes/Signl4/GenericFunctions.ts b/packages/nodes-base/nodes/Signl4/GenericFunctions.ts index 5281ae8c25ede..d5f3df2513b2b 100644 --- a/packages/nodes-base/nodes/Signl4/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Signl4/GenericFunctions.ts @@ -9,6 +9,10 @@ import { import { OptionsWithUri, } from 'request'; + +const https = require('https') + +//import * as https from 'https'; /** * Make an API request to SIGNL4 @@ -18,17 +22,18 @@ import { * @returns {Promise} */ -export async function SIGNL4ApiRequest(this: IExecuteFunctions, method: string, resource: string, body: any = {}, query: IDataObject = {}, uri?: string, option: IDataObject = {}): Promise { // tslint:disable-line:no-any +export async function SIGNL4ApiRequest(this: IExecuteFunctions, method: string, contentType: string, body: string, query: IDataObject = {}, teamSecret?: string, option: IDataObject = {}): Promise { // tslint:disable-line:no-any let options: OptionsWithUri = { headers: { 'Accept': '*/*', + 'Content-Type': contentType }, method, body, qs: query, - uri: uri || ``, - json: true, + uri: "https://connect.signl4.com/webhook/" + teamSecret, + json: false, }; if (!Object.keys(body).length) { diff --git a/packages/nodes-base/nodes/Signl4/Signl4.node.json b/packages/nodes-base/nodes/Signl4/Signl4.node.json index e6e06e864fcad..8337da9d3017e 100644 --- a/packages/nodes-base/nodes/Signl4/Signl4.node.json +++ b/packages/nodes-base/nodes/Signl4/Signl4.node.json @@ -1,7 +1,7 @@ { "node": "n8n-nodes-base.signl4", - "nodeVersion": "1.0", - "codexVersion": "1.0", + "nodeVersion": "1.1", + "codexVersion": "1.1", "categories": [ "Communication", "Development" diff --git a/packages/nodes-base/nodes/Signl4/Signl4.node.ts b/packages/nodes-base/nodes/Signl4/Signl4.node.ts index 2b8defc44095e..56d73c8a86404 100644 --- a/packages/nodes-base/nodes/Signl4/Signl4.node.ts +++ b/packages/nodes-base/nodes/Signl4/Signl4.node.ts @@ -265,36 +265,71 @@ export class Signl4 implements INodeType { if (operation === 'send') { const message = this.getNodeParameter('message', i) as string; const additionalFields = this.getNodeParameter('additionalFields',i) as IDataObject; + + let data = ""; - const data: IDataObject = { - message, - }; + // Message + data += "------Boundary-cc2050af-c42f-4cda-a0c3-ede7eaa89513\r\n"; + data += "Content-Disposition: form-data; name=\"message\"\r\n\r\n"; + data += message + "\r\n"; - if (additionalFields.alertingScenario) { - data['X-S4-AlertingScenario'] = additionalFields.alertingScenario as string; - } - if (additionalFields.externalId) { - data['X-S4-ExternalID'] = additionalFields.externalId as string; + // Title + if (additionalFields.title) { + data += "------Boundary-cc2050af-c42f-4cda-a0c3-ede7eaa89513\r\n"; + data += "Content-Disposition: form-data; name=\"title\"\r\n\r\n"; + data += additionalFields.title as string + "\r\n"; } - if (additionalFields.filtering) { - data['X-S4-Filtering'] = (additionalFields.filtering as boolean).toString(); + + // X-S4-Service + if (additionalFields.service) { + data += "------Boundary-cc2050af-c42f-4cda-a0c3-ede7eaa89513\r\n"; + data += "Content-Disposition: form-data; name=\"X-S4-Service\"\r\n\r\n"; + data += additionalFields.service as string + "\r\n"; } + + // X-S4-Location if (additionalFields.locationFieldsUi) { const locationUi = (additionalFields.locationFieldsUi as IDataObject).locationFieldsValues as IDataObject; if (locationUi) { - data['X-S4-Location'] = `${locationUi.latitude},${locationUi.longitude}`; + data += "------Boundary-cc2050af-c42f-4cda-a0c3-ede7eaa89513\r\n"; + data += "Content-Disposition: form-data; name=\"X-S4-Location\"\r\n\r\n"; + data += `${locationUi.latitude},${locationUi.longitude}` + "\r\n"; } } - if (additionalFields.service) { - data['X-S4-Service'] = additionalFields.service as string; + + // X-S4-AlertingScenario + if (additionalFields.alertingScenario) { + data += "------Boundary-cc2050af-c42f-4cda-a0c3-ede7eaa89513\r\n"; + data += "Content-Disposition: form-data; name=\"X-S4-AlertingScenario\"\r\n\r\n"; + data += additionalFields.alertingScenario as string + "\r\n"; } - data['X-S4-Status'] = 'new'; - if (additionalFields.title) { - data['title'] = additionalFields.title as string; + + // X-S4-Filtering + if (additionalFields.filtering) { + data += "------Boundary-cc2050af-c42f-4cda-a0c3-ede7eaa89513\r\n"; + data += "Content-Disposition: form-data; name=\"X-S4-Filtering\"\r\n\r\n"; + data += (additionalFields.filtering as boolean).toString() + "\r\n"; } - const attachments = additionalFields.attachmentsUi as IDataObject; + // X-S4-ExternalID + if (additionalFields.externalId) { + data += "------Boundary-cc2050af-c42f-4cda-a0c3-ede7eaa89513\r\n"; + data += "Content-Disposition: form-data; name=\"X-S4-ExternalID\"\r\n\r\n"; + data += additionalFields.externalId as string + "\r\n"; + } + + // Status + data += "------Boundary-cc2050af-c42f-4cda-a0c3-ede7eaa89513\r\n"; + data += "Content-Disposition: form-data; name=\"X-S4-Status\"\r\n\r\n"; + data += "new\r\n"; + // Source System + data += "------Boundary-cc2050af-c42f-4cda-a0c3-ede7eaa89513\r\n"; + data += "Content-Disposition: form-data; name=\"X-S4-SourceSystem\"\r\n\r\n"; + data += "n8n\r\n"; + + // Attachments + const attachments = additionalFields.attachmentsUi as IDataObject; if (attachments) { if (attachments.attachmentsBinary && items[i].binary) { @@ -304,38 +339,39 @@ export class Signl4 implements INodeType { if (binaryProperty) { - const supportedFileExtension = ['png', 'jpg', 'txt']; + const supportedFileExtension = ['png', 'jpg', 'bmp', 'gif', 'mp3', 'wav']; if (!supportedFileExtension.includes(binaryProperty.fileExtension as string)) { throw new Error(`Invalid extension, just ${supportedFileExtension.join(',')} are supported}`); } - data['file'] = { - value: Buffer.from(binaryProperty.data, BINARY_ENCODING), - options: { - filename: binaryProperty.fileName, - contentType: binaryProperty.mimeType, - }, - }; + data += "------Boundary-cc2050af-c42f-4cda-a0c3-ede7eaa89513\r\n"; + data += "Content-Disposition: form-data; name=\"" + binaryProperty.fileName + "\"; filename=\"" + binaryProperty.fileName + "\"\r\n"; + data += "Content-Type: " + binaryProperty.mimeType + "\r\n"; + data += "Content-Transfer-Encoding: base64\r\n\r\n"; + + data += Buffer.from(binaryProperty.data, 'base64').toString('base64') + "\r\n"; } else { throw new Error(`Binary property ${propertyName} does not exist on input`); } } } + + data += "------Boundary-cc2050af-c42f-4cda-a0c3-ede7eaa89513--\r\n"; const credentials = this.getCredentials('signl4Api'); - const endpoint = `https://connect.signl4.com/webhook/${credentials?.teamSecret}`; + const teamSecret = credentials?.teamSecret as string; responseData = await SIGNL4ApiRequest.call( this, 'POST', - '', + 'multipart/form-data; boundary=----Boundary-cc2050af-c42f-4cda-a0c3-ede7eaa89513', data, {}, - endpoint, + teamSecret, {}, ); } @@ -347,18 +383,21 @@ export class Signl4 implements INodeType { data['X-S4-ExternalID'] = this.getNodeParameter('externalId', i) as string; data['X-S4-Status'] = 'resolved'; + + // Source system + data['X-S4-SourceSystem'] = 'n8n'; const credentials = this.getCredentials('signl4Api'); - const endpoint = `https://connect.signl4.com/webhook/${credentials?.teamSecret}`; + const teamSecret = credentials?.teamSecret as string; responseData = await SIGNL4ApiRequest.call( this, 'POST', - '', - data, + 'application/json', + JSON.stringify(data), {}, - endpoint, + teamSecret, {}, ); } From 18a6b4500b5d91b17486ee9ee58f8c16e9133732 Mon Sep 17 00:00:00 2001 From: rons4 Date: Tue, 19 Jan 2021 13:29:22 +0100 Subject: [PATCH 2/6] SI'GNL4: Attachment Support Attachment support added for SIGNL4. --- packages/nodes-base/nodes/Signl4/GenericFunctions.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/nodes-base/nodes/Signl4/GenericFunctions.ts b/packages/nodes-base/nodes/Signl4/GenericFunctions.ts index d5f3df2513b2b..13b06e3ef7679 100644 --- a/packages/nodes-base/nodes/Signl4/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Signl4/GenericFunctions.ts @@ -10,8 +10,6 @@ import { OptionsWithUri, } from 'request'; -const https = require('https') - //import * as https from 'https'; /** From 86aeef57037d49aa2ca3eb2fee8b4042ef97aaac Mon Sep 17 00:00:00 2001 From: rons4 Date: Wed, 20 Jan 2021 09:31:17 +0100 Subject: [PATCH 3/6] Update GenericFunctions.ts --- packages/nodes-base/nodes/Signl4/GenericFunctions.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/nodes-base/nodes/Signl4/GenericFunctions.ts b/packages/nodes-base/nodes/Signl4/GenericFunctions.ts index 13b06e3ef7679..c23654f0f5480 100644 --- a/packages/nodes-base/nodes/Signl4/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Signl4/GenericFunctions.ts @@ -10,8 +10,6 @@ import { OptionsWithUri, } from 'request'; -//import * as https from 'https'; - /** * Make an API request to SIGNL4 * From d70e2130e1e5d5be82e1d902afb42feffda28dcd Mon Sep 17 00:00:00 2001 From: rons4 Date: Wed, 20 Jan 2021 11:55:25 +0100 Subject: [PATCH 4/6] Update GenericFunctions.ts --- packages/nodes-base/nodes/Signl4/GenericFunctions.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Signl4/GenericFunctions.ts b/packages/nodes-base/nodes/Signl4/GenericFunctions.ts index c23654f0f5480..56e3560ca79d7 100644 --- a/packages/nodes-base/nodes/Signl4/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Signl4/GenericFunctions.ts @@ -14,7 +14,12 @@ import { * Make an API request to SIGNL4 * * @param {IHookFunctions | IExecuteFunctions} this - * @param {object} message + * @param {string} method + * @param {string} contentType + * @param {string} body + * @param {object} query + * @param {string} teamSecret + * @param {object} options * @returns {Promise} */ From 19f079d26e296edb92f33bf6bb4e4104fb772591 Mon Sep 17 00:00:00 2001 From: rons4 Date: Wed, 20 Jan 2021 12:15:12 +0100 Subject: [PATCH 5/6] Update GenericFunctions.ts --- packages/nodes-base/nodes/Signl4/GenericFunctions.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/nodes-base/nodes/Signl4/GenericFunctions.ts b/packages/nodes-base/nodes/Signl4/GenericFunctions.ts index 56e3560ca79d7..60e05a521c1e1 100644 --- a/packages/nodes-base/nodes/Signl4/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Signl4/GenericFunctions.ts @@ -21,6 +21,7 @@ import { * @param {string} teamSecret * @param {object} options * @returns {Promise} + * */ export async function SIGNL4ApiRequest(this: IExecuteFunctions, method: string, contentType: string, body: string, query: IDataObject = {}, teamSecret?: string, option: IDataObject = {}): Promise { // tslint:disable-line:no-any From 6ccc1049260ee6f946a843f0f9e5bbc19f6298ea Mon Sep 17 00:00:00 2001 From: rons4 Date: Fri, 22 Jan 2021 10:10:53 +0100 Subject: [PATCH 6/6] Update GenericFunctions.ts --- packages/nodes-base/nodes/Signl4/GenericFunctions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Signl4/GenericFunctions.ts b/packages/nodes-base/nodes/Signl4/GenericFunctions.ts index 60e05a521c1e1..62f53823c76e8 100644 --- a/packages/nodes-base/nodes/Signl4/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Signl4/GenericFunctions.ts @@ -47,7 +47,7 @@ export async function SIGNL4ApiRequest(this: IExecuteFunctions, method: string, options = Object.assign({}, options, option); try { - return await this.helpers.request!(options); + return JSON.parse(await this.helpers.request!(options)); } catch (error) { if (error.response && error.response.body && error.response.body.details) {