From 11ef2ac4bc86c45edde9b6cd205bc2df3118e269 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 7 Oct 2022 16:05:13 +0300 Subject: [PATCH] fix: Integration and auth problems wrt slack and twitter --- .../actions/find-message/find-message.ts | 23 ++++--- .../apps/slack/data/list-channels/index.ts | 7 ++- .../src/graphql/mutations/create-auth-data.ts | 2 +- packages/backend/src/graphql/schema.graphql | 10 +++- .../backend/src/helpers/app-info-converter.ts | 20 ++++--- packages/backend/src/models/app.ts | 14 ++--- packages/web/src/graphql/queries/get-app.ts | 58 +++++++++--------- packages/web/src/graphql/queries/get-apps.ts | 60 ++++++++++--------- 8 files changed, 104 insertions(+), 90 deletions(-) diff --git a/packages/backend/src/apps/slack/actions/find-message/find-message.ts b/packages/backend/src/apps/slack/actions/find-message/find-message.ts index d6d55409..57c93041 100644 --- a/packages/backend/src/apps/slack/actions/find-message/find-message.ts +++ b/packages/backend/src/apps/slack/actions/find-message/find-message.ts @@ -1,4 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; type FindMessageOptions = { query: string; @@ -8,6 +8,11 @@ type FindMessageOptions = { }; const findMessage = async ($: IGlobalVariable, options: FindMessageOptions) => { + const message: { + data?: IJSONObject; + error?: IJSONObject; + } = {}; + const headers = { Authorization: `Bearer ${$.auth.data.accessToken}`, }; @@ -24,20 +29,20 @@ const findMessage = async ($: IGlobalVariable, options: FindMessageOptions) => { params, }); + if (response.integrationError) { + message.error = response.integrationError; + return message; + } + const data = response.data; if (!data.ok) { - if (data.error === 'missing_scope') { - throw new Error( - `Error occured while finding messages; ${data.error}: ${data.needed}` - ); - } - - throw new Error(`Error occured while finding messages; ${data.error}`); + message.error = data; + return message; } const messages = data.messages.matches; - const message = messages?.[0]; + message.data = messages?.[0]; return message; }; diff --git a/packages/backend/src/apps/slack/data/list-channels/index.ts b/packages/backend/src/apps/slack/data/list-channels/index.ts index 75e5ce9c..d9fa4ba3 100644 --- a/packages/backend/src/apps/slack/data/list-channels/index.ts +++ b/packages/backend/src/apps/slack/data/list-channels/index.ts @@ -19,11 +19,16 @@ export default { }, }); - if (response.integrationError || response.data.ok === 'false') { + if (response.integrationError) { channels.error = response.integrationError; return channels; } + if (response.data.ok === 'false') { + channels.error = response.data.error; + return channels; + } + channels.data = response.data.channels.map((channel: IJSONObject) => { return { value: channel.id, diff --git a/packages/backend/src/graphql/mutations/create-auth-data.ts b/packages/backend/src/graphql/mutations/create-auth-data.ts index 8dac9f28..91ff8d60 100644 --- a/packages/backend/src/graphql/mutations/create-auth-data.ts +++ b/packages/backend/src/graphql/mutations/create-auth-data.ts @@ -25,7 +25,7 @@ const createAuthData = async ( return null; } - const authInstance = (await import(`../../apps/${connection.key}2/auth`)) + const authInstance = (await import(`../../apps/${connection.key}/auth`)) .default; const app = await App.findOneByKey(connection.key); diff --git a/packages/backend/src/graphql/schema.graphql b/packages/backend/src/graphql/schema.graphql index a6f97dc9..689f660c 100644 --- a/packages/backend/src/graphql/schema.graphql +++ b/packages/backend/src/graphql/schema.graphql @@ -104,14 +104,18 @@ type App { authDocUrl: String primaryColor: String supportsConnections: Boolean - fields: [Field] - authenticationSteps: [AuthenticationStep] - reconnectionSteps: [ReconnectionStep] + auth: AppAuth triggers: [Trigger] actions: [Action] connections: [Connection] } +type AppAuth { + fields: [Field] + authenticationSteps: [AuthenticationStep] + reconnectionSteps: [ReconnectionStep] +} + enum ArgumentEnumType { integer string diff --git a/packages/backend/src/helpers/app-info-converter.ts b/packages/backend/src/helpers/app-info-converter.ts index a58287d8..8ea38c2a 100644 --- a/packages/backend/src/helpers/app-info-converter.ts +++ b/packages/backend/src/helpers/app-info-converter.ts @@ -2,19 +2,21 @@ import type { IApp } from '@automatisch/types'; import appConfig from '../config/app'; const appInfoConverter = (rawAppData: IApp) => { - const stringifiedRawAppData = JSON.stringify(rawAppData); - - let computedRawData = stringifiedRawAppData.replace( + rawAppData.iconUrl = rawAppData.iconUrl.replace( '{BASE_URL}', appConfig.baseUrl ); - computedRawData = computedRawData.replace( - '{WEB_APP_URL}', - appConfig.webAppUrl - ); - const computedJSONData: IApp = JSON.parse(computedRawData); - return computedJSONData; + if (rawAppData.auth?.fields) { + rawAppData.auth.fields = rawAppData.auth.fields.map((field) => { + return { + ...field, + value: field.value?.replace('{WEB_APP_URL}', appConfig.webAppUrl), + }; + }); + } + + return rawAppData; }; export default appInfoConverter; diff --git a/packages/backend/src/models/app.ts b/packages/backend/src/models/app.ts index 7101e092..2a52c810 100644 --- a/packages/backend/src/models/app.ts +++ b/packages/backend/src/models/app.ts @@ -10,16 +10,14 @@ class App { // Temporaryly restrict the apps we expose until // their actions/triggers are implemented! - static temporaryList = [ - 'slack', - 'twitter', - 'scheduler' - ]; + static temporaryList = ['slack', 'twitter', 'scheduler']; static async findAll(name?: string, stripFuncs = true): Promise { if (!name) return Promise.all( - this.temporaryList.map(async (name) => await this.findOneByName(name, stripFuncs)) + this.temporaryList.map( + async (name) => await this.findOneByName(name, stripFuncs) + ) ); return Promise.all( @@ -32,16 +30,12 @@ class App { static async findOneByName(name: string, stripFuncs = false): Promise { const rawAppData = await getApp(name.toLocaleLowerCase(), stripFuncs); - if (!stripFuncs) return rawAppData; - return appInfoConverter(rawAppData); } static async findOneByKey(key: string, stripFuncs = false): Promise { const rawAppData = await getApp(key, stripFuncs); - if (!stripFuncs) return rawAppData; - return appInfoConverter(rawAppData); } } diff --git a/packages/web/src/graphql/queries/get-app.ts b/packages/web/src/graphql/queries/get-app.ts index 5c5aff67..ce3219ed 100644 --- a/packages/web/src/graphql/queries/get-app.ts +++ b/packages/web/src/graphql/queries/get-app.ts @@ -10,42 +10,44 @@ export const GET_APP = gql` authDocUrl primaryColor supportsConnections - fields { - key - label - type - required - readOnly - value - description - docUrl - clickToCopy - } - authenticationSteps { - step - type - name - arguments { - name - value + auth { + fields { + key + label type - properties { + required + readOnly + value + description + docUrl + clickToCopy + } + authenticationSteps { + step + type + name + arguments { name value + type + properties { + name + value + } } } - } - reconnectionSteps { - step - type - name - arguments { - name - value + reconnectionSteps { + step type - properties { + name + arguments { name value + type + properties { + name + value + } } } } diff --git a/packages/web/src/graphql/queries/get-apps.ts b/packages/web/src/graphql/queries/get-apps.ts index 3cdd6e3c..f22a3adf 100644 --- a/packages/web/src/graphql/queries/get-apps.ts +++ b/packages/web/src/graphql/queries/get-apps.ts @@ -10,43 +10,45 @@ export const GET_APPS = gql` primaryColor connectionCount supportsConnections - fields { - key - label - type - required - readOnly - value - placeholder - description - docUrl - clickToCopy - } - authenticationSteps { - step - type - name - arguments { - name - value + auth { + fields { + key + label type - properties { + required + readOnly + value + placeholder + description + docUrl + clickToCopy + } + authenticationSteps { + step + type + name + arguments { name value + type + properties { + name + value + } } } - } - reconnectionSteps { - step - type - name - arguments { - name - value + reconnectionSteps { + step type - properties { + name + arguments { name value + type + properties { + name + value + } } } }