2020-08-04 08:23:06 -07:00
import {
IExecuteFunctions ,
} from 'n8n-core' ;
import {
IDataObject ,
ILoadOptionsFunctions ,
2020-10-01 05:01:39 -07:00
INodeExecutionData ,
2020-08-04 08:23:06 -07:00
INodePropertyOptions ,
2020-10-01 05:01:39 -07:00
INodeType ,
INodeTypeDescription ,
2021-04-16 09:33:36 -07:00
NodeOperationError ,
2020-08-04 08:23:06 -07:00
} from 'n8n-workflow' ;
import {
twakeApiRequest ,
} from './GenericFunctions' ;
export class Twake implements INodeType {
description : INodeTypeDescription = {
displayName : 'Twake' ,
name : 'twake' ,
group : [ 'transform' ] ,
version : 1 ,
icon : 'file:twake.png' ,
subtitle : '={{$parameter["operation"] + ": " + $parameter["resource"]}}' ,
description : 'Consume Twake API' ,
defaults : {
name : 'Twake' ,
} ,
inputs : [ 'main' ] ,
outputs : [ 'main' ] ,
credentials : [
{
name : 'twakeCloudApi' ,
required : true ,
2020-08-04 08:30:08 -07:00
// displayOptions: {
// show: {
// twakeVersion: [
// 'cloud',
// ],
// },
// },
2020-08-04 08:23:06 -07:00
} ,
2020-08-04 08:30:08 -07:00
// {
// name: 'twakeServerApi',
// required: true,
// displayOptions: {
// show: {
// twakeVersion: [
// 'server',
// ],
// },
// },
// },
2020-08-04 08:23:06 -07:00
] ,
properties : [
2020-08-04 08:30:08 -07:00
// {
// displayName: 'Twake Version',
// name: 'twakeVersion',
// type: 'options',
// options: [
// {
// name: 'Cloud',
// value: 'cloud',
// },
// {
// name: 'Server (Self Hosted)',
// value: 'server',
// },
// ],
// default: 'cloud',
// },
2020-08-04 08:23:06 -07:00
{
displayName : 'Resource' ,
name : 'resource' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2020-08-04 08:23:06 -07:00
options : [
{
name : 'Message' ,
value : 'message' ,
description : 'Send data to the message app' ,
} ,
] ,
default : 'message' ,
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2020-08-04 08:23:06 -07:00
displayOptions : {
show : {
resource : [
'message' ,
] ,
} ,
} ,
options : [
{
name : 'Send' ,
value : 'send' ,
description : 'Send a message' ,
} ,
] ,
default : 'send' ,
} ,
{
2022-06-03 10:23:49 -07:00
displayName : 'Channel Name or ID' ,
2020-08-04 08:23:06 -07:00
name : 'channelId' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getChannels' ,
} ,
displayOptions : {
show : {
operation : [
'send' ,
] ,
} ,
} ,
default : '' ,
2022-06-03 10:23:49 -07:00
description : 'Channel\'s ID. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>.' ,
2020-08-04 08:23:06 -07:00
} ,
{
displayName : 'Content' ,
name : 'content' ,
type : 'string' ,
required : true ,
displayOptions : {
show : {
operation : [
'send' ,
] ,
} ,
} ,
default : '' ,
description : 'Message content' ,
} ,
{
displayName : 'Additional Fields' ,
name : 'additionalFields' ,
type : 'collection' ,
placeholder : 'Add Field' ,
displayOptions : {
show : {
operation : [
'send' ,
] ,
} ,
} ,
default : { } ,
options : [
{
displayName : 'Sender Icon' ,
name : 'senderIcon' ,
type : 'string' ,
default : '' ,
description : 'URL of the image/icon' ,
} ,
{
displayName : 'Sender Name' ,
name : 'senderName' ,
type : 'string' ,
default : '' ,
} ,
] ,
} ,
] ,
} ;
methods = {
loadOptions : {
async getChannels ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
const responseData = await twakeApiRequest . call ( this , 'POST' , '/channel' , { } ) ;
if ( responseData === undefined ) {
2021-04-16 09:33:36 -07:00
throw new NodeOperationError ( this . getNode ( ) , 'No data got returned' ) ;
2020-08-04 08:23:06 -07:00
}
const returnData : INodePropertyOptions [ ] = [ ] ;
for ( const channel of responseData ) {
returnData . push ( {
name : channel.name ,
value : channel.id ,
} ) ;
}
return returnData ;
} ,
} ,
} ;
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-08-04 08:23:06 -07:00
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 === 'message' ) {
if ( operation === 'send' ) {
const additionalFields = this . getNodeParameter ( 'additionalFields' , i ) as IDataObject ;
const message : IDataObject = {
channel_id : this.getNodeParameter ( 'channelId' , i ) ,
content : {
formatted : this.getNodeParameter ( 'content' , i ) as string ,
} ,
hidden_data : {
allow_delete : 'everyone' ,
} ,
} ;
if ( additionalFields . senderName ) {
//@ts-ignore
message . hidden_data ! . custom_title = additionalFields . senderName as string ;
}
if ( additionalFields . senderIcon ) {
//@ts-ignore
message . hidden_data ! . custom_icon = additionalFields . senderIcon as string ;
}
const body = {
object : message ,
} ;
const endpoint = '/actions/message/save' ;
responseData = await twakeApiRequest . call ( this , 'POST' , endpoint , body ) ;
responseData = responseData . object ;
}
}
}
if ( Array . isArray ( responseData ) ) {
returnData . push . apply ( returnData , responseData as IDataObject [ ] ) ;
} else if ( responseData !== undefined ) {
returnData . push ( responseData as IDataObject ) ;
}
return [ this . helpers . returnJsonArray ( returnData ) ] ;
}
}