From 0c92349b5d0e59b2413a22396af81e15cda0fc42 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Sat, 25 Jan 2020 16:44:33 -0500 Subject: [PATCH] :sparkles: Bitly node --- .../credentials/BitlyApi.credentials.ts | 17 + packages/nodes-base/nodes/Bitly/Bitly.node.ts | 188 +++++++++++ .../nodes/Bitly/GenericFunctions.ts | 57 ++++ .../nodes-base/nodes/Bitly/LinkDescription.ts | 319 ++++++++++++++++++ packages/nodes-base/nodes/Bitly/bitly.png | Bin 0 -> 6782 bytes packages/nodes-base/package.json | 2 + 6 files changed, 583 insertions(+) create mode 100644 packages/nodes-base/credentials/BitlyApi.credentials.ts create mode 100644 packages/nodes-base/nodes/Bitly/Bitly.node.ts create mode 100644 packages/nodes-base/nodes/Bitly/GenericFunctions.ts create mode 100644 packages/nodes-base/nodes/Bitly/LinkDescription.ts create mode 100644 packages/nodes-base/nodes/Bitly/bitly.png diff --git a/packages/nodes-base/credentials/BitlyApi.credentials.ts b/packages/nodes-base/credentials/BitlyApi.credentials.ts new file mode 100644 index 0000000000..a6c5259877 --- /dev/null +++ b/packages/nodes-base/credentials/BitlyApi.credentials.ts @@ -0,0 +1,17 @@ +import { + ICredentialType, + NodePropertyTypes, +} from 'n8n-workflow'; + +export class BitlyApi implements ICredentialType { + name = 'bitlyApi'; + displayName = 'Bitly API'; + properties = [ + { + displayName: 'Access Token', + name: 'accessToken', + type: 'string' as NodePropertyTypes, + default: '', + }, + ]; +} diff --git a/packages/nodes-base/nodes/Bitly/Bitly.node.ts b/packages/nodes-base/nodes/Bitly/Bitly.node.ts new file mode 100644 index 0000000000..700172ed0f --- /dev/null +++ b/packages/nodes-base/nodes/Bitly/Bitly.node.ts @@ -0,0 +1,188 @@ +import { + IExecuteFunctions, +} from 'n8n-core'; +import { + IDataObject, + INodeTypeDescription, + INodeExecutionData, + INodeType, + ILoadOptionsFunctions, + INodePropertyOptions, +} from 'n8n-workflow'; +import { + linkFields, + linkOperations +} from './LinkDescription'; +import { + bitlyApiRequest, + bitlyApiRequestAllItems, +} from './GenericFunctions'; + +export class Bitly implements INodeType { + description: INodeTypeDescription = { + displayName: 'Bitly', + name: 'bitly', + icon: 'file:bitly.png', + group: ['output'], + version: 1, + subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', + description: 'Consume Bitly API', + defaults: { + name: 'Bitly', + color: '#d3643b', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'bitlyApi', + required: true, + } + ], + properties: [ + { + displayName: 'Resource', + name: 'resource', + type: 'options', + options: [ + { + name: ' Link', + value: 'link', + }, + ], + default: 'link', + description: 'Resource to consume.', + }, + ...linkOperations, + ...linkFields, + ], + }; + + methods = { + loadOptions: { + // Get all the available groups to display them to user so that he can + // select them easily + async getGroups(this: ILoadOptionsFunctions): Promise { + const returnData: INodePropertyOptions[] = []; + const groups = await bitlyApiRequestAllItems.call(this, 'groups', 'GET', '/groups'); + for (const group of groups) { + const groupName = group.name; + const groupId = group.guid; + returnData.push({ + name: groupName, + value: groupId, + }); + } + return returnData; + }, + // Get all the available tags to display them to user so that he can + // select them easily + async getTags(this: ILoadOptionsFunctions): Promise { + const groupId = this.getCurrentNodeParameter('group') as string; + const returnData: INodePropertyOptions[] = []; + const tags = await bitlyApiRequestAllItems.call(this, 'tags', 'GET', `groups/${groupId}/tags`); + for (const tag of tags) { + const tagName = tag; + const tagId = tag; + returnData.push({ + name: tagName, + value: tagId, + }); + } + return returnData; + }, + }, + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + const returnData: IDataObject[] = []; + const length = items.length as unknown as number; + const qs: IDataObject = {}; + let responseData; + const resource = this.getNodeParameter('resource', 0) as string; + const operation = this.getNodeParameter('operation', 0) as string; + for (let i = 0; i < length; i++) { + if (resource === 'link') { + if (operation === 'create') { + const longUrl = this.getNodeParameter('longUrl', i) as string; + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + const body: IDataObject = { + long_url: longUrl, + }; + if (additionalFields.title) { + body.title = additionalFields.title as string; + } + if (additionalFields.domain) { + body.domain = additionalFields.domain as string; + } + if (additionalFields.group) { + body.group = additionalFields.group as string; + } + if (additionalFields.tags) { + body.tags = additionalFields.tags as string[]; + } + const deeplinks = (this.getNodeParameter('deeplink', i) as IDataObject).deeplinkUi as IDataObject[]; + if (deeplinks) { + for (const deeplink of deeplinks) { + //@ts-ignore + body.deeplinks.push({ + app_uri_path: deeplink.appUriPath, + install_type: deeplink.installType, + install_url: deeplink.installUrl, + app_id: deeplink.appId, + }) + } + } + responseData = await bitlyApiRequest.call(this, 'POST', '/bitlinks', body); + } + if (operation === 'update') { + const linkId = this.getNodeParameter('id', i) as string; + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; + const body: IDataObject = {}; + if (updateFields.longUrl) { + body.long_url = updateFields.longUrl as string; + } + if (updateFields.title) { + body.title = updateFields.title as string; + } + if (updateFields.archived !== undefined) { + body.archived = updateFields.archived as boolean; + } + if (updateFields.domain) { + body.domain = updateFields.domain as string; + } + if (updateFields.group) { + body.group = updateFields.group as string; + } + if (updateFields.tags) { + body.tags = updateFields.tags as string[]; + } + const deeplinks = (this.getNodeParameter('deeplink', i) as IDataObject).deeplinkUi as IDataObject[]; + if (deeplinks) { + for (const deeplink of deeplinks) { + //@ts-ignore + body.deeplinks.push({ + app_uri_path: deeplink.appUriPath, + install_type: deeplink.installType, + install_url: deeplink.installUrl, + app_id: deeplink.appId, + }) + } + } + responseData = await bitlyApiRequest.call(this, 'PATCH', `/bitlinks/${linkId}`, body); + } + if (operation === 'get') { + const linkId = this.getNodeParameter('id', i) as string; + responseData = await bitlyApiRequest.call(this, 'GET', `/bitlinks/${linkId}`); + } + } + if (Array.isArray(responseData)) { + returnData.push.apply(returnData, responseData as IDataObject[]); + } else { + returnData.push(responseData as IDataObject); + } + } + return [this.helpers.returnJsonArray(returnData)]; + } +} diff --git a/packages/nodes-base/nodes/Bitly/GenericFunctions.ts b/packages/nodes-base/nodes/Bitly/GenericFunctions.ts new file mode 100644 index 0000000000..5049b08044 --- /dev/null +++ b/packages/nodes-base/nodes/Bitly/GenericFunctions.ts @@ -0,0 +1,57 @@ +import { OptionsWithUri } from 'request'; +import { + IExecuteFunctions, + IExecuteSingleFunctions, + IHookFunctions, + ILoadOptionsFunctions, +} from 'n8n-core'; +import { IDataObject } from 'n8n-workflow'; + +export async function bitlyApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, method: string, resource: string, body: any = {}, qs: IDataObject = {}, uri?: string, option: IDataObject = {}): Promise { // tslint:disable-line:no-any + const credentials = this.getCredentials('bitlyApi'); + if (credentials === undefined) { + throw new Error('No credentials got returned!'); + } + let options: OptionsWithUri = { + headers: { Authorization: `Bearer ${credentials.accessToken}`}, + method, + qs, + body, + uri: uri ||`https://api-ssl.bitly.com/v4${resource}`, + json: true + }; + options = Object.assign({}, options, option); + if (Object.keys(options.body).length === 0) { + delete options.body; + } + try { + return await this.helpers.request!(options); + } catch (err) { + throw new Error(err); + } +} + +/** + * Make an API request to paginated flow endpoint + * and return all results + */ +export async function bitlyApiRequestAllItems(this: IHookFunctions | IExecuteFunctions| ILoadOptionsFunctions, propertyName: string, method: string, resource: string, body: any = {}, query: IDataObject = {}): Promise { // tslint:disable-line:no-any + + const returnData: IDataObject[] = []; + + let responseData; + let uri: string | undefined; + query.size = 50; + + do { + responseData = await bitlyApiRequest.call(this, method, resource, body, query, uri); + returnData.push.apply(returnData, responseData[propertyName]); + if (responseData.pagination && responseData.pagination.next) { + uri = responseData.pagination.next; + }; + } while ( + responseData.pagination !== undefined && + responseData.pagination.next !== undefined + ); + return returnData; +} diff --git a/packages/nodes-base/nodes/Bitly/LinkDescription.ts b/packages/nodes-base/nodes/Bitly/LinkDescription.ts new file mode 100644 index 0000000000..5cd872154a --- /dev/null +++ b/packages/nodes-base/nodes/Bitly/LinkDescription.ts @@ -0,0 +1,319 @@ +import { INodeProperties } from 'n8n-workflow'; + +export const linkOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'link', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a link', + }, + { + name: 'Update', + value: 'update', + description: 'Update a link', + }, + { + name: 'Get', + value: 'get', + description: 'Get a link', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, +] as INodeProperties[]; + +export const linkFields = [ + +/* -------------------------------------------------------------------------- */ +/* link:create */ +/* -------------------------------------------------------------------------- */ + { + displayName: 'Long URL', + name: 'longUrl', + type: 'string', + displayOptions: { + show: { + resource: [ + 'link', + ], + operation: [ + 'create', + ], + }, + }, + default: '', + required: true, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'link', + ], + operation: [ + 'create', + ], + }, + }, + options: [ + { + displayName: 'Domain', + name: 'domain', + type: 'string', + default: 'bit.ly', + }, + { + displayName: 'Title', + name: 'title', + type: 'string', + default: '', + }, + { + displayName: 'Group', + name: 'group', + type: 'options', + default: '', + typeOptions: { + loadOptionsMethod: 'getGroups', + }, + }, + { + displayName: 'Tags', + name: 'tags', + type: 'multiOptions', + default: [], + typeOptions: { + loadOptionsMethod: 'getTags', + loadOptionsDependsOn: [ + 'group', + ] + }, + }, + ], + }, + { + displayName: 'Deeplinks', + name: 'deeplink', + placeholder: 'Add Deep Link', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + displayOptions: { + show: { + resource: [ + 'link', + ], + operation: [ + 'create', + ], + }, + }, + default: {}, + options: [ + { + name: 'deeplinkUi', + displayName: 'Deep Link', + values: [ + { + displayName: 'App URI Path', + name: 'appUriPath', + type: 'string', + default: '', + }, + { + displayName: 'Install Type', + name: 'installType', + type: 'string', + default: '', + }, + { + displayName: 'Install URL', + name: 'installUrl', + type: 'string', + default: '', + }, + { + displayName: 'App ID', + name: 'appId', + type: 'string', + default: '', + }, + ] + }, + ], + }, +/* -------------------------------------------------------------------------- */ +/* link:update */ +/* -------------------------------------------------------------------------- */ + { + displayName: 'Bitlink', + name: 'id', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + resource: [ + 'link', + ], + operation: [ + 'update', + ], + }, + }, + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'link', + ], + operation: [ + 'update', + ], + }, + }, + options: [ + { + displayName: 'Long URL', + name: 'longUrl', + type: 'string', + default: '', + }, + { + displayName: 'Archived', + name: 'archived', + type: 'boolean', + default: false, + }, + { + displayName: 'Domain', + name: 'domain', + type: 'string', + default: 'bit.ly', + }, + { + displayName: 'Title', + name: 'title', + type: 'string', + default: '', + }, + { + displayName: 'Group', + name: 'group', + type: 'options', + default: '', + typeOptions: { + loadOptionsMethod: 'getGroups', + }, + }, + { + displayName: 'Tags', + name: 'tags', + type: 'multiOptions', + default: [], + typeOptions: { + loadOptionsMethod: 'getTags', + loadOptionsDependsOn: [ + 'group', + ] + }, + }, + ], + }, + { + displayName: 'Deeplinks', + name: 'deeplink', + placeholder: 'Add Deep Link', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + displayOptions: { + show: { + resource: [ + 'link', + ], + operation: [ + 'update', + ], + }, + }, + default: {}, + options: [ + { + name: 'deeplinkUi', + displayName: 'Deep Link', + values: [ + { + displayName: 'App URI Path', + name: 'appUriPath', + type: 'string', + default: '', + }, + { + displayName: 'Install Type', + name: 'installType', + type: 'string', + default: '', + }, + { + displayName: 'Install URL', + name: 'installUrl', + type: 'string', + default: '', + }, + { + displayName: 'App ID', + name: 'appId', + type: 'string', + default: '', + }, + ] + }, + ], + }, +/* -------------------------------------------------------------------------- */ +/* link:get */ +/* -------------------------------------------------------------------------- */ + { + displayName: 'Bitlink', + name: 'id', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + resource: [ + 'link', + ], + operation: [ + 'get', + ], + }, + }, + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Bitly/bitly.png b/packages/nodes-base/nodes/Bitly/bitly.png new file mode 100644 index 0000000000000000000000000000000000000000..5d000ffde42a87e6aaf7573c9917ed0a3097d7d8 GIT binary patch literal 6782 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 literal 0 HcmV?d00001 diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index f7d13755c6..22609e4af1 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -33,6 +33,7 @@ "dist/credentials/AsanaApi.credentials.js", "dist/credentials/Aws.credentials.js", "dist/credentials/BitbucketApi.credentials.js", + "dist/credentials/BitlyApi.credentials.js", "dist/credentials/ChargebeeApi.credentials.js", "dist/credentials/ClickUpApi.credentials.js", "dist/credentials/CodaApi.credentials.js", @@ -100,6 +101,7 @@ "dist/nodes/Aws/AwsLambda.node.js", "dist/nodes/Aws/AwsSns.node.js", "dist/nodes/Bitbucket/BitbucketTrigger.node.js", + "dist/nodes/Bitly/Bitly.node.js", "dist/nodes/Chargebee/Chargebee.node.js", "dist/nodes/Chargebee/ChargebeeTrigger.node.js", "dist/nodes/ClickUp/ClickUp.node.js",