mirror of
https://github.com/n8n-io/n8n.git
synced 2024-12-24 04:04:06 -08:00
✨ Add Mattermost reactions and ephemeral message (#1552)
* Replace PNG icon with SVG icon * Add reaction resource and operations * ⚡ Finalize reactions and add postEphemeral * ⚡ Improvements Co-authored-by: ricardo <ricardoespinoza105@gmail.com>
This commit is contained in:
parent
00e7edea85
commit
68c14979d3
|
@ -25,7 +25,7 @@ export class Mattermost implements INodeType {
|
||||||
description: INodeTypeDescription = {
|
description: INodeTypeDescription = {
|
||||||
displayName: 'Mattermost',
|
displayName: 'Mattermost',
|
||||||
name: 'mattermost',
|
name: 'mattermost',
|
||||||
icon: 'file:mattermost.png',
|
icon: 'file:mattermost.svg',
|
||||||
group: ['output'],
|
group: ['output'],
|
||||||
version: 1,
|
version: 1,
|
||||||
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
||||||
|
@ -56,6 +56,10 @@ export class Mattermost implements INodeType {
|
||||||
name: 'Message',
|
name: 'Message',
|
||||||
value: 'message',
|
value: 'message',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'Reaction',
|
||||||
|
value: 'reaction',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'User',
|
name: 'User',
|
||||||
value: 'user',
|
value: 'user',
|
||||||
|
@ -138,10 +142,46 @@ export class Mattermost implements INodeType {
|
||||||
value: 'post',
|
value: 'post',
|
||||||
description: 'Post a message into a channel',
|
description: 'Post a message into a channel',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'Post Ephemeral',
|
||||||
|
value: 'postEphemeral',
|
||||||
|
description: 'Post an ephemeral message into a channel',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
default: 'post',
|
default: 'post',
|
||||||
description: 'The operation to perform',
|
description: 'The operation to perform',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Operation',
|
||||||
|
name: 'operation',
|
||||||
|
type: 'options',
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
resource: [
|
||||||
|
'reaction',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'Create',
|
||||||
|
value: 'create',
|
||||||
|
description: 'Add a reaction to a post.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Delete',
|
||||||
|
value: 'delete',
|
||||||
|
description: 'Remove a reaction from a post',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Get All',
|
||||||
|
value: 'getAll',
|
||||||
|
description: 'Get all the reactions to one or more posts',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
default: 'create',
|
||||||
|
description: 'The operation to perform',
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -910,6 +950,73 @@ export class Mattermost implements INodeType {
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// ----------------------------------
|
||||||
|
// message:post (ephemeral)
|
||||||
|
// ----------------------------------
|
||||||
|
{
|
||||||
|
displayName: 'User ID',
|
||||||
|
name: 'userId',
|
||||||
|
type: 'options',
|
||||||
|
typeOptions: {
|
||||||
|
loadOptionsMethod: 'getUsers',
|
||||||
|
},
|
||||||
|
options: [],
|
||||||
|
default: '',
|
||||||
|
required: true,
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
operation: [
|
||||||
|
'postEphemeral',
|
||||||
|
],
|
||||||
|
resource: [
|
||||||
|
'message',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
description: 'ID of the user to send the ephemeral message to.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Channel ID',
|
||||||
|
name: 'channelId',
|
||||||
|
type: 'options',
|
||||||
|
typeOptions: {
|
||||||
|
loadOptionsMethod: 'getChannels',
|
||||||
|
},
|
||||||
|
default: '',
|
||||||
|
required: true,
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
operation: [
|
||||||
|
'postEphemeral',
|
||||||
|
],
|
||||||
|
resource: [
|
||||||
|
'message',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
description: 'ID of the channel to send the ephemeral message in.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Message',
|
||||||
|
name: 'message',
|
||||||
|
type: 'string',
|
||||||
|
typeOptions: {
|
||||||
|
alwaysOpenEditWindow: true,
|
||||||
|
},
|
||||||
|
default: '',
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
operation: [
|
||||||
|
'postEphemeral',
|
||||||
|
],
|
||||||
|
resource: [
|
||||||
|
'message',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
description: 'Text to send in the ephemeral message.',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
displayName: 'Other Options',
|
displayName: 'Other Options',
|
||||||
name: 'otherOptions',
|
name: 'otherOptions',
|
||||||
|
@ -937,6 +1044,188 @@ export class Mattermost implements INodeType {
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// ----------------------------------
|
||||||
|
// reaction
|
||||||
|
// ----------------------------------
|
||||||
|
{
|
||||||
|
displayName: 'User ID',
|
||||||
|
name: 'userId',
|
||||||
|
type: 'options',
|
||||||
|
typeOptions: {
|
||||||
|
loadOptionsMethod: 'getUsers',
|
||||||
|
},
|
||||||
|
options: [],
|
||||||
|
default: '',
|
||||||
|
required: true,
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
resource: [
|
||||||
|
'reaction',
|
||||||
|
],
|
||||||
|
operation: [
|
||||||
|
'create',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
description: 'ID of the user sending the reaction.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Post ID',
|
||||||
|
name: 'postId',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
placeholder: '3moacfqxmbdw38r38fjprh6zsr',
|
||||||
|
required: true,
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
resource: [
|
||||||
|
'reaction',
|
||||||
|
],
|
||||||
|
operation: [
|
||||||
|
'create',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
description: 'ID of the post to react to.<br>Obtainable from the post link:<br><code>https://mattermost.internal.n8n.io/[server]/pl/[postId]</code>',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Emoji Name',
|
||||||
|
name: 'emojiName',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
required: true,
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
resource: [
|
||||||
|
'reaction',
|
||||||
|
],
|
||||||
|
operation: [
|
||||||
|
'create',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
description: 'Emoji to use for this reaction.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'User ID',
|
||||||
|
name: 'userId',
|
||||||
|
type: 'options',
|
||||||
|
typeOptions: {
|
||||||
|
loadOptionsMethod: 'getUsers',
|
||||||
|
},
|
||||||
|
options: [],
|
||||||
|
default: '',
|
||||||
|
required: true,
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
resource: [
|
||||||
|
'reaction',
|
||||||
|
],
|
||||||
|
operation: [
|
||||||
|
'delete',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
description: 'ID of the user whose reaction to delete.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Post ID',
|
||||||
|
name: 'postId',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
placeholder: '3moacfqxmbdw38r38fjprh6zsr',
|
||||||
|
required: true,
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
resource: [
|
||||||
|
'reaction',
|
||||||
|
],
|
||||||
|
operation: [
|
||||||
|
'delete',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
description: 'ID of the post whose reaction to delete.<br>Obtainable from the post link:<br><code>https://mattermost.internal.n8n.io/[server]/pl/[postId]</code>',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Emoji Name',
|
||||||
|
name: 'emojiName',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
required: true,
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
resource: [
|
||||||
|
'reaction',
|
||||||
|
],
|
||||||
|
operation: [
|
||||||
|
'delete',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
description: 'Name of the emoji to delete.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Post ID',
|
||||||
|
name: 'postId',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
required: true,
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
resource: [
|
||||||
|
'reaction',
|
||||||
|
],
|
||||||
|
operation: [
|
||||||
|
'getAll',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
description: 'One or more (comma-separated) posts to retrieve reactions from.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Return All',
|
||||||
|
name: 'returnAll',
|
||||||
|
type: 'boolean',
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
operation: [
|
||||||
|
'getAll',
|
||||||
|
],
|
||||||
|
resource: [
|
||||||
|
'reaction',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
default: true,
|
||||||
|
description: 'If all results should be returned or only up to a given limit.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Limit',
|
||||||
|
name: 'limit',
|
||||||
|
type: 'number',
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
operation: [
|
||||||
|
'getAll',
|
||||||
|
],
|
||||||
|
resource: [
|
||||||
|
'reaction',
|
||||||
|
],
|
||||||
|
returnAll: [
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
typeOptions: {
|
||||||
|
minValue: 1,
|
||||||
|
maxValue: 100,
|
||||||
|
},
|
||||||
|
default: 100,
|
||||||
|
description: 'How many results to return.',
|
||||||
|
},
|
||||||
|
|
||||||
// ----------------------------------
|
// ----------------------------------
|
||||||
// user
|
// user
|
||||||
// ----------------------------------
|
// ----------------------------------
|
||||||
|
@ -1830,7 +2119,79 @@ export class Mattermost implements INodeType {
|
||||||
// Add all the other options to the request
|
// Add all the other options to the request
|
||||||
const otherOptions = this.getNodeParameter('otherOptions', i) as IDataObject;
|
const otherOptions = this.getNodeParameter('otherOptions', i) as IDataObject;
|
||||||
Object.assign(body, otherOptions);
|
Object.assign(body, otherOptions);
|
||||||
|
|
||||||
|
} else if (operation === 'postEphemeral') {
|
||||||
|
|
||||||
|
// ----------------------------------
|
||||||
|
// message:post (ephemeral)
|
||||||
|
// ----------------------------------
|
||||||
|
|
||||||
|
// https://api.mattermost.com/#tag/posts/paths/~1posts~1ephemeral/post
|
||||||
|
|
||||||
|
body = {
|
||||||
|
user_id: this.getNodeParameter('userId', i),
|
||||||
|
post: {
|
||||||
|
channel_id: this.getNodeParameter('channelId', i),
|
||||||
|
message: this.getNodeParameter('message', i),
|
||||||
|
},
|
||||||
|
} as IDataObject;
|
||||||
|
|
||||||
|
requestMethod = 'POST';
|
||||||
|
endpoint = 'posts/ephemeral';
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else if (resource === 'reaction') {
|
||||||
|
|
||||||
|
// ----------------------------------
|
||||||
|
// reaction:create
|
||||||
|
// ----------------------------------
|
||||||
|
|
||||||
|
// https://api.mattermost.com/#tag/reactions/paths/~1reactions/post
|
||||||
|
|
||||||
|
if (operation === 'create') {
|
||||||
|
|
||||||
|
body = {
|
||||||
|
user_id: this.getNodeParameter('userId', i),
|
||||||
|
post_id: this.getNodeParameter('postId', i),
|
||||||
|
emoji_name: (this.getNodeParameter('emojiName', i) as string).replace(/:/g, ''),
|
||||||
|
create_at: Date.now(),
|
||||||
|
} as { user_id: string; post_id: string; emoji_name: string; create_at: number };
|
||||||
|
|
||||||
|
requestMethod = 'POST';
|
||||||
|
endpoint = 'reactions';
|
||||||
|
|
||||||
|
} else if (operation === 'delete') {
|
||||||
|
|
||||||
|
// ----------------------------------
|
||||||
|
// reaction:delete
|
||||||
|
// ----------------------------------
|
||||||
|
|
||||||
|
// https://api.mattermost.com/#tag/reactions/paths/~1users~1{user_id}~1posts~1{post_id}~1reactions~1{emoji_name}/delete
|
||||||
|
|
||||||
|
const userId = this.getNodeParameter('userId', i) as string;
|
||||||
|
const postId = this.getNodeParameter('postId', i) as string;
|
||||||
|
const emojiName = (this.getNodeParameter('emojiName', i) as string).replace(/:/g, '');
|
||||||
|
|
||||||
|
requestMethod = 'DELETE';
|
||||||
|
endpoint = `users/${userId}/posts/${postId}/reactions/${emojiName}`;
|
||||||
|
|
||||||
|
} else if (operation === 'getAll') {
|
||||||
|
|
||||||
|
// ----------------------------------
|
||||||
|
// reaction:getAll
|
||||||
|
// ----------------------------------
|
||||||
|
|
||||||
|
// https://api.mattermost.com/#tag/reactions/paths/~1posts~1ids~1reactions/post
|
||||||
|
|
||||||
|
const postId = this.getNodeParameter('postId', i) as string;
|
||||||
|
|
||||||
|
requestMethod = 'GET';
|
||||||
|
endpoint = `posts/${postId}/reactions`;
|
||||||
|
|
||||||
|
qs.limit = this.getNodeParameter('limit', 0, 0) as number;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (resource === 'user') {
|
} else if (resource === 'user') {
|
||||||
|
|
||||||
if (operation === 'create') {
|
if (operation === 'create') {
|
||||||
|
@ -2006,6 +2367,9 @@ export class Mattermost implements INodeType {
|
||||||
responseData = await apiRequestAllItems.call(this, requestMethod, endpoint, body, qs);
|
responseData = await apiRequestAllItems.call(this, requestMethod, endpoint, body, qs);
|
||||||
} else {
|
} else {
|
||||||
responseData = await apiRequest.call(this, requestMethod, endpoint, body, qs);
|
responseData = await apiRequest.call(this, requestMethod, endpoint, body, qs);
|
||||||
|
if (qs.limit) {
|
||||||
|
responseData = responseData.slice(0, qs.limit);
|
||||||
|
}
|
||||||
if (resource === 'channel' && operation === 'members') {
|
if (resource === 'channel' && operation === 'members') {
|
||||||
const resolveData = this.getNodeParameter('resolveData', i) as boolean;
|
const resolveData = this.getNodeParameter('resolveData', i) as boolean;
|
||||||
if (resolveData) {
|
if (resolveData) {
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 814 B |
1
packages/nodes-base/nodes/Mattermost/mattermost.svg
Normal file
1
packages/nodes-base/nodes/Mattermost/mattermost.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 8.9 KiB |
Loading…
Reference in a new issue