From 2862953136994082950550639d22c3dedbb6a668 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 7 Oct 2022 14:00:58 +0300 Subject: [PATCH] refactor: Redesign list channels for the slack actions --- .../apps/slack/data/list-channels/index.ts | 36 +++++++++++++++++++ .../graphql/mutations/update-flow-status.ts | 2 +- .../backend/src/graphql/queries/get-data.ts | 13 ++++--- packages/backend/src/helpers/get-app.ts | 35 +++++++++++++----- 4 files changed, 72 insertions(+), 14 deletions(-) create mode 100644 packages/backend/src/apps/slack/data/list-channels/index.ts diff --git a/packages/backend/src/apps/slack/data/list-channels/index.ts b/packages/backend/src/apps/slack/data/list-channels/index.ts new file mode 100644 index 00000000..75e5ce9c --- /dev/null +++ b/packages/backend/src/apps/slack/data/list-channels/index.ts @@ -0,0 +1,36 @@ +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; + +export default { + name: 'List channels', + key: 'listChannels', + + async run($: IGlobalVariable) { + const channels: { + data: IJSONObject[]; + error: IJSONObject | null; + } = { + data: [], + error: null, + }; + + const response = await $.http.get('/conversations.list', { + headers: { + Authorization: `Bearer ${$.auth.data.accessToken}`, + }, + }); + + if (response.integrationError || response.data.ok === 'false') { + channels.error = response.integrationError; + return channels; + } + + channels.data = response.data.channels.map((channel: IJSONObject) => { + return { + value: channel.id, + name: channel.name, + }; + }); + + return channels; + }, +}; diff --git a/packages/backend/src/graphql/mutations/update-flow-status.ts b/packages/backend/src/graphql/mutations/update-flow-status.ts index 467f9c27..5e0e0297 100644 --- a/packages/backend/src/graphql/mutations/update-flow-status.ts +++ b/packages/backend/src/graphql/mutations/update-flow-status.ts @@ -33,7 +33,7 @@ const updateFlowStatus = async ( const triggerStep = await flow.getTriggerStep(); const trigger = await triggerStep.getTrigger(); - const interval = trigger.getInterval(triggerStep.parameters); + const interval = trigger?.getInterval(triggerStep.parameters); const repeatOptions = { cron: interval || EVERY_15_MINUTES_CRON, }; diff --git a/packages/backend/src/graphql/queries/get-data.ts b/packages/backend/src/graphql/queries/get-data.ts index d30acbe0..5b158869 100644 --- a/packages/backend/src/graphql/queries/get-data.ts +++ b/packages/backend/src/graphql/queries/get-data.ts @@ -1,4 +1,4 @@ -import { IJSONObject } from '@automatisch/types'; +import { IData, IJSONObject } from '@automatisch/types'; import Context from '../../types/express/context'; import App from '../../models/app'; import globalVariable from '../../helpers/global-variable'; @@ -25,12 +25,17 @@ const getData = async (_parent: unknown, params: Params, context: Context) => { if (!connection || !step.appKey) return null; const app = await App.findOneByKey(step.appKey); - const $ = await globalVariable(connection, app, step.flow, step) + const $ = await globalVariable(connection, app, step.flow, step); + + const command = app.data.find((data: IData) => data.key === params.key); - const command = app.data[params.key]; const fetchedData = await command.run($); - return fetchedData; + if (fetchedData.error) { + throw new Error(JSON.stringify(fetchedData.error)); + } + + return fetchedData.data; }; export default getData; diff --git a/packages/backend/src/helpers/get-app.ts b/packages/backend/src/helpers/get-app.ts index 38a72577..75913c45 100644 --- a/packages/backend/src/helpers/get-app.ts +++ b/packages/backend/src/helpers/get-app.ts @@ -1,6 +1,6 @@ import fs from 'fs'; import { join } from 'path'; -import { IApp, IAuth, IAction, ITrigger } from '@automatisch/types'; +import { IApp, IAuth, IAction, ITrigger, IData } from '@automatisch/types'; const appsPath = join(__dirname, '../apps'); @@ -9,12 +9,13 @@ async function getDefaultExport(path: string) { } function stripFunctions(data: C): C { - return JSON.parse( - JSON.stringify(data) - ); + return JSON.parse(JSON.stringify(data)); } -async function getFileContent(path: string, stripFuncs: boolean): Promise { +async function getFileContent( + path: string, + stripFuncs: boolean +): Promise { try { const fileContent = await getDefaultExport(path); @@ -28,7 +29,10 @@ async function getFileContent(path: string, stripFuncs: boolean): Promise } } -async function getChildrenContentInDirectory(path: string, stripFuncs: boolean): Promise { +async function getChildrenContentInDirectory( + path: string, + stripFuncs: boolean +): Promise { const appSubdirectory = join(appsPath, path); const childrenContent = []; @@ -51,9 +55,22 @@ async function getChildrenContentInDirectory(path: string, stripFuncs: boolea const getApp = async (appKey: string, stripFuncs = true) => { const appData: IApp = await getDefaultExport(`../apps/${appKey}`); - appData.auth = await getFileContent(`../apps/${appKey}/auth/index.ts`, stripFuncs); - appData.triggers = await getChildrenContentInDirectory(`${appKey}/triggers`, stripFuncs); - appData.actions = await getChildrenContentInDirectory(`${appKey}/actions`, stripFuncs); + appData.auth = await getFileContent( + `../apps/${appKey}/auth/index.ts`, + stripFuncs + ); + appData.triggers = await getChildrenContentInDirectory( + `${appKey}/triggers`, + stripFuncs + ); + appData.actions = await getChildrenContentInDirectory( + `${appKey}/actions`, + stripFuncs + ); + appData.data = await getChildrenContentInDirectory( + `${appKey}/data`, + stripFuncs + ); return appData; };