From a5655d035284801969a30ab8ab8bb08687e9a795 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Thu, 17 Sep 2020 17:06:58 -0400 Subject: [PATCH] :zap: Add self hosted support to Sentry.io Node (#965) --- .../SentryIoServerApi.credentials.ts | 23 ++++++ .../nodes/SentryIo/GenericFunctions.ts | 17 ++++- .../nodes/SentryIo/SentryIo.node.ts | 70 ++++++++++++++++++- packages/nodes-base/package.json | 1 + 4 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 packages/nodes-base/credentials/SentryIoServerApi.credentials.ts diff --git a/packages/nodes-base/credentials/SentryIoServerApi.credentials.ts b/packages/nodes-base/credentials/SentryIoServerApi.credentials.ts new file mode 100644 index 0000000000..0f2a505109 --- /dev/null +++ b/packages/nodes-base/credentials/SentryIoServerApi.credentials.ts @@ -0,0 +1,23 @@ +import { + ICredentialType, + NodePropertyTypes, +} from 'n8n-workflow'; + +export class SentryIoServerApi implements ICredentialType { + name = 'sentryIoServerApi'; + displayName = 'Sentry.io API'; + properties = [ + { + displayName: 'Token', + name: 'token', + type: 'string' as NodePropertyTypes, + default: '', + }, { + displayName: 'URL', + name: 'url', + type: 'string' as NodePropertyTypes, + default: '', + placeholder: 'https://example.com', + }, + ]; +} diff --git a/packages/nodes-base/nodes/SentryIo/GenericFunctions.ts b/packages/nodes-base/nodes/SentryIo/GenericFunctions.ts index 82105de7d5..a5bcfd64ad 100644 --- a/packages/nodes-base/nodes/SentryIo/GenericFunctions.ts +++ b/packages/nodes-base/nodes/SentryIo/GenericFunctions.ts @@ -17,6 +17,8 @@ import { export async function sentryIoApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions | IWebhookFunctions, method: string, resource: string, body: any = {}, qs: IDataObject = {}, uri?: string, option: IDataObject = {}): Promise { // tslint:disable-line:no-any const authentication = this.getNodeParameter('authentication', 0); + const version = this.getNodeParameter('sentryVersion', 0); + const options: OptionsWithUri = { headers: {}, method, @@ -37,10 +39,22 @@ export async function sentryIoApiRequest(this: IHookFunctions | IExecuteFunction delete options.qs.limit; } + let credentialName; + try { if (authentication === 'accessToken') { - const credentials = this.getCredentials('sentryIoApi'); + if (version === 'cloud') { + credentialName = 'sentryIoApi'; + } else { + credentialName = 'sentryIoServerApi'; + } + + const credentials = this.getCredentials(credentialName); + + if (credentials?.url) { + options.uri = `${credentials?.url}${resource}`; + } options.headers = { Authorization: `Bearer ${credentials?.token}`, @@ -50,6 +64,7 @@ export async function sentryIoApiRequest(this: IHookFunctions | IExecuteFunction return this.helpers.request(options); } else { + return await this.helpers.requestOAuth2!.call(this, 'sentryIoOAuth2Api', options); } diff --git a/packages/nodes-base/nodes/SentryIo/SentryIo.node.ts b/packages/nodes-base/nodes/SentryIo/SentryIo.node.ts index 74213e5435..3996ad294d 100644 --- a/packages/nodes-base/nodes/SentryIo/SentryIo.node.ts +++ b/packages/nodes-base/nodes/SentryIo/SentryIo.node.ts @@ -45,7 +45,12 @@ import { sentryIoApiRequest, sentryApiRequestAllItems, } from './GenericFunctions'; -import { ICommit, IPatchSet, IRef } from './Interface'; + +import { + ICommit, + IPatchSet, + IRef, +} from './Interface'; export class SentryIo implements INodeType { description: INodeTypeDescription = { @@ -71,6 +76,9 @@ export class SentryIo implements INodeType { authentication: [ 'oAuth2', ], + sentryVersion: [ + 'cloud', + ], }, }, }, @@ -82,15 +90,55 @@ export class SentryIo implements INodeType { authentication: [ 'accessToken', ], + sentryVersion: [ + 'cloud', + ], + }, + }, + }, + { + name: 'sentryIoServerApi', + required: true, + displayOptions: { + show: { + authentication: [ + 'accessToken', + ], + sentryVersion: [ + 'server', + ], }, }, }, ], properties: [ + { + displayName: 'Sentry Version', + name: 'sentryVersion', + type: 'options', + options: [ + { + name: 'Cloud', + value: 'cloud', + }, + { + name: 'Server (Self Hosted)', + value: 'server', + }, + ], + default: 'cloud', + }, { displayName: 'Authentication', name: 'authentication', type: 'options', + displayOptions: { + show: { + sentryVersion: [ + 'cloud', + ], + }, + }, options: [ { name: 'Access Token', @@ -104,6 +152,26 @@ export class SentryIo implements INodeType { default: 'accessToken', description: 'The resource to operate on.', }, + { + displayName: 'Authentication', + name: 'authentication', + type: 'options', + displayOptions: { + show: { + sentryVersion: [ + 'server', + ], + }, + }, + options: [ + { + name: 'Access Token', + value: 'accessToken', + }, + ], + default: 'accessToken', + description: 'The resource to operate on.', + }, { displayName: 'Resource', name: 'resource', diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 500c3f9942..ba6cb1a53b 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -143,6 +143,7 @@ "dist/credentials/ShopifyApi.credentials.js", "dist/credentials/SalesforceOAuth2Api.credentials.js", "dist/credentials/SentryIoApi.credentials.js", + "dist/credentials/SentryIoServerApi.credentials.js", "dist/credentials/SentryIoOAuth2Api.credentials.js", "dist/credentials/SlackApi.credentials.js", "dist/credentials/SlackOAuth2Api.credentials.js",