2020-04-22 10:08:53 -07:00
import {
IExecuteFunctions ,
} from 'n8n-core' ;
2019-10-20 13:57:06 -07:00
import {
IDataObject ,
ILoadOptionsFunctions ,
INodeTypeDescription ,
INodePropertyOptions ,
INodeExecutionData ,
INodeType ,
} from 'n8n-workflow' ;
import {
apiRequest ,
2020-04-22 10:08:53 -07:00
apiRequestAllItems ,
2019-10-21 15:12:35 -07:00
IAttachment ,
2019-10-20 13:57:06 -07:00
} from './GenericFunctions' ;
2020-04-22 10:08:53 -07:00
import {
snakeCase ,
} from 'change-case' ;
2019-10-20 13:57:06 -07:00
export class Mattermost implements INodeType {
description : INodeTypeDescription = {
displayName : 'Mattermost' ,
name : 'mattermost' ,
icon : 'file:mattermost.png' ,
group : [ 'output' ] ,
version : 1 ,
subtitle : '={{$parameter["operation"] + ": " + $parameter["resource"]}}' ,
description : 'Sends data to Mattermost' ,
defaults : {
name : 'Mattermost' ,
2020-04-23 23:14:19 -07:00
color : '#000000' ,
2019-10-20 13:57:06 -07:00
} ,
inputs : [ 'main' ] ,
outputs : [ 'main' ] ,
credentials : [
{
name : 'mattermostApi' ,
required : true ,
}
] ,
properties : [
{
displayName : 'Resource' ,
name : 'resource' ,
type : 'options' ,
options : [
{
name : 'Channel' ,
value : 'channel' ,
} ,
{
name : 'Message' ,
value : 'message' ,
} ,
2019-12-04 12:57:56 -08:00
{
name : 'User' ,
value : 'user' ,
} ,
2019-10-20 13:57:06 -07:00
] ,
default : 'message' ,
description : 'The resource to operate on.' ,
} ,
// ----------------------------------
// operations
// ----------------------------------
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
displayOptions : {
show : {
resource : [
'channel' ,
] ,
} ,
} ,
options : [
{
name : 'Add User' ,
value : 'addUser' ,
description : 'Add a user to a channel' ,
} ,
{
name : 'Create' ,
value : 'create' ,
description : 'Create a new channel' ,
} ,
2020-01-09 18:05:57 -08:00
{
name : 'Delete' ,
value : 'delete' ,
description : 'Soft-deletes a channel' ,
} ,
{
name : 'Restore' ,
value : 'restore' ,
description : 'Restores a soft-deleted channel' ,
} ,
2019-12-04 12:57:56 -08:00
{
name : 'Statistics' ,
value : 'statistics' ,
description : 'Get statistics for a channel.' ,
} ,
2019-10-20 13:57:06 -07:00
] ,
default : 'create' ,
description : 'The operation to perform.' ,
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
displayOptions : {
show : {
resource : [
'message' ,
] ,
} ,
} ,
options : [
2019-12-06 13:33:26 -08:00
{
name : 'Delete' ,
value : 'delete' ,
description : 'Soft deletes a post, by marking the post as deleted in the database.' ,
} ,
2019-10-20 13:57:06 -07:00
{
name : 'Post' ,
value : 'post' ,
description : 'Post a message into a channel' ,
} ,
] ,
default : 'post' ,
description : 'The operation to perform.' ,
} ,
// ----------------------------------
// channel
// ----------------------------------
// ----------------------------------
// channel:create
// ----------------------------------
{
displayName : 'Team ID' ,
name : 'teamId' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getTeams' ,
} ,
options : [ ] ,
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
'create'
] ,
resource : [
'channel' ,
] ,
} ,
} ,
description : 'The Mattermost Team.' ,
} ,
{
displayName : 'Display Name' ,
name : 'displayName' ,
type : 'string' ,
default : '' ,
placeholder : 'Announcements' ,
displayOptions : {
show : {
operation : [
'create'
] ,
resource : [
'channel' ,
] ,
} ,
} ,
required : true ,
description : 'The non-unique UI name for the channel.' ,
} ,
{
displayName : 'Name' ,
name : 'channel' ,
type : 'string' ,
default : '' ,
placeholder : 'announcements' ,
displayOptions : {
show : {
operation : [
'create'
] ,
resource : [
'channel' ,
] ,
} ,
} ,
required : true ,
description : 'The unique handle for the channel, will be present in the channel URL.' ,
} ,
2019-10-21 15:12:35 -07:00
{
displayName : 'Type' ,
name : 'type' ,
type : 'options' ,
displayOptions : {
show : {
operation : [
'create'
] ,
resource : [
'channel' ,
] ,
} ,
} ,
options : [
{
name : 'Private' ,
value : 'private' ,
} ,
{
name : 'Public' ,
value : 'public' ,
} ,
] ,
default : 'public' ,
description : 'The type of channel to create.' ,
} ,
2019-10-20 13:57:06 -07:00
2020-01-09 18:05:57 -08:00
// ----------------------------------
// channel:delete
// ----------------------------------
{
displayName : 'Channel ID' ,
name : 'channelId' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getChannels' ,
} ,
options : [ ] ,
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
'delete'
] ,
resource : [
'channel' ,
] ,
} ,
} ,
description : 'The ID of the channel to soft-delete.' ,
} ,
// ----------------------------------
// channel:restore
// ----------------------------------
{
displayName : 'Channel ID' ,
name : 'channelId' ,
type : 'string' ,
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
'restore'
] ,
resource : [
'channel' ,
] ,
} ,
} ,
description : 'The ID of the channel to restore.' ,
} ,
2019-10-20 13:57:06 -07:00
// ----------------------------------
// channel:addUser
// ----------------------------------
{
displayName : 'Channel ID' ,
name : 'channelId' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getChannels' ,
} ,
options : [ ] ,
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
'addUser'
] ,
resource : [
'channel' ,
] ,
} ,
} ,
description : 'The ID of the channel to invite user to.' ,
} ,
{
displayName : 'User ID' ,
name : 'userId' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getUsers' ,
} ,
options : [ ] ,
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
'addUser'
] ,
resource : [
'channel' ,
] ,
} ,
} ,
description : 'The ID of the user to invite into channel.' ,
} ,
2020-01-09 18:05:57 -08:00
2019-12-04 12:57:56 -08:00
// ----------------------------------
// channel:statistics
// ----------------------------------
{
displayName : 'Channel ID' ,
name : 'channelId' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getChannels' ,
} ,
options : [ ] ,
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
'statistics'
] ,
resource : [
'channel' ,
] ,
} ,
} ,
description : 'The ID of the channel to get the statistics from.' ,
} ,
2019-10-20 13:57:06 -07:00
// ----------------------------------
// message
// ----------------------------------
2019-12-06 13:33:26 -08:00
// ----------------------------------
// message:delete
// ----------------------------------
{
displayName : 'Post ID' ,
name : 'postId' ,
type : 'string' ,
required : true ,
displayOptions : {
show : {
resource : [
'message' ,
] ,
operation : [
'delete' ,
] ,
} ,
} ,
default : '' ,
description : 'ID of the post to delete' ,
} ,
2019-10-20 13:57:06 -07:00
// ----------------------------------
// message:post
// ----------------------------------
{
displayName : 'Channel ID' ,
name : 'channelId' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getChannels' ,
} ,
options : [ ] ,
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
'post'
] ,
resource : [
'message' ,
] ,
} ,
} ,
description : 'The ID of the channel to post to.' ,
} ,
{
displayName : 'Message' ,
name : 'message' ,
type : 'string' ,
typeOptions : {
alwaysOpenEditWindow : true ,
} ,
default : '' ,
displayOptions : {
show : {
operation : [
'post'
] ,
resource : [
'message' ,
] ,
} ,
} ,
description : 'The text to send.' ,
} ,
2019-10-21 15:12:35 -07:00
{
displayName : 'Attachments' ,
name : 'attachments' ,
type : 'collection' ,
typeOptions : {
multipleValues : true ,
multipleValueButtonText : 'Add attachment' ,
} ,
displayOptions : {
show : {
operation : [
'post'
] ,
resource : [
'message' ,
] ,
} ,
} ,
default : { } ,
description : 'The attachment to add' ,
placeholder : 'Add attachment item' ,
options : [
{
2020-04-14 08:46:56 -07:00
displayName : 'Actions' ,
name : 'actions' ,
placeholder : 'Add Actions' ,
2020-04-14 09:23:43 -07:00
description : 'Actions to add to message. More information can be found <a href="https://docs.mattermost.com/developer/interactive-messages.html" target="_blank">here</a>' ,
2020-04-14 08:46:56 -07:00
type : 'fixedCollection' ,
2019-10-21 15:12:35 -07:00
typeOptions : {
2020-04-14 08:46:56 -07:00
multipleValues : true ,
2019-10-21 15:12:35 -07:00
} ,
2020-04-14 08:46:56 -07:00
default : { } ,
options : [
{
displayName : 'Item' ,
name : 'item' ,
values : [
2020-04-14 09:23:43 -07:00
{
displayName : 'Type' ,
name : 'type' ,
type : 'options' ,
options : [
{
name : 'Button' ,
value : 'button' ,
} ,
{
name : 'Select' ,
value : 'select' ,
} ,
] ,
default : 'button' ,
description : 'The type of the action.' ,
} ,
{
displayName : 'Data Source' ,
name : 'data_source' ,
type : 'options' ,
displayOptions : {
show : {
type : [
'select'
] ,
} ,
} ,
options : [
{
name : 'Channels' ,
value : 'channels' ,
} ,
{
name : 'Custom' ,
value : 'custom' ,
} ,
{
name : 'Users' ,
value : 'users' ,
} ,
] ,
default : 'custom' ,
description : 'The type of the action.' ,
} ,
{
displayName : 'Options' ,
name : 'options' ,
placeholder : 'Add Option' ,
description : 'Adds a new option to select field.' ,
type : 'fixedCollection' ,
typeOptions : {
multipleValues : true ,
} ,
displayOptions : {
show : {
data_source : [
'custom'
] ,
2020-04-14 10:17:55 -07:00
type : [
'select'
] ,
2020-04-14 09:23:43 -07:00
} ,
} ,
default : { } ,
options : [
{
name : 'option' ,
displayName : 'Option' ,
default : { } ,
values : [
{
displayName : 'Option Text' ,
name : 'text' ,
type : 'string' ,
default : '' ,
description : 'Text of the option.' ,
} ,
{
displayName : 'Option Value' ,
name : 'value' ,
type : 'string' ,
default : '' ,
description : 'Value of the option.' ,
} ,
]
} ,
] ,
} ,
2020-04-14 08:46:56 -07:00
{
displayName : 'Name' ,
name : 'name' ,
type : 'string' ,
default : '' ,
description : 'Name of the Action.' ,
} ,
{
displayName : 'Integration' ,
name : 'integration' ,
placeholder : 'Add Integration' ,
description : 'Integration to add to message.' ,
type : 'fixedCollection' ,
typeOptions : {
multipleValues : false ,
} ,
default : { } ,
options : [
{
displayName : 'Item' ,
name : 'item' ,
default : { } ,
values : [
{
displayName : 'URL' ,
name : 'url' ,
type : 'string' ,
default : '' ,
description : 'URL of the Integration.' ,
} ,
{
displayName : 'Context' ,
name : 'context' ,
placeholder : 'Add Context to Integration' ,
description : 'Adds a Context values set.' ,
type : 'fixedCollection' ,
typeOptions : {
multipleValues : true ,
} ,
default : { } ,
options : [
{
name : 'property' ,
displayName : 'Property' ,
default : { } ,
values : [
{
displayName : 'Property Name' ,
name : 'name' ,
type : 'string' ,
default : '' ,
description : 'Name of the property to set.' ,
} ,
{
displayName : 'Property Value' ,
name : 'value' ,
type : 'string' ,
default : '' ,
description : 'Value of the property to set.' ,
} ,
]
} ,
] ,
} ,
]
} ,
] ,
} ,
]
} ,
] ,
2019-10-21 15:12:35 -07:00
} ,
{
2020-04-14 08:46:56 -07:00
displayName : 'Author Icon' ,
name : 'author_icon' ,
2019-10-21 15:12:35 -07:00
type : 'string' ,
typeOptions : {
alwaysOpenEditWindow : true ,
} ,
default : '' ,
2020-04-14 08:46:56 -07:00
description : 'Icon which should appear for the user.' ,
2019-10-21 15:12:35 -07:00
} ,
{
2020-04-14 08:46:56 -07:00
displayName : 'Author Link' ,
name : 'author_link' ,
2019-10-21 15:12:35 -07:00
type : 'string' ,
typeOptions : {
alwaysOpenEditWindow : true ,
} ,
default : '' ,
2020-04-14 08:46:56 -07:00
description : 'Link for the author.' ,
2019-10-21 15:12:35 -07:00
} ,
{
2020-04-14 08:46:56 -07:00
displayName : 'Author Name' ,
name : 'author_name' ,
2019-10-21 15:12:35 -07:00
type : 'string' ,
default : '' ,
2020-04-14 08:46:56 -07:00
description : 'Name that should appear.' ,
2019-10-21 15:12:35 -07:00
} ,
{
displayName : 'Color' ,
name : 'color' ,
type : 'color' ,
default : '#ff0000' ,
description : 'Color of the line left of text.' ,
} ,
{
2020-04-14 08:46:56 -07:00
displayName : 'Fallback Text' ,
name : 'fallback' ,
2019-10-21 15:12:35 -07:00
type : 'string' ,
typeOptions : {
alwaysOpenEditWindow : true ,
} ,
default : '' ,
2020-04-14 08:46:56 -07:00
description : 'Required plain-text summary of the attachment.' ,
2019-10-21 15:12:35 -07:00
} ,
{
2020-04-14 08:46:56 -07:00
displayName : 'Fields' ,
name : 'fields' ,
placeholder : 'Add Fields' ,
description : 'Fields to add to message.' ,
type : 'fixedCollection' ,
typeOptions : {
multipleValues : true ,
} ,
default : { } ,
options : [
{
name : 'item' ,
displayName : 'Item' ,
values : [
{
displayName : 'Title' ,
name : 'title' ,
type : 'string' ,
default : '' ,
description : 'Title of the item.' ,
} ,
{
displayName : 'Value' ,
name : 'value' ,
type : 'string' ,
default : '' ,
description : 'Value of the item.' ,
} ,
{
displayName : 'Short' ,
name : 'short' ,
type : 'boolean' ,
default : true ,
description : 'If items can be displayed next to each other.' ,
} ,
]
} ,
] ,
2019-10-21 15:12:35 -07:00
} ,
{
2020-04-14 08:46:56 -07:00
displayName : 'Footer' ,
name : 'footer' ,
2019-10-21 15:12:35 -07:00
type : 'string' ,
typeOptions : {
alwaysOpenEditWindow : true ,
} ,
default : '' ,
2020-04-14 08:46:56 -07:00
description : 'Text of footer to add.' ,
2019-10-21 15:12:35 -07:00
} ,
{
2020-04-14 08:46:56 -07:00
displayName : 'Footer Icon' ,
name : 'footer_icon' ,
2019-10-21 15:12:35 -07:00
type : 'string' ,
typeOptions : {
alwaysOpenEditWindow : true ,
} ,
default : '' ,
2020-04-14 08:46:56 -07:00
description : 'Icon which should appear next to footer.' ,
2019-10-21 15:12:35 -07:00
} ,
{
displayName : 'Image URL' ,
name : 'image_url' ,
type : 'string' ,
typeOptions : {
alwaysOpenEditWindow : true ,
} ,
default : '' ,
description : 'URL of image.' ,
} ,
{
2020-04-14 08:46:56 -07:00
displayName : 'Pretext' ,
name : 'pretext' ,
2019-10-21 15:12:35 -07:00
type : 'string' ,
typeOptions : {
alwaysOpenEditWindow : true ,
} ,
default : '' ,
2020-04-14 08:46:56 -07:00
description : 'Text which appears before the message block.' ,
2019-10-21 15:12:35 -07:00
} ,
{
2020-04-14 08:46:56 -07:00
displayName : 'Text' ,
name : 'text' ,
2019-10-21 15:12:35 -07:00
type : 'string' ,
typeOptions : {
alwaysOpenEditWindow : true ,
} ,
default : '' ,
2020-04-14 08:46:56 -07:00
description : 'Text to send.' ,
2019-10-21 15:12:35 -07:00
} ,
{
2020-04-14 08:46:56 -07:00
displayName : 'Thumbnail URL' ,
name : 'thumb_url' ,
2019-10-21 15:12:35 -07:00
type : 'string' ,
typeOptions : {
alwaysOpenEditWindow : true ,
} ,
default : '' ,
2020-04-14 08:46:56 -07:00
description : 'URL of thumbnail.' ,
2019-10-21 15:12:35 -07:00
} ,
2020-04-14 08:46:56 -07:00
{
displayName : 'Title' ,
name : 'title' ,
type : 'string' ,
2020-04-11 00:42:00 -07:00
typeOptions : {
2020-04-14 08:46:56 -07:00
alwaysOpenEditWindow : true ,
2020-04-11 00:42:00 -07:00
} ,
2020-04-14 08:46:56 -07:00
default : '' ,
description : 'Title of the message.' ,
2020-04-11 00:42:00 -07:00
} ,
2019-10-21 15:12:35 -07:00
{
2020-04-14 08:46:56 -07:00
displayName : 'Title Link' ,
name : 'title_link' ,
type : 'string' ,
2019-10-21 15:12:35 -07:00
typeOptions : {
2020-04-14 08:46:56 -07:00
alwaysOpenEditWindow : true ,
2019-10-21 15:12:35 -07:00
} ,
2020-04-14 08:46:56 -07:00
default : '' ,
description : 'Link of the title.' ,
} ,
2019-10-21 15:12:35 -07:00
] ,
} ,
{
displayName : 'Other Options' ,
name : 'otherOptions' ,
type : 'collection' ,
displayOptions : {
show : {
operation : [
'post'
] ,
resource : [
'message' ,
] ,
} ,
} ,
default : { } ,
description : 'Other options to set' ,
placeholder : 'Add options' ,
options : [
{
displayName : 'Make Comment' ,
name : 'root_id' ,
type : 'string' ,
default : '' ,
description : 'The post ID to comment on' ,
} ,
] ,
} ,
2019-12-04 12:57:56 -08:00
// ----------------------------------
// user
// ----------------------------------
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
displayOptions : {
show : {
resource : [
'user' ,
] ,
} ,
} ,
options : [
{
2020-01-17 05:06:11 -08:00
name : 'Deactive' ,
value : 'deactive' ,
2019-12-04 12:57:56 -08:00
description : 'Deactivates the user and revokes all its sessions by archiving its user object.' ,
} ,
2020-04-22 10:08:53 -07:00
{
name : 'Get All' ,
value : 'getAll' ,
description : 'Retrieve all users' ,
} ,
2020-04-23 23:14:19 -07:00
{
name : 'Get By Email' ,
value : 'getByEmail' ,
description : 'Get a user by email' ,
} ,
2019-12-04 12:57:56 -08:00
] ,
default : '' ,
description : 'The operation to perform.' ,
} ,
// ----------------------------------
2020-01-17 05:06:11 -08:00
// user:deactivate
2019-12-04 12:57:56 -08:00
// ----------------------------------
{
displayName : 'User ID' ,
name : 'userId' ,
type : 'string' ,
required : true ,
displayOptions : {
show : {
resource : [
'user' ,
] ,
operation : [
2020-01-17 05:06:11 -08:00
'deactive' ,
2019-12-04 12:57:56 -08:00
] ,
} ,
} ,
default : '' ,
description : 'User GUID'
} ,
2019-12-06 13:33:26 -08:00
2020-04-22 10:08:53 -07:00
// ----------------------------------
// user:getAll
// ----------------------------------
{
displayName : 'Return All' ,
name : 'returnAll' ,
type : 'boolean' ,
displayOptions : {
show : {
resource : [
'user' ,
] ,
operation : [
'getAll' ,
] ,
} ,
} ,
default : true ,
description : 'If all results should be returned or only up to a given limit.' ,
} ,
{
displayName : 'Limit' ,
name : 'limit' ,
type : 'number' ,
displayOptions : {
show : {
resource : [
'user' ,
] ,
operation : [
'getAll' ,
] ,
returnAll : [
false ,
] ,
} ,
} ,
typeOptions : {
minValue : 1 ,
maxValue : 100 ,
} ,
default : 100 ,
description : 'How many results to return.' ,
} ,
{
displayName : 'Additional Fields' ,
name : 'additionalFields' ,
type : 'collection' ,
placeholder : 'Add Field' ,
displayOptions : {
show : {
resource : [
'user' ,
] ,
operation : [
'getAll' ,
] ,
} ,
} ,
default : { } ,
options : [
{
displayName : 'In Channel' ,
name : 'inChannel' ,
type : 'string' ,
default : '' ,
description : 'The ID of the channel to get users for.' ,
} ,
{
displayName : 'In Team' ,
name : 'inTeam' ,
type : 'string' ,
default : '' ,
description : 'The ID of the team to get users for.' ,
} ,
{
displayName : 'Not In Team' ,
name : 'notInTeam' ,
type : 'string' ,
default : '' ,
description : 'The ID of the team to exclude users for.' ,
} ,
{
displayName : 'Not In Channel' ,
name : 'notInChannel' ,
type : 'string' ,
default : '' ,
description : 'The ID of the channel to exclude users for.' ,
} ,
{
displayName : 'Sort' ,
name : 'sort' ,
type : 'options' ,
options : [
{
name : 'Created At' ,
value : 'createdAt' ,
} ,
{
name : 'Last Activity At' ,
value : 'lastActivityAt' ,
} ,
{
name : 'Status' ,
value : 'status' ,
} ,
{
name : 'username' ,
value : 'username' ,
} ,
] ,
default : 'username' ,
description : 'The ID of the channel to exclude users for.' ,
} ,
] ,
} ,
2020-04-23 23:14:19 -07:00
// ----------------------------------
// user:getByEmail
// ----------------------------------
{
displayName : 'Email' ,
name : 'email' ,
type : 'string' ,
required : true ,
displayOptions : {
show : {
resource : [
'user' ,
] ,
operation : [
'getByEmail' ,
] ,
} ,
} ,
default : '' ,
description : ` User's email ` ,
} ,
2019-10-20 13:57:06 -07:00
] ,
} ;
methods = {
loadOptions : {
2020-01-09 18:05:57 -08:00
// Get all the available channels
2019-10-20 13:57:06 -07:00
async getChannels ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
const endpoint = 'channels' ;
const responseData = await apiRequest . call ( this , 'GET' , endpoint , { } ) ;
if ( responseData === undefined ) {
throw new Error ( 'No data got returned' ) ;
}
const returnData : INodePropertyOptions [ ] = [ ] ;
let name : string ;
for ( const data of responseData ) {
if ( data . delete_at !== 0 ) {
continue ;
}
name = ` ${ data . name } ( ${ data . type === 'O' ? 'public' : 'private' } ) ` ;
returnData . push ( {
name ,
value : data.id ,
} ) ;
}
return returnData ;
} ,
async getTeams ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
const endpoint = 'teams' ;
const responseData = await apiRequest . call ( this , 'GET' , endpoint , { } ) ;
if ( responseData === undefined ) {
throw new Error ( 'No data got returned' ) ;
}
const returnData : INodePropertyOptions [ ] = [ ] ;
let name : string ;
for ( const data of responseData ) {
if ( data . delete_at !== 0 ) {
continue ;
}
name = ` ${ data . display_name } ( ${ data . type === 'O' ? 'public' : 'private' } ) ` ;
returnData . push ( {
name ,
value : data.id ,
} ) ;
}
return returnData ;
} ,
async getUsers ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
const endpoint = 'users' ;
const responseData = await apiRequest . call ( this , 'GET' , endpoint , { } ) ;
if ( responseData === undefined ) {
throw new Error ( 'No data got returned' ) ;
}
const returnData : INodePropertyOptions [ ] = [ ] ;
for ( const data of responseData ) {
if ( data . delete_at !== 0 ) {
continue ;
}
returnData . push ( {
name : data.username ,
value : data.id ,
} ) ;
}
return returnData ;
} ,
} ,
} ;
async execute ( this : IExecuteFunctions ) : Promise < INodeExecutionData [ ] [ ] > {
const items = this . getInputData ( ) ;
const returnData : IDataObject [ ] = [ ] ;
const credentials = this . getCredentials ( 'mattermostApi' ) ;
if ( credentials === undefined ) {
throw new Error ( 'No credentials got returned!' ) ;
}
let operation : string ;
let resource : string ;
let requestMethod = 'POST' ;
2020-04-22 10:08:53 -07:00
let returnAll = false ;
2019-10-20 13:57:06 -07:00
// For Post
let body : IDataObject ;
// For Query string
let qs : IDataObject ;
for ( let i = 0 ; i < items . length ; i ++ ) {
let endpoint = '' ;
body = { } ;
qs = { } ;
resource = this . getNodeParameter ( 'resource' , i ) as string ;
operation = this . getNodeParameter ( 'operation' , i ) as string ;
if ( resource === 'channel' ) {
if ( operation === 'create' ) {
// ----------------------------------
// channel:create
// ----------------------------------
requestMethod = 'POST' ;
endpoint = 'channels' ;
body . team_id = this . getNodeParameter ( 'teamId' , i ) as string ;
2020-04-22 10:08:53 -07:00
body . display_name = this . getNodeParameter ( 'displayName' , i ) as string ;
2019-10-20 13:57:06 -07:00
body . name = this . getNodeParameter ( 'channel' , i ) as string ;
2019-10-21 15:12:35 -07:00
const type = this . getNodeParameter ( 'type' , i ) as string ;
body . type = type === 'public' ? 'O' : 'P' ;
2019-10-20 13:57:06 -07:00
2020-01-09 18:05:57 -08:00
} else if ( operation === 'delete' ) {
// ----------------------------------
// channel:delete
// ----------------------------------
requestMethod = 'DELETE' ;
const channelId = this . getNodeParameter ( 'channelId' , i ) as string ;
endpoint = ` channels/ ${ channelId } ` ;
} else if ( operation === 'restore' ) {
// ----------------------------------
// channel:restore
// ----------------------------------
requestMethod = 'POST' ;
const channelId = this . getNodeParameter ( 'channelId' , i ) as string ;
endpoint = ` channels/ ${ channelId } /restore ` ;
2019-10-20 13:57:06 -07:00
} else if ( operation === 'addUser' ) {
// ----------------------------------
// channel:addUser
// ----------------------------------
requestMethod = 'POST' ;
const channelId = this . getNodeParameter ( 'channelId' , i ) as string ;
body . user_id = this . getNodeParameter ( 'userId' , i ) as string ;
endpoint = ` channels/ ${ channelId } /members ` ;
2019-12-04 12:57:56 -08:00
} else if ( operation === 'statistics' ) {
// ----------------------------------
// channel:statistics
// ----------------------------------
requestMethod = 'GET' ;
const channelId = this . getNodeParameter ( 'channelId' , i ) as string ;
endpoint = ` channels/ ${ channelId } /stats ` ;
2019-10-20 13:57:06 -07:00
}
} else if ( resource === 'message' ) {
2019-12-06 13:33:26 -08:00
if ( operation === 'delete' ) {
// ----------------------------------
// message:delete
// ----------------------------------
const postId = this . getNodeParameter ( 'postId' , i ) as string ;
requestMethod = 'DELETE' ;
endpoint = ` posts/ ${ postId } ` ;
} else if ( operation === 'post' ) {
2019-10-20 13:57:06 -07:00
// ----------------------------------
// message:post
// ----------------------------------
requestMethod = 'POST' ;
endpoint = 'posts' ;
body . channel_id = this . getNodeParameter ( 'channelId' , i ) as string ;
body . message = this . getNodeParameter ( 'message' , i ) as string ;
2019-10-21 15:12:35 -07:00
const attachments = this . getNodeParameter ( 'attachments' , i , [ ] ) as unknown as IAttachment [ ] ;
2020-04-13 14:14:16 -07:00
2019-10-21 15:12:35 -07:00
// The node does save the fields data differently than the API
// expects so fix the data befre we send the request
for ( const attachment of attachments ) {
if ( attachment . fields !== undefined ) {
if ( attachment . fields . item !== undefined ) {
// Move the field-content up
// @ts-ignore
attachment . fields = attachment . fields . item ;
} else {
// If it does not have any items set remove it
delete attachment . fields ;
}
2020-04-11 04:49:12 -07:00
}
}
for ( const attachment of attachments ) {
2020-04-11 04:07:37 -07:00
if ( attachment . actions !== undefined ) {
if ( attachment . actions . item !== undefined ) {
// Move the field-content up
// @ts-ignore
attachment . actions = attachment . actions . item ;
} else {
// If it does not have any items set remove it
delete attachment . actions ;
}
2020-04-11 04:49:12 -07:00
}
2020-04-13 14:14:16 -07:00
}
2020-04-14 08:46:56 -07:00
for ( const attachment of attachments ) {
if ( Array . isArray ( attachment . actions ) ) {
for ( const attaction of attachment . actions ) {
2020-04-14 09:23:43 -07:00
if ( attaction . type === 'button' ) {
delete attaction . type ;
}
if ( attaction . data_source === 'custom' ) {
delete attaction . data_source ;
}
if ( attaction . options ) {
attaction . options = attaction . options . option ;
}
2020-04-14 08:46:56 -07:00
if ( attaction . integration . item !== undefined ) {
attaction . integration = attaction . integration . item ;
if ( Array . isArray ( attaction . integration . context . property ) ) {
const tmpcontex = { } ;
for ( const attactionintegprop of attaction . integration . context . property ) {
Object . assign ( tmpcontex , { [ attactionintegprop . name ] : attactionintegprop . value } ) ;
}
delete attaction . integration . context ;
attaction . integration . context = tmpcontex ;
}
}
2020-04-13 14:14:16 -07:00
}
2020-04-14 08:46:56 -07:00
}
}
2020-04-12 09:48:01 -07:00
2019-10-21 15:12:35 -07:00
body . props = {
2020-04-12 12:21:48 -07:00
attachments ,
2019-10-21 15:12:35 -07:00
} ;
// Add all the other options to the request
const otherOptions = this . getNodeParameter ( 'otherOptions' , i ) as IDataObject ;
Object . assign ( body , otherOptions ) ;
2019-10-20 13:57:06 -07:00
}
2019-12-04 12:57:56 -08:00
} else if ( resource === 'user' ) {
2020-01-17 05:26:59 -08:00
// TODO: Remove the "deactive" again in the future. In here temporary
// to not break workflows for people which set the option before
// typo got fixed. JO 2020-01-17
if ( operation === 'deactive' || operation === 'desactive' ) {
2019-12-04 12:57:56 -08:00
// ----------------------------------
2020-01-17 05:26:59 -08:00
// user:deactive
2019-12-04 12:57:56 -08:00
// ----------------------------------
const userId = this . getNodeParameter ( 'userId' , i ) as string ;
requestMethod = 'DELETE' ;
endpoint = ` users/ ${ userId } ` ;
}
2020-04-22 10:08:53 -07:00
if ( operation === 'getAll' ) {
// ----------------------------------
// user:getAll
// ----------------------------------
requestMethod = 'GET' ;
returnAll = this . getNodeParameter ( 'returnAll' , i ) as boolean ;
const additionalFields = this . getNodeParameter ( 'additionalFields' , i ) as IDataObject ;
if ( additionalFields . inTeam ) {
qs . in_team = additionalFields . inTeam ;
}
if ( additionalFields . notInTeam ) {
qs . not_in_team = additionalFields . notInTeam ;
}
if ( additionalFields . inChannel ) {
qs . in_channel = additionalFields . inChannel ;
}
if ( additionalFields . notInChannel ) {
qs . not_in_channel = additionalFields . notInChannel ;
}
if ( additionalFields . sort ) {
qs . sort = snakeCase ( additionalFields . sort as string ) ;
}
const validRules = {
inTeam : [ 'last_activity_at' , 'created_at' , 'username' ] ,
inChannel : [ 'status' , 'username' ] ,
} ;
if ( additionalFields . sort ) {
if ( additionalFields . inTeam !== undefined || additionalFields . inChannel !== undefined ) {
if ( additionalFields . inTeam !== undefined
&& ! validRules . inTeam . includes ( snakeCase ( additionalFields . sort as string ) ) ) {
throw new Error ( ` When In Team is set the only valid values for sorting are ${ validRules . inTeam . join ( ',' ) } ` ) ;
}
if ( additionalFields . inChannel !== undefined
&& ! validRules . inChannel . includes ( snakeCase ( additionalFields . sort as string ) ) ) {
throw new Error ( ` When In Channel is set the only valid values for sorting are ${ validRules . inChannel . join ( ',' ) } ` ) ;
}
if ( additionalFields . inChannel !== undefined
&& additionalFields . inChannel === ''
&& additionalFields . sort !== 'username' ) {
throw new Error ( 'When sort is different than username In Channel must be set' ) ;
}
if ( additionalFields . inTeam !== undefined
&& additionalFields . inTeam === ''
&& additionalFields . sort !== 'username' ) {
throw new Error ( 'When sort is different than username In Team must be set' ) ;
}
} else {
throw new Error ( ` When sort is defined either 'in team' or 'in channel' must be defined ` ) ;
}
}
if ( additionalFields . sort === 'username' ) {
qs . sort = '' ;
}
if ( returnAll === false ) {
qs . limit = this . getNodeParameter ( 'limit' , i ) as number ;
}
endpoint = ` /users ` ;
}
2020-04-23 23:14:19 -07:00
if ( operation === 'getByEmail' ) {
// ----------------------------------
// user:getByEmail
// ----------------------------------
const email = this . getNodeParameter ( 'email' , i ) as string ;
requestMethod = 'GET' ;
endpoint = ` users/email/ ${ email } ` ;
}
2019-12-04 12:57:56 -08:00
}
else {
2019-10-20 13:57:06 -07:00
throw new Error ( ` The resource " ${ resource } " is not known! ` ) ;
}
2020-04-22 10:08:53 -07:00
let responseData ;
if ( returnAll ) {
responseData = await apiRequestAllItems . call ( this , requestMethod , endpoint , body , qs ) ;
} else {
responseData = await apiRequest . call ( this , requestMethod , endpoint , body , qs ) ;
}
if ( Array . isArray ( responseData ) ) {
returnData . push . apply ( returnData , responseData ) ;
} else {
returnData . push ( responseData ) ;
}
2019-10-20 13:57:06 -07:00
}
return [ this . helpers . returnJsonArray ( returnData ) ] ;
}
}