2022-08-17 08:50:24 -07:00
import { IExecuteFunctions } from 'n8n-core' ;
2020-10-12 23:56:24 -07:00
2022-08-17 08:50:24 -07:00
import { IDataObject , INodeExecutionData , INodeType , INodeTypeDescription } from 'n8n-workflow' ;
2020-10-12 23:56:24 -07:00
2022-08-17 08:50:24 -07:00
import { vonageApiRequest } from './GenericFunctions' ;
2020-10-12 23:56:24 -07:00
export class Vonage implements INodeType {
description : INodeTypeDescription = {
displayName : 'Vonage' ,
name : 'vonage' ,
2022-06-20 07:54:01 -07:00
// eslint-disable-next-line n8n-nodes-base/node-class-description-icon-not-svg
2020-10-12 23:56:24 -07:00
icon : 'file:vonage.png' ,
group : [ 'input' ] ,
version : 1 ,
subtitle : '={{$parameter["operation"] + ": " + $parameter["resource"]}}' ,
description : 'Consume Vonage API' ,
defaults : {
name : 'Vonage' ,
} ,
inputs : [ 'main' ] ,
outputs : [ 'main' ] ,
credentials : [
{
name : 'vonageApi' ,
required : true ,
} ,
] ,
properties : [
{
displayName : 'Resource' ,
name : 'resource' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2020-10-12 23:56:24 -07:00
options : [
{
name : 'SMS' ,
value : 'sms' ,
} ,
] ,
default : 'sms' ,
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2020-10-12 23:56:24 -07:00
options : [
{
name : 'Send' ,
value : 'send' ,
2022-07-10 13:50:51 -07:00
action : 'Send an SMS' ,
2020-10-12 23:56:24 -07:00
} ,
] ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'sms' ] ,
2020-10-12 23:56:24 -07:00
} ,
} ,
default : 'send' ,
} ,
{
displayName : 'From' ,
name : 'from' ,
type : 'string' ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'sms' ] ,
operation : [ 'send' ] ,
2020-10-12 23:56:24 -07:00
} ,
} ,
default : '' ,
2022-05-06 14:01:25 -07:00
description : 'The name or number the message should be sent from' ,
2020-10-12 23:56:24 -07:00
} ,
{
displayName : 'To' ,
name : 'to' ,
type : 'string' ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'sms' ] ,
operation : [ 'send' ] ,
2020-10-12 23:56:24 -07:00
} ,
} ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'The number that the message should be sent to. Numbers are specified in E.164 format.' ,
2020-10-12 23:56:24 -07:00
} ,
2020-10-12 23:57:06 -07:00
// {
// displayName: 'Type',
// name: 'type',
// type: 'options',
// displayOptions: {
// show: {
// resource: [
// 'sms',
// ],
// operation: [
// 'send',
// ],
// },
// },
// options: [
// {
// name: 'Binary',
// value: 'binary',
// },
// {
// name: 'Text',
// value: 'text',
// },
// {
// name: 'Wappush',
// value: 'wappush',
// },
// {
// name: 'Unicode',
// value: 'unicode',
// },
// {
// name: 'VCAL',
// value: 'vcal',
// },
// {
// name: 'VCARD',
// value: 'vcard',
// },
// ],
// default: 'text',
// description: 'The format of the message body',
// },
2020-10-12 23:56:24 -07:00
// {
// displayName: 'Binary Property',
// name: 'binaryPropertyName',
// displayOptions: {
// show: {
// resource: [
// 'sms',
// ],
// operation: [
// 'send',
// ],
// type: [
// 'binary',
// ],
// },
// },
// type: 'string',
// default: 'data',
// description: 'Object property name which holds binary data.',
// required: true,
// },
2020-10-12 23:57:06 -07:00
// {
// displayName: 'Body',
// name: 'body',
// type: 'string',
// displayOptions: {
// show: {
// resource: [
// 'sms',
// ],
// operation: [
// 'send',
// ],
// type: [
// 'binary',
// ],
// },
// },
// default: '',
// description: 'Hex encoded binary data',
// },
// {
// displayName: 'UDH',
// name: 'udh',
// type: 'string',
// displayOptions: {
// show: {
// resource: [
// 'sms',
// ],
// operation: [
// 'send',
// ],
// type: [
// 'binary',
// ],
// },
// },
// default: '',
// description: 'Your custom Hex encoded User Data Header',
// },
// {
// displayName: 'Title',
// name: 'title',
// displayOptions: {
// show: {
// resource: [
// 'sms',
// ],
// operation: [
// 'send',
// ],
// type: [
// 'wappush',
// ],
// },
// },
// type: 'string',
// default: '',
// description: 'The title for a wappush SMS',
// },
// {
// displayName: 'URL',
// name: 'url',
// type: 'string',
// displayOptions: {
// show: {
// resource: [
// 'sms',
// ],
// operation: [
// 'send',
// ],
// type: [
// 'wappush',
// ],
// },
// },
// default: '',
// description: 'The URL of your website',
// },
// {
// displayName: 'Validity (in minutes)',
// name: 'validity',
// type: 'number',
// default: 0,
// displayOptions: {
// show: {
// resource: [
// 'sms',
// ],
// operation: [
// 'send',
// ],
// type: [
// 'wappush',
// ],
// },
// },
// description: 'The availability for an SMS in minutes',
// },
2020-10-12 23:56:24 -07:00
{
displayName : 'Message' ,
name : 'message' ,
type : 'string' ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'sms' ] ,
operation : [ 'send' ] ,
2020-10-12 23:57:06 -07:00
// type: [
// 'text',
// 'unicode',
// ],
2020-10-12 23:56:24 -07:00
} ,
} ,
default : '' ,
2022-05-06 14:01:25 -07:00
description : 'The body of the message being sent' ,
2020-10-12 23:56:24 -07:00
} ,
2020-10-12 23:57:06 -07:00
// {
// displayName: 'VCard',
// name: 'vcard',
// type: 'string',
// displayOptions: {
// show: {
// resource: [
// 'sms',
// ],
// operation: [
// 'send',
// ],
// type: [
// 'vcard',
// ],
// },
// },
// default: '',
// description: 'A business card in vCard format',
// },
// {
// displayName: 'VCal',
// name: 'vcal',
// type: 'string',
// displayOptions: {
// show: {
// resource: [
// 'sms',
// ],
// operation: [
// 'send',
// ],
// type: [
// 'vcal',
// ],
// },
// },
// default: '',
// description: 'A calendar event in vCal format',
// },
2020-10-12 23:56:24 -07:00
{
displayName : 'Additional Fields' ,
name : 'additionalFields' ,
type : 'collection' ,
placeholder : 'Add Field' ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'sms' ] ,
operation : [ 'send' ] ,
2020-10-12 23:56:24 -07:00
} ,
} ,
default : { } ,
options : [
{
displayName : 'Account Ref' ,
name : 'account-ref' ,
type : 'string' ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'An optional string used to identify separate accounts using the SMS endpoint for billing purposes. To use this feature, please email support@nexmo.com.' ,
2020-10-12 23:56:24 -07:00
} ,
{
displayName : 'Callback' ,
name : 'callback' ,
type : 'string' ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'The webhook endpoint the delivery receipt for this sms is sent to. This parameter overrides the webhook endpoint you set in Dashboard.' ,
2020-10-12 23:56:24 -07:00
} ,
{
displayName : 'Client Ref' ,
name : 'client-ref' ,
type : 'string' ,
default : '' ,
2022-05-06 14:01:25 -07:00
description : 'You can optionally include your own reference of up to 40 characters' ,
2020-10-12 23:56:24 -07:00
} ,
{
displayName : 'Message Class' ,
name : 'message-class' ,
type : 'options' ,
options : [
{
name : '0' ,
value : 0 ,
} ,
{
name : '1' ,
value : 1 ,
} ,
{
name : '2' ,
value : 2 ,
} ,
{
name : '3' ,
value : 3 ,
} ,
] ,
default : '' ,
description : 'The Data Coding Scheme value of the message' ,
} ,
{
displayName : 'Protocol ID' ,
name : 'protocol-id' ,
type : 'string' ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'The value of the protocol identifier to use. Ensure that the value is aligned with udh.' ,
2020-10-12 23:56:24 -07:00
} ,
{
displayName : 'Status Report Req' ,
name : 'status-report-req' ,
type : 'boolean' ,
default : false ,
2022-06-20 07:54:01 -07:00
description : 'Whether to receive a Delivery Receipt' ,
2020-10-12 23:56:24 -07:00
} ,
{
2022-06-03 10:23:49 -07:00
displayName : 'TTL (in Minutes)' ,
2020-10-12 23:56:24 -07:00
name : 'ttl' ,
type : 'number' ,
default : 4320 ,
description : 'By default Nexmo attempt delivery for 72 hours' ,
} ,
] ,
} ,
] ,
} ;
async execute ( this : IExecuteFunctions ) : Promise < INodeExecutionData [ ] [ ] > {
const items = this . getInputData ( ) ;
const returnData : IDataObject [ ] = [ ] ;
2022-04-22 09:29:51 -07:00
const length = items . length ;
2020-10-12 23:56:24 -07:00
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 ++ ) {
2021-07-19 23:58:54 -07:00
try {
if ( resource === 'sms' ) {
if ( operation === 'send' ) {
const from = this . getNodeParameter ( 'from' , i ) as string ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
const to = this . getNodeParameter ( 'to' , i ) as string ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
const type = this . getNodeParameter ( 'type' , i , 'text' ) as string ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
const body : IDataObject = {
from ,
to ,
type ,
} ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
if ( type === 'text' || type === 'unicode' ) {
const message = this . getNodeParameter ( 'message' , i ) as string ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
body . text = message ;
}
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
if ( type === 'binary' ) {
const data = this . getNodeParameter ( 'body' , i ) as string ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
const udh = this . getNodeParameter ( 'udh' , i ) as string ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
body . udh = udh ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
body . body = data ;
}
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
if ( type === 'wappush' ) {
const title = this . getNodeParameter ( 'title' , i ) as string ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
const url = this . getNodeParameter ( 'url' , i ) as string ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
const validity = this . getNodeParameter ( 'validity' , i ) as number ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
body . title = title ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
body . url = url ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
body . validity = validity * 60000 ;
}
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
if ( type === 'vcard' ) {
const vcard = this . getNodeParameter ( 'vcard' , i ) as string ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
body . vcard = vcard ;
}
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
if ( type === 'vcal' ) {
const vcal = this . getNodeParameter ( 'vcal' , i ) as string ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
body . vcal = vcal ;
}
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
const additionalFields = this . getNodeParameter ( 'additionalFields' , i ) as IDataObject ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
Object . assign ( body , additionalFields ) ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
if ( body . ttl ) {
// transform minutes to milliseconds
body . ttl = ( body . ttl as number ) * 60000 ;
}
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
responseData = await vonageApiRequest . call ( this , 'POST' , '/sms/json' , body ) ;
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
responseData = responseData . messages ;
}
}
} catch ( error ) {
if ( this . continueOnFail ( ) ) {
returnData . push ( { error : error.message } ) ;
continue ;
2020-10-12 23:56:24 -07:00
}
2021-07-19 23:58:54 -07:00
throw error ;
}
if ( Array . isArray ( responseData ) ) {
returnData . push . apply ( returnData , responseData as IDataObject [ ] ) ;
} else if ( responseData !== undefined ) {
returnData . push ( responseData as IDataObject ) ;
2020-10-12 23:56:24 -07:00
}
}
return [ this . helpers . returnJsonArray ( returnData ) ] ;
}
}