From ec9d65b2e016299de625b20a364e55bfa6524f25 Mon Sep 17 00:00:00 2001 From: Matheus Cansian Date: Fri, 4 Oct 2019 22:06:26 -0300 Subject: [PATCH] Implement AWS SNS node --- packages/nodes-base/nodes/Aws/Sns.node.ts | 152 ++++++++++++++++++++++ packages/nodes-base/nodes/Aws/sns.png | Bin 0 -> 6032 bytes packages/nodes-base/package.json | 2 + 3 files changed, 154 insertions(+) create mode 100644 packages/nodes-base/nodes/Aws/Sns.node.ts create mode 100644 packages/nodes-base/nodes/Aws/sns.png diff --git a/packages/nodes-base/nodes/Aws/Sns.node.ts b/packages/nodes-base/nodes/Aws/Sns.node.ts new file mode 100644 index 000000000..e8404b154 --- /dev/null +++ b/packages/nodes-base/nodes/Aws/Sns.node.ts @@ -0,0 +1,152 @@ +import { + SNS, + config, + AWSError, +} from 'aws-sdk'; +import { IExecuteFunctions } from 'n8n-core'; +import { + INodeTypeDescription, + INodeExecutionData, + INodeType, + INodePropertyOptions, + ILoadOptionsFunctions, + IDataObject +} from 'n8n-workflow'; + +export class Sns implements INodeType { + description: INodeTypeDescription = { + displayName: 'Amazon SNS', + name: 'amazonSns', + icon: 'file:sns.png', + group: ['output'], + version: 1, + subtitle: '={{$parameter["topic"]}}', + description: 'Sends data to Amazon SNS', + defaults: { + name: 'Amazon SNS', + color: '#BB2244', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'aws', + required: true, + } + ], + properties: [ + { + displayName: 'Topic', + name: 'topic', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getTopics', + }, + options: [], + default: '', + required: true, + description: 'The topic you want to publish to', + }, + { + displayName: 'Subject', + name: 'subject', + type: 'string', + default: '', + description: 'Subject when the message is delivered to email endpoints', + }, + { + displayName: 'Message', + name: 'message', + type: 'string', + required: true, + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'The message you want to send', + }, + ], + }; + + methods = { + loadOptions: { + // Get all the available topics to display them to user so that he can + // select them easily + async getTopics(this: ILoadOptionsFunctions): Promise { + const credentials = this.getCredentials('aws'); + + if (credentials === undefined) { + throw new Error('No credentials got returned!'); + } + + config.update({ + region: `${credentials.region}`, + accessKeyId: `${credentials.accessKeyId}`, + secretAccessKey: `${credentials.secretAccessKey}`, + }); + + const returnData: INodePropertyOptions[] = []; + + let sns = new SNS(); + try { + var data = await sns.listTopics({}).promise(); + } catch (err) { + throw new Error(`AWS Error: ${err}`); + } + + for (let topic of data.Topics!) { + let topicArn = topic.TopicArn!; + let topicName = topicArn.split(':')[5]; + returnData.push({ + name: topicName, + value: topicArn, + }); + } + return returnData; + } + }, + }; + + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + const returnData: IDataObject[] = []; + + const credentials = this.getCredentials('aws'); + if (credentials === undefined) { + throw new Error('No credentials got returned!'); + } + + let topicArn: string; + let subject: string; + let message: string; + + config.update({ + region: `${credentials.region}`, + accessKeyId: `${credentials.accessKeyId}`, + secretAccessKey: `${credentials.secretAccessKey}`, + }); + let sns = new SNS(); + + for (let i = 0; i < items.length; i++) { + topicArn = this.getNodeParameter('topic', i) as string; + subject = this.getNodeParameter('subject', i) as string; + message = this.getNodeParameter('message', i) as string; + + let params = { + Message: message, + Subject: subject, + TopicArn: topicArn, + }; + + try { + var responseData = await sns.publish(params).promise(); + } catch (err) { + throw new Error(`AWS Error: ${err}`); + } + returnData.push(responseData as IDataObject); + } + + return [this.helpers.returnJsonArray(returnData)]; + } +} diff --git a/packages/nodes-base/nodes/Aws/sns.png b/packages/nodes-base/nodes/Aws/sns.png new file mode 100644 index 0000000000000000000000000000000000000000..1ebc137c321952831eb13285fa027189d5274cfc GIT binary patch literal 6032 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