diff --git a/packages/backend/src/apps/slack/index.ts b/packages/backend/src/apps/slack/index.ts index d5f88efe..ab42e253 100644 --- a/packages/backend/src/apps/slack/index.ts +++ b/packages/backend/src/apps/slack/index.ts @@ -5,11 +5,13 @@ import { IJSONObject, } from '@automatisch/types'; import Authentication from './authentication'; +import Triggers from './triggers'; import Actions from './actions'; import Data from './data'; export default class Slack implements IService { authenticationClient: IAuthentication; + triggers: Triggers; actions: Actions; data: Data; @@ -20,6 +22,7 @@ export default class Slack implements IService { ) { this.authenticationClient = new Authentication(appData, connectionData); this.data = new Data(connectionData); + this.triggers = new Triggers(connectionData, parameters); this.actions = new Actions(connectionData, parameters); } } diff --git a/packages/backend/src/apps/slack/info.json b/packages/backend/src/apps/slack/info.json index 2f91909d..b93d5c8f 100644 --- a/packages/backend/src/apps/slack/info.json +++ b/packages/backend/src/apps/slack/info.json @@ -97,6 +97,65 @@ ] } ], + "triggers": [ + { + "name": "New message posted to a channel", + "key": "newMessageToChannel", + "description": "Triggers when a new message is posted to a channel", + "substeps": [ + { + "key": "chooseAccount", + "name": "Choose account" + }, + { + "key": "chooseTrigger", + "name": "Set up a trigger", + "arguments": [ + { + "label": "Channel", + "key": "channel", + "type": "dropdown", + "required": true, + "variables": false, + "source": { + "type": "query", + "name": "getData", + "arguments": [ + { + "name": "key", + "value": "listChannels" + } + ] + } + }, + { + "label": "Trigger for Bot Messages?", + "key": "triggerForBotMessages", + "type": "dropdown", + "description": "Should this flow trigger for bot messages?", + "required": true, + "value": true, + "variables": false, + "options": [ + { + "label": "Yes", + "value": true + }, + { + "label": "No", + "value": false + } + ] + } + ] + }, + { + "key": "testStep", + "name": "Test trigger" + } + ] + } + ], "actions": [ { "name": "Send a message to channel", diff --git a/packages/backend/src/apps/slack/triggers.ts b/packages/backend/src/apps/slack/triggers.ts new file mode 100644 index 00000000..8e5862e8 --- /dev/null +++ b/packages/backend/src/apps/slack/triggers.ts @@ -0,0 +1,13 @@ +import { IJSONObject } from '@automatisch/types'; +import NewMessageToChannel from './triggers/new-message-to-channel'; + +export default class Triggers { + newMessageToChannel: NewMessageToChannel; + + constructor(connectionData: IJSONObject, parameters: IJSONObject) { + this.newMessageToChannel = new NewMessageToChannel( + connectionData, + parameters + ); + } +} diff --git a/packages/backend/src/apps/slack/triggers/new-message-to-channel.ts b/packages/backend/src/apps/slack/triggers/new-message-to-channel.ts new file mode 100644 index 00000000..af32c0d7 --- /dev/null +++ b/packages/backend/src/apps/slack/triggers/new-message-to-channel.ts @@ -0,0 +1,47 @@ +import { IJSONObject } from '@automatisch/types'; +import axios, { AxiosInstance } from 'axios'; + +export default class NewMessageToChannel { + httpClient: AxiosInstance; + parameters: IJSONObject; + connectionData: IJSONObject; + BASE_URL = 'https://slack.com/api'; + + constructor(connectionData: IJSONObject, parameters: IJSONObject) { + this.httpClient = axios.create({ baseURL: this.BASE_URL }); + this.connectionData = connectionData; + this.parameters = parameters; + } + + async run() { + // TODO: Fix after webhook implementation. + } + + async testRun() { + const headers = { + Authorization: `Bearer ${this.connectionData.accessToken}`, + }; + + const params = { + channel: this.parameters.channel, + }; + + const response = await this.httpClient.get('/conversations.history', { + headers, + params, + }); + + let lastMessage; + + if (this.parameters.triggerForBotMessages) { + lastMessage = response.data.messages[0]; + } else { + lastMessage = response.data.messages.find( + (message: IJSONObject) => + !Object.prototype.hasOwnProperty.call(message, 'bot_id') + ); + } + + return [lastMessage]; + } +}