2020-10-12 23:56:24 -07:00
import {
IExecuteFunctions ,
} from 'n8n-core' ;
import {
IDataObject ,
INodeExecutionData ,
INodeType ,
INodeTypeDescription ,
} from 'n8n-workflow' ;
import {
vonageApiRequest ,
} from './GenericFunctions' ;
export class Vonage implements INodeType {
description : INodeTypeDescription = {
displayName : 'Vonage' ,
name : 'vonage' ,
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' ,
options : [
{
name : 'SMS' ,
value : 'sms' ,
} ,
] ,
default : 'sms' ,
2020-10-22 06:46:03 -07:00
description : 'The resource to operate on.' ,
2020-10-12 23:56:24 -07:00
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
options : [
{
name : 'Send' ,
value : 'send' ,
} ,
] ,
displayOptions : {
show : {
resource : [
'sms' ,
] ,
} ,
} ,
default : 'send' ,
2020-10-22 06:46:03 -07:00
description : 'The resource to operate on.' ,
2020-10-12 23:56:24 -07:00
} ,
{
displayName : 'From' ,
name : 'from' ,
type : 'string' ,
displayOptions : {
show : {
resource : [
'sms' ,
] ,
operation : [
'send' ,
] ,
} ,
} ,
default : '' ,
description : ` The name or number the message should be sent from ` ,
} ,
{
displayName : 'To' ,
name : 'to' ,
type : 'string' ,
displayOptions : {
show : {
resource : [
'sms' ,
] ,
operation : [
'send' ,
] ,
} ,
} ,
default : '' ,
description : ` The number that the message should be sent to. Numbers are specified in E.164 format. ` ,
} ,
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 : {
resource : [
'sms' ,
] ,
operation : [
'send' ,
] ,
2020-10-12 23:57:06 -07:00
// type: [
// 'text',
// 'unicode',
// ],
2020-10-12 23:56:24 -07:00
} ,
} ,
default : '' ,
description : ` The body of the message being sent ` ,
} ,
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 : {
resource : [
'sms' ,
] ,
operation : [
'send' ,
] ,
} ,
} ,
default : { } ,
options : [
{
displayName : 'Account Ref' ,
name : 'account-ref' ,
type : 'string' ,
default : '' ,
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' ,
} ,
{
displayName : 'Callback' ,
name : 'callback' ,
type : 'string' ,
default : '' ,
description : 'The webhook endpoint the delivery receipt for this sms is sent to. This parameter overrides the webhook endpoint you set in Dashboard.' ,
} ,
{
displayName : 'Client Ref' ,
name : 'client-ref' ,
type : 'string' ,
default : '' ,
description : 'You can optionally include your own reference of up to 40 characters.' ,
} ,
{
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 : '' ,
description : 'The value of the protocol identifier to use. Ensure that the value is aligned with udh.' ,
} ,
{
displayName : 'Status Report Req' ,
name : 'status-report-req' ,
type : 'boolean' ,
default : false ,
description : 'Boolean indicating if you like to receive a Delivery Receipt.' ,
} ,
{
displayName : 'TTL (in minutes)' ,
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 [ ] = [ ] ;
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 ++ ) {
2021-07-19 23:58:54 -07:00
try {
if ( resource === 'sms' ) {
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
if ( operation === 'send' ) {
2020-10-12 23:56:24 -07:00
2021-07-19 23:58:54 -07:00
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 ) ] ;
}
}