From 9a743fb4a8acf8db048be68bf2938990fbe83293 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 21 Oct 2022 19:03:24 +0200 Subject: [PATCH 01/15] feat: Capture unhandled errors by restructuring apps --- .../src/apps/github/common/paginate-all.ts | 17 ++++++---- .../github/triggers/new-issues/new-issues.ts | 16 ++++----- .../triggers/new-stargazers/new-stargazers.ts | 33 ++++++++++++------ .../actions/find-message/find-message.ts | 2 +- .../send-a-message-to-channel/post-message.ts | 2 +- .../apps/slack/data/list-channels/index.ts | 4 +-- .../twitter/actions/create-tweet/index.ts | 2 +- .../apps/twitter/common/get-user-followers.ts | 4 +-- .../apps/twitter/common/get-user-tweets.ts | 4 +-- .../twitter/triggers/search-tweets/index.ts | 6 ++++ .../triggers/search-tweets/search-tweets.ts | 34 +++---------------- .../backend/src/helpers/global-variable.ts | 4 +++ .../backend/src/helpers/http-client/index.ts | 4 +-- packages/backend/src/models/app.ts | 7 +--- packages/backend/src/services/flow.ts | 20 ++++++++++- packages/types/index.d.ts | 9 +++-- 16 files changed, 92 insertions(+), 76 deletions(-) diff --git a/packages/backend/src/apps/github/common/paginate-all.ts b/packages/backend/src/apps/github/common/paginate-all.ts index 78a01de9..aa5ed1b8 100644 --- a/packages/backend/src/apps/github/common/paginate-all.ts +++ b/packages/backend/src/apps/github/common/paginate-all.ts @@ -1,13 +1,16 @@ -import { IGlobalVariable, IJSONObject } from "@automatisch/types"; +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; import type { AxiosResponse } from 'axios'; import parseLinkHeader from '../../../helpers/parse-header-link'; type TResponse = { - data: IJSONObject[], - error?: IJSONObject, -} + data: IJSONObject[]; + error?: IJSONObject; +}; -export default async function paginateAll($: IGlobalVariable, request: Promise) { +export default async function paginateAll( + $: IGlobalVariable, + request: Promise +) { const response = await request; const aggregatedResponse: TResponse = { data: [...response.data], @@ -21,8 +24,8 @@ export default async function paginateAll($: IGlobalVariable, request: Promise { const response = await $.http.get(pathname, { params }); links = parseLinkHeader(response.headers.link); - if (response.integrationError) { - issues.error = response.integrationError; + if (response.httpError) { + issues.error = response.httpError; return issues; } @@ -44,7 +43,8 @@ const newIssues = async ($: IGlobalVariable) => { for (const issue of response.data) { const issueId = issue.id; - if (issueId <= Number($.flow.lastInternalId) && !$.execution.testRun) return issues; + if (issueId <= Number($.flow.lastInternalId) && !$.execution.testRun) + return issues; const dataItem = { raw: issue, diff --git a/packages/backend/src/apps/github/triggers/new-stargazers/new-stargazers.ts b/packages/backend/src/apps/github/triggers/new-stargazers/new-stargazers.ts index a22ee083..1831ef1e 100644 --- a/packages/backend/src/apps/github/triggers/new-stargazers/new-stargazers.ts +++ b/packages/backend/src/apps/github/triggers/new-stargazers/new-stargazers.ts @@ -10,10 +10,12 @@ import parseLinkHeader from '../../../../helpers/parse-header-link'; type TResponseDataItem = { starred_at: string; user: IJSONObject; -} +}; const fetchStargazers = async ($: IGlobalVariable) => { - const { repoOwner, repo } = getRepoOwnerAndRepo($.step.parameters.repo as string); + const { repoOwner, repo } = getRepoOwnerAndRepo( + $.step.parameters.repo as string + ); const firstPagePathname = `/repos/${repoOwner}/${repo}/stargazers`; const requestConfig = { params: { @@ -22,10 +24,13 @@ const fetchStargazers = async ($: IGlobalVariable) => { headers: { // needed to get `starred_at` time Accept: 'application/vnd.github.star+json', - } - } + }, + }; - const firstPageResponse = await $.http.get(firstPagePathname, requestConfig); + const firstPageResponse = await $.http.get( + firstPagePathname, + requestConfig + ); const firstPageLinks = parseLinkHeader(firstPageResponse.headers.link); // in case there is only single page to fetch @@ -36,12 +41,15 @@ const fetchStargazers = async ($: IGlobalVariable) => { }; do { - const response = await $.http.get(pathname, requestConfig); + const response = await $.http.get( + pathname, + requestConfig + ); const links = parseLinkHeader(response.headers.link); pathname = links.prev?.uri; - if (response.integrationError) { - stargazers.error = response.integrationError; + if (response.httpError) { + stargazers.error = response.httpError; return stargazers; } @@ -50,7 +58,8 @@ const fetchStargazers = async ($: IGlobalVariable) => { const { starred_at, user } = starEntry; const timestamp = DateTime.fromISO(starred_at).toMillis(); - if (timestamp <= Number($.flow.lastInternalId) && !$.execution.testRun) return stargazers; + if (timestamp <= Number($.flow.lastInternalId) && !$.execution.testRun) + return stargazers; const dataItem = { raw: user, @@ -65,13 +74,15 @@ const fetchStargazers = async ($: IGlobalVariable) => { } while (pathname && !$.execution.testRun); return stargazers; -} +}; const newStargazers = async ($: IGlobalVariable) => { const stargazers = await fetchStargazers($); stargazers.data.sort((stargazerA, stargazerB) => { - return Number(stargazerA.meta.internalId) - Number(stargazerB.meta.internalId); + return ( + Number(stargazerA.meta.internalId) - Number(stargazerB.meta.internalId) + ); }); return stargazers; 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 72ae767e..2c88790f 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 @@ -25,7 +25,7 @@ const findMessage = async ($: IGlobalVariable, options: FindMessageOptions) => { data: { raw: data?.messages.matches[0], }, - error: response?.integrationError || (!data.ok && data), + error: response?.httpError || (!data.ok && data), }; return message; diff --git a/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts b/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts index a43695ab..3ac7017a 100644 --- a/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts +++ b/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts @@ -16,7 +16,7 @@ const postMessage = async ( data: { raw: response?.data?.message, }, - error: response?.integrationError, + error: response?.httpError, }; if (response.data.ok === false) { 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 84cbcdd0..e95fed0b 100644 --- a/packages/backend/src/apps/slack/data/list-channels/index.ts +++ b/packages/backend/src/apps/slack/data/list-channels/index.ts @@ -15,8 +15,8 @@ export default { const response = await $.http.get('/conversations.list'); - if (response.integrationError) { - channels.error = response.integrationError; + if (response.httpError) { + channels.error = response.httpError; return channels; } diff --git a/packages/backend/src/apps/twitter/actions/create-tweet/index.ts b/packages/backend/src/apps/twitter/actions/create-tweet/index.ts index 17da5737..e167a752 100644 --- a/packages/backend/src/apps/twitter/actions/create-tweet/index.ts +++ b/packages/backend/src/apps/twitter/actions/create-tweet/index.ts @@ -40,7 +40,7 @@ export default defineAction({ data: { raw: response.data, }, - error: response?.integrationError, + error: response?.httpError, }; return tweet; diff --git a/packages/backend/src/apps/twitter/common/get-user-followers.ts b/packages/backend/src/apps/twitter/common/get-user-followers.ts index f63baabb..849b5f29 100644 --- a/packages/backend/src/apps/twitter/common/get-user-followers.ts +++ b/packages/backend/src/apps/twitter/common/get-user-followers.ts @@ -33,8 +33,8 @@ const getUserFollowers = async ( response = await $.http.get(requestPath); - if (response.integrationError) { - followers.error = response.integrationError; + if (response.httpError) { + followers.error = response.httpError; return followers; } diff --git a/packages/backend/src/apps/twitter/common/get-user-tweets.ts b/packages/backend/src/apps/twitter/common/get-user-tweets.ts index 5a13a070..2dcd3430 100644 --- a/packages/backend/src/apps/twitter/common/get-user-tweets.ts +++ b/packages/backend/src/apps/twitter/common/get-user-tweets.ts @@ -36,8 +36,8 @@ const fetchTweets = async ($: IGlobalVariable, username: string) => { response = await $.http.get(requestPath); - if (response.integrationError) { - tweets.error = response.integrationError; + if (response.httpError) { + tweets.error = response.httpError; return tweets; } diff --git a/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts index b2bb95fe..67bbd55c 100644 --- a/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts @@ -33,4 +33,10 @@ export default defineTrigger({ async run($) { return await searchTweets($); }, + + sort($) { + $.output.data.sort((tweet, nextTweet) => { + return Number(tweet.meta.internalId) - Number(nextTweet.meta.internalId); + }); + }, }); diff --git a/packages/backend/src/apps/twitter/triggers/search-tweets/search-tweets.ts b/packages/backend/src/apps/twitter/triggers/search-tweets/search-tweets.ts index 4c7b8648..eac3eb38 100644 --- a/packages/backend/src/apps/twitter/triggers/search-tweets/search-tweets.ts +++ b/packages/backend/src/apps/twitter/triggers/search-tweets/search-tweets.ts @@ -1,20 +1,12 @@ -import { - IGlobalVariable, - IJSONObject, - ITriggerOutput, -} from '@automatisch/types'; +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; import qs from 'qs'; import { omitBy, isEmpty } from 'lodash'; -const fetchTweets = async ($: IGlobalVariable) => { +const searchTweets = async ($: IGlobalVariable) => { const searchTerm = $.step.parameters.searchTerm as string; let response; - const tweets: ITriggerOutput = { - data: [], - }; - do { const params: IJSONObject = { query: searchTerm, @@ -30,14 +22,8 @@ const fetchTweets = async ($: IGlobalVariable) => { response = await $.http.get(requestPath); - if (response.integrationError) { - tweets.error = response.integrationError; - return tweets; - } - if (response.data.errors) { - tweets.error = response.data.errors; - return tweets; + throw new Error(JSON.stringify(response.data.errors)); } if (response.data.meta.result_count > 0) { @@ -49,22 +35,10 @@ const fetchTweets = async ($: IGlobalVariable) => { }, }; - tweets.data.push(dataItem); + $.output.data.push(dataItem); }); } } while (response.data.meta.next_token && !$.execution.testRun); - - return tweets; -}; - -const searchTweets = async ($: IGlobalVariable) => { - const tweets = await fetchTweets($); - - tweets.data.sort((tweet, nextTweet) => { - return Number(tweet.meta.internalId) - Number(nextTweet.meta.internalId); - }); - - return tweets; }; export default searchTweets; diff --git a/packages/backend/src/helpers/global-variable.ts b/packages/backend/src/helpers/global-variable.ts index 314ed368..34ddd074 100644 --- a/packages/backend/src/helpers/global-variable.ts +++ b/packages/backend/src/helpers/global-variable.ts @@ -59,6 +59,10 @@ const globalVariable = async ( id: execution?.id, testRun, }, + output: { + data: [], + error: null, + }, }; $.http = createHttpClient({ diff --git a/packages/backend/src/helpers/http-client/index.ts b/packages/backend/src/helpers/http-client/index.ts index a98820a0..c6346e9f 100644 --- a/packages/backend/src/helpers/http-client/index.ts +++ b/packages/backend/src/helpers/http-client/index.ts @@ -39,8 +39,8 @@ export default function createHttpClient({ instance.interceptors.response.use( (response) => response, (error) => { - error.response.integrationError = error.response.data; - return error.response; + error.response.httpError = error.response.data; + throw error; } ); diff --git a/packages/backend/src/models/app.ts b/packages/backend/src/models/app.ts index 0aa34d35..4fdbf247 100644 --- a/packages/backend/src/models/app.ts +++ b/packages/backend/src/models/app.ts @@ -10,12 +10,7 @@ class App { // Temporaryly restrict the apps we expose until // their actions/triggers are implemented! - static temporaryList = [ - 'github', - 'scheduler', - 'slack', - 'twitter', - ]; + static temporaryList = ['github', 'scheduler', 'slack', 'twitter']; static async findAll(name?: string, stripFuncs = true): Promise { if (!name) diff --git a/packages/backend/src/services/flow.ts b/packages/backend/src/services/flow.ts index c11473a2..7ef3886f 100644 --- a/packages/backend/src/services/flow.ts +++ b/packages/backend/src/services/flow.ts @@ -20,5 +20,23 @@ export const processFlow = async (options: ProcessFlowOptions) => { testRun: options.testRun, }); - return await triggerCommand.run($); + try { + await triggerCommand.run($); + } catch (error) { + if (error?.response?.httpError) { + $.output.error = error.response.httpError; + } else { + try { + $.output.error = JSON.parse(error.message); + } catch { + $.output.error = { error: error.message }; + } + } + } + + if (triggerCommand?.sort) { + triggerCommand.sort($); + } + + return $.output; }; diff --git a/packages/types/index.d.ts b/packages/types/index.d.ts index 487557dc..41e17b90 100644 --- a/packages/types/index.d.ts +++ b/packages/types/index.d.ts @@ -213,7 +213,8 @@ export interface ITrigger { dedupeStrategy?: 'greatest' | 'unique' | 'last'; substeps: ISubstep[]; getInterval?(parameters: IGlobalVariable['step']['parameters']): string; - run($: IGlobalVariable): Promise; + run($: IGlobalVariable): Promise; + sort?($: IGlobalVariable): void | ITriggerOutput; } export interface IActionOutput { @@ -279,11 +280,15 @@ export type IGlobalVariable = { id: string; testRun: boolean; }; + output: { + data: ITriggerDataItem[]; + error?: IJSONObject; + } process?: (triggerDataItem: ITriggerDataItem) => Promise; }; declare module 'axios' { interface AxiosResponse { - integrationError?: IJSONObject; + httpError?: IJSONObject; } } From aef097becbaa5751fe55f0fcb069671c294589cd Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 21 Oct 2022 19:05:12 +0200 Subject: [PATCH 02/15] refactor: Use new error handling structure for user tweets --- .../apps/twitter/common/get-user-tweets.ts | 27 +++---------------- .../twitter/triggers/search-tweets/index.ts | 2 +- .../twitter/triggers/user-tweets/index.ts | 6 +++++ 3 files changed, 11 insertions(+), 24 deletions(-) diff --git a/packages/backend/src/apps/twitter/common/get-user-tweets.ts b/packages/backend/src/apps/twitter/common/get-user-tweets.ts index 2dcd3430..29ed790d 100644 --- a/packages/backend/src/apps/twitter/common/get-user-tweets.ts +++ b/packages/backend/src/apps/twitter/common/get-user-tweets.ts @@ -1,8 +1,4 @@ -import { - IGlobalVariable, - IJSONObject, - ITriggerOutput, -} from '@automatisch/types'; +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; import { URLSearchParams } from 'url'; import omitBy from 'lodash/omitBy'; import isEmpty from 'lodash/isEmpty'; @@ -18,10 +14,6 @@ const fetchTweets = async ($: IGlobalVariable, username: string) => { let response; - const tweets: ITriggerOutput = { - data: [], - }; - do { const params: IJSONObject = { since_id: $.execution.testRun ? null : $.flow.lastInternalId, @@ -36,14 +28,9 @@ const fetchTweets = async ($: IGlobalVariable, username: string) => { response = await $.http.get(requestPath); - if (response.httpError) { - tweets.error = response.httpError; - return tweets; - } - if (response.data.meta.result_count > 0) { response.data.data.forEach((tweet: IJSONObject) => { - tweets.data.push({ + $.output.data.push({ raw: tweet, meta: { internalId: tweet.id as string, @@ -53,7 +40,7 @@ const fetchTweets = async ($: IGlobalVariable, username: string) => { } } while (response.data.meta.next_token && !$.execution.testRun); - return tweets; + return $.output; }; const getUserTweets = async ( @@ -69,13 +56,7 @@ const getUserTweets = async ( username = $.step.parameters.username as string; } - const tweets = await fetchTweets($, username); - - tweets.data.sort((tweet, nextTweet) => { - return Number(tweet.meta.internalId) - Number(nextTweet.meta.internalId); - }); - - return tweets; + await fetchTweets($, username); }; export default getUserTweets; diff --git a/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts index 67bbd55c..d033a646 100644 --- a/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts @@ -36,7 +36,7 @@ export default defineTrigger({ sort($) { $.output.data.sort((tweet, nextTweet) => { - return Number(tweet.meta.internalId) - Number(nextTweet.meta.internalId); + return Number(nextTweet.meta.internalId) - Number(tweet.meta.internalId); }); }, }); diff --git a/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts index 723d21bc..903690e3 100644 --- a/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts @@ -34,4 +34,10 @@ export default defineTrigger({ currentUser: false, }); }, + + sort($) { + $.output.data.sort((tweet, nextTweet) => { + return Number(nextTweet.meta.internalId) - Number(tweet.meta.internalId); + }); + }, }); From 204a8ffb7fcff081c6a2f952fd570b495aa909fe Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 21 Oct 2022 19:10:00 +0200 Subject: [PATCH 03/15] refactor: No need to return from run methods for twitter triggers --- .../backend/src/apps/twitter/triggers/search-tweets/index.ts | 2 +- .../backend/src/apps/twitter/triggers/user-tweets/index.ts | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts index d033a646..27709bef 100644 --- a/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts @@ -31,7 +31,7 @@ export default defineTrigger({ ], async run($) { - return await searchTweets($); + await searchTweets($); }, sort($) { diff --git a/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts index 903690e3..e2fb64a2 100644 --- a/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts @@ -30,9 +30,7 @@ export default defineTrigger({ ], async run($) { - return await getUserTweets($, { - currentUser: false, - }); + await getUserTweets($, { currentUser: false }); }, sort($) { From 64807fbc11c5429d6d7e5f30f7e26d34ffaa3fa4 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 21 Oct 2022 19:13:00 +0200 Subject: [PATCH 04/15] refactor: Add sort logic into my tweets trigger --- .../backend/src/apps/twitter/triggers/my-tweets/index.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/apps/twitter/triggers/my-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/my-tweets/index.ts index 32562090..f82ccd65 100644 --- a/packages/backend/src/apps/twitter/triggers/my-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/my-tweets/index.ts @@ -18,8 +18,12 @@ export default defineTrigger({ ], async run($) { - return await getUserTweets($, { - currentUser: true, + await getUserTweets($, { currentUser: true }); + }, + + sort($) { + $.output.data.sort((tweet, nextTweet) => { + return Number(nextTweet.meta.internalId) - Number(tweet.meta.internalId); }); }, }); From 7e2dd951344927285b4eebf0109f7b95d4767ac9 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 21 Oct 2022 19:14:00 +0200 Subject: [PATCH 05/15] chore: Differentiate trigger and action output types --- .../backend/src/apps/twitter/common/get-user-tweets.ts | 4 ++-- .../src/apps/twitter/triggers/my-tweets/index.ts | 2 +- .../src/apps/twitter/triggers/search-tweets/index.ts | 2 +- .../twitter/triggers/search-tweets/search-tweets.ts | 2 +- .../src/apps/twitter/triggers/user-tweets/index.ts | 2 +- packages/backend/src/helpers/global-variable.ts | 6 +++++- packages/backend/src/services/flow.ts | 8 ++++---- packages/types/index.d.ts | 10 ++++------ 8 files changed, 19 insertions(+), 17 deletions(-) diff --git a/packages/backend/src/apps/twitter/common/get-user-tweets.ts b/packages/backend/src/apps/twitter/common/get-user-tweets.ts index 29ed790d..415a6a13 100644 --- a/packages/backend/src/apps/twitter/common/get-user-tweets.ts +++ b/packages/backend/src/apps/twitter/common/get-user-tweets.ts @@ -30,7 +30,7 @@ const fetchTweets = async ($: IGlobalVariable, username: string) => { if (response.data.meta.result_count > 0) { response.data.data.forEach((tweet: IJSONObject) => { - $.output.data.push({ + $.triggerOutput.data.push({ raw: tweet, meta: { internalId: tweet.id as string, @@ -40,7 +40,7 @@ const fetchTweets = async ($: IGlobalVariable, username: string) => { } } while (response.data.meta.next_token && !$.execution.testRun); - return $.output; + return $.triggerOutput; }; const getUserTweets = async ( diff --git a/packages/backend/src/apps/twitter/triggers/my-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/my-tweets/index.ts index f82ccd65..8f9f4475 100644 --- a/packages/backend/src/apps/twitter/triggers/my-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/my-tweets/index.ts @@ -22,7 +22,7 @@ export default defineTrigger({ }, sort($) { - $.output.data.sort((tweet, nextTweet) => { + $.triggerOutput.data.sort((tweet, nextTweet) => { return Number(nextTweet.meta.internalId) - Number(tweet.meta.internalId); }); }, diff --git a/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts index 27709bef..3e69afd2 100644 --- a/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts @@ -35,7 +35,7 @@ export default defineTrigger({ }, sort($) { - $.output.data.sort((tweet, nextTweet) => { + $.triggerOutput.data.sort((tweet, nextTweet) => { return Number(nextTweet.meta.internalId) - Number(tweet.meta.internalId); }); }, diff --git a/packages/backend/src/apps/twitter/triggers/search-tweets/search-tweets.ts b/packages/backend/src/apps/twitter/triggers/search-tweets/search-tweets.ts index eac3eb38..b25ef36b 100644 --- a/packages/backend/src/apps/twitter/triggers/search-tweets/search-tweets.ts +++ b/packages/backend/src/apps/twitter/triggers/search-tweets/search-tweets.ts @@ -35,7 +35,7 @@ const searchTweets = async ($: IGlobalVariable) => { }, }; - $.output.data.push(dataItem); + $.triggerOutput.data.push(dataItem); }); } } while (response.data.meta.next_token && !$.execution.testRun); diff --git a/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts index e2fb64a2..783fe028 100644 --- a/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts @@ -34,7 +34,7 @@ export default defineTrigger({ }, sort($) { - $.output.data.sort((tweet, nextTweet) => { + $.triggerOutput.data.sort((tweet, nextTweet) => { return Number(nextTweet.meta.internalId) - Number(tweet.meta.internalId); }); }, diff --git a/packages/backend/src/helpers/global-variable.ts b/packages/backend/src/helpers/global-variable.ts index 34ddd074..26291fa9 100644 --- a/packages/backend/src/helpers/global-variable.ts +++ b/packages/backend/src/helpers/global-variable.ts @@ -59,10 +59,14 @@ const globalVariable = async ( id: execution?.id, testRun, }, - output: { + triggerOutput: { data: [], error: null, }, + actionOutput: { + data: null, + error: null, + }, }; $.http = createHttpClient({ diff --git a/packages/backend/src/services/flow.ts b/packages/backend/src/services/flow.ts index 7ef3886f..1a333872 100644 --- a/packages/backend/src/services/flow.ts +++ b/packages/backend/src/services/flow.ts @@ -24,12 +24,12 @@ export const processFlow = async (options: ProcessFlowOptions) => { await triggerCommand.run($); } catch (error) { if (error?.response?.httpError) { - $.output.error = error.response.httpError; + $.triggerOutput.error = error.response.httpError; } else { try { - $.output.error = JSON.parse(error.message); + $.triggerOutput.error = JSON.parse(error.message); } catch { - $.output.error = { error: error.message }; + $.triggerOutput.error = { error: error.message }; } } } @@ -38,5 +38,5 @@ export const processFlow = async (options: ProcessFlowOptions) => { triggerCommand.sort($); } - return $.output; + return $.triggerOutput; }; diff --git a/packages/types/index.d.ts b/packages/types/index.d.ts index 41e17b90..35808c4e 100644 --- a/packages/types/index.d.ts +++ b/packages/types/index.d.ts @@ -171,7 +171,7 @@ export interface IApp { export type TBeforeRequest = { ($: IGlobalVariable, requestConfig: AxiosRequestConfig): AxiosRequestConfig; -} +}; export interface IData { [index: string]: any; @@ -233,7 +233,7 @@ export interface IAction { key: string; description: string; substeps: ISubstep[]; - run($: IGlobalVariable): Promise; + run($: IGlobalVariable): Promise; } export interface IAuthentication { @@ -280,10 +280,8 @@ export type IGlobalVariable = { id: string; testRun: boolean; }; - output: { - data: ITriggerDataItem[]; - error?: IJSONObject; - } + triggerOutput?: ITriggerOutput; + actionOutput?: IActionOutput; process?: (triggerDataItem: ITriggerDataItem) => Promise; }; From 00be50d2fd654db909d84cedb218c5156eecb2e6 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 21 Oct 2022 19:18:00 +0200 Subject: [PATCH 06/15] refactor: Restructure create tweet with new global variable --- .../src/apps/twitter/actions/create-tweet/index.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/backend/src/apps/twitter/actions/create-tweet/index.ts b/packages/backend/src/apps/twitter/actions/create-tweet/index.ts index e167a752..a67a60d7 100644 --- a/packages/backend/src/apps/twitter/actions/create-tweet/index.ts +++ b/packages/backend/src/apps/twitter/actions/create-tweet/index.ts @@ -36,13 +36,6 @@ export default defineAction({ text, }); - const tweet: IActionOutput = { - data: { - raw: response.data, - }, - error: response?.httpError, - }; - - return tweet; + $.actionOutput.data.raw = response.data; }, }); From 585adb14e6eff66435a1d64dd67af5554500ad0f Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 21 Oct 2022 19:21:14 +0200 Subject: [PATCH 07/15] refactor: Use global output with slack actions --- .../apps/slack/actions/find-message/find-message.ts | 11 ++++------- .../send-a-message-to-channel/post-message.ts | 13 +++---------- 2 files changed, 7 insertions(+), 17 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 2c88790f..0692ce9e 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 @@ -21,14 +21,11 @@ const findMessage = async ($: IGlobalVariable, options: FindMessageOptions) => { const data = response.data; - const message: IActionOutput = { - data: { - raw: data?.messages.matches[0], - }, - error: response?.httpError || (!data.ok && data), - }; + if (!data.ok && data) { + throw new Error(JSON.stringify(response.data)); + } - return message; + $.actionOutput.data.raw = data?.messages.matches[0]; }; export default findMessage; diff --git a/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts b/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts index 3ac7017a..efa05731 100644 --- a/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts +++ b/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts @@ -1,4 +1,4 @@ -import { IGlobalVariable, IActionOutput } from '@automatisch/types'; +import { IGlobalVariable } from '@automatisch/types'; const postMessage = async ( $: IGlobalVariable, @@ -12,18 +12,11 @@ const postMessage = async ( const response = await $.http.post('/chat.postMessage', params); - const message: IActionOutput = { - data: { - raw: response?.data?.message, - }, - error: response?.httpError, - }; - if (response.data.ok === false) { - message.error = response.data; + throw new Error(JSON.stringify(response.data)); } - return message; + $.actionOutput.data.raw = response?.data?.message; }; export default postMessage; From 0f63f6d453c029c2de4a074741dcaa5beabd68b7 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 21 Oct 2022 19:25:13 +0200 Subject: [PATCH 08/15] refactor: Use global output with scheduler triggers --- packages/backend/src/apps/scheduler/triggers/every-day/index.ts | 2 +- .../backend/src/apps/scheduler/triggers/every-hour/index.ts | 2 +- .../backend/src/apps/scheduler/triggers/every-month/index.ts | 2 +- .../backend/src/apps/scheduler/triggers/every-week/index.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/apps/scheduler/triggers/every-day/index.ts b/packages/backend/src/apps/scheduler/triggers/every-day/index.ts index eb4bf570..70fd947e 100644 --- a/packages/backend/src/apps/scheduler/triggers/every-day/index.ts +++ b/packages/backend/src/apps/scheduler/triggers/every-day/index.ts @@ -171,6 +171,6 @@ export default defineTrigger({ }, }; - return { data: [dataItem] }; + $.triggerOutput.data.push(dataItem); }, }); diff --git a/packages/backend/src/apps/scheduler/triggers/every-hour/index.ts b/packages/backend/src/apps/scheduler/triggers/every-hour/index.ts index dce95040..8ed3aeeb 100644 --- a/packages/backend/src/apps/scheduler/triggers/every-hour/index.ts +++ b/packages/backend/src/apps/scheduler/triggers/every-hour/index.ts @@ -65,6 +65,6 @@ export default defineTrigger({ }, }; - return { data: [dataItem] }; + $.triggerOutput.data.push(dataItem); }, }); diff --git a/packages/backend/src/apps/scheduler/triggers/every-month/index.ts b/packages/backend/src/apps/scheduler/triggers/every-month/index.ts index cbbdebd1..d88b68a1 100644 --- a/packages/backend/src/apps/scheduler/triggers/every-month/index.ts +++ b/packages/backend/src/apps/scheduler/triggers/every-month/index.ts @@ -287,6 +287,6 @@ export default defineTrigger({ }, }; - return { data: [dataItem] }; + $.triggerOutput.data.push(dataItem); }, }); diff --git a/packages/backend/src/apps/scheduler/triggers/every-week/index.ts b/packages/backend/src/apps/scheduler/triggers/every-week/index.ts index ccdcdb04..d28d4f52 100644 --- a/packages/backend/src/apps/scheduler/triggers/every-week/index.ts +++ b/packages/backend/src/apps/scheduler/triggers/every-week/index.ts @@ -191,6 +191,6 @@ export default defineTrigger({ }, }; - return { data: [dataItem] }; + $.triggerOutput.data.push(dataItem); }, }); From 59b9c66a91d6ad7f8de22a4b305ac1a98ff3635a Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 21 Oct 2022 19:30:33 +0200 Subject: [PATCH 09/15] refactor: Use global output with github stargazers --- .../apps/github/triggers/new-issues/index.ts | 44 +++++++++---------- .../github/triggers/new-issues/new-issues.ts | 17 ++----- .../github/triggers/new-stargazers/index.ts | 26 +++++++---- .../triggers/new-stargazers/new-stargazers.ts | 35 ++------------- 4 files changed, 46 insertions(+), 76 deletions(-) diff --git a/packages/backend/src/apps/github/triggers/new-issues/index.ts b/packages/backend/src/apps/github/triggers/new-issues/index.ts index e66dd4fc..1166a0f4 100644 --- a/packages/backend/src/apps/github/triggers/new-issues/index.ts +++ b/packages/backend/src/apps/github/triggers/new-issues/index.ts @@ -9,7 +9,7 @@ export default defineTrigger({ substeps: [ { key: 'chooseConnection', - name: 'Choose connection' + name: 'Choose connection', }, { key: 'chooseTrigger', @@ -27,10 +27,10 @@ export default defineTrigger({ arguments: [ { name: 'key', - value: 'listRepos' - } - ] - } + value: 'listRepos', + }, + ], + }, }, { label: 'Which types of issues should this trigger on?', @@ -43,25 +43,25 @@ export default defineTrigger({ options: [ { label: 'Any issue you can see', - value: 'all' + value: 'all', }, { label: 'Only issues assigned to you', - value: 'assigned' + value: 'assigned', }, { label: 'Only issues created by you', - value: 'created' + value: 'created', }, { label: `Only issues you're mentioned in`, - value: 'mentioned' + value: 'mentioned', }, { label: `Only issues you're subscribed to`, - value: 'subscribed' - } - ] + value: 'subscribed', + }, + ], }, { label: 'Label', @@ -77,24 +77,24 @@ export default defineTrigger({ arguments: [ { name: 'key', - value: 'listLabels' + value: 'listLabels', }, { name: 'parameters.repo', - value: '{parameters.repo}' - } - ] - } - } - ] + value: '{parameters.repo}', + }, + ], + }, + }, + ], }, { key: 'testStep', - name: 'Test trigger' - } + name: 'Test trigger', + }, ], async run($) { - return await newIssues($); + await newIssues($); }, }); diff --git a/packages/backend/src/apps/github/triggers/new-issues/new-issues.ts b/packages/backend/src/apps/github/triggers/new-issues/new-issues.ts index 4052fad4..15e84840 100644 --- a/packages/backend/src/apps/github/triggers/new-issues/new-issues.ts +++ b/packages/backend/src/apps/github/triggers/new-issues/new-issues.ts @@ -1,4 +1,4 @@ -import { IGlobalVariable, ITriggerOutput } from '@automatisch/types'; +import { IGlobalVariable } from '@automatisch/types'; import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo'; import parseLinkHeader from '../../../../helpers/parse-header-link'; @@ -25,26 +25,17 @@ const newIssues = async ($: IGlobalVariable) => { per_page: 100, }; - const issues: ITriggerOutput = { - data: [], - }; - let links; do { const response = await $.http.get(pathname, { params }); links = parseLinkHeader(response.headers.link); - if (response.httpError) { - issues.error = response.httpError; - return issues; - } - if (response.data.length) { for (const issue of response.data) { const issueId = issue.id; if (issueId <= Number($.flow.lastInternalId) && !$.execution.testRun) - return issues; + return; const dataItem = { raw: issue, @@ -53,12 +44,10 @@ const newIssues = async ($: IGlobalVariable) => { }, }; - issues.data.push(dataItem); + $.triggerOutput.data.push(dataItem); } } } while (links.next && !$.execution.testRun); - - return issues; }; export default newIssues; diff --git a/packages/backend/src/apps/github/triggers/new-stargazers/index.ts b/packages/backend/src/apps/github/triggers/new-stargazers/index.ts index 5916b305..f4393f73 100644 --- a/packages/backend/src/apps/github/triggers/new-stargazers/index.ts +++ b/packages/backend/src/apps/github/triggers/new-stargazers/index.ts @@ -9,7 +9,7 @@ export default defineTrigger({ substeps: [ { key: 'chooseConnection', - name: 'Choose connection' + name: 'Choose connection', }, { key: 'chooseTrigger', @@ -27,20 +27,28 @@ export default defineTrigger({ arguments: [ { name: 'key', - value: 'listRepos' - } - ] - } + value: 'listRepos', + }, + ], + }, }, - ] + ], }, { key: 'testStep', - name: 'Test trigger' - } + name: 'Test trigger', + }, ], async run($) { - return await newStargazers($); + await newStargazers($); + }, + + sort($) { + $.triggerOutput.data.sort((stargazerA, stargazerB) => { + return ( + Number(stargazerA.meta.internalId) - Number(stargazerB.meta.internalId) + ); + }); }, }); diff --git a/packages/backend/src/apps/github/triggers/new-stargazers/new-stargazers.ts b/packages/backend/src/apps/github/triggers/new-stargazers/new-stargazers.ts index 1831ef1e..fa1d5636 100644 --- a/packages/backend/src/apps/github/triggers/new-stargazers/new-stargazers.ts +++ b/packages/backend/src/apps/github/triggers/new-stargazers/new-stargazers.ts @@ -1,9 +1,5 @@ import { DateTime } from 'luxon'; -import { - IGlobalVariable, - IJSONObject, - ITriggerOutput, -} from '@automatisch/types'; +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo'; import parseLinkHeader from '../../../../helpers/parse-header-link'; @@ -12,7 +8,7 @@ type TResponseDataItem = { user: IJSONObject; }; -const fetchStargazers = async ($: IGlobalVariable) => { +const newStargazers = async ($: IGlobalVariable) => { const { repoOwner, repo } = getRepoOwnerAndRepo( $.step.parameters.repo as string ); @@ -36,10 +32,6 @@ const fetchStargazers = async ($: IGlobalVariable) => { // in case there is only single page to fetch let pathname = firstPageLinks.last?.uri || firstPagePathname; - const stargazers: ITriggerOutput = { - data: [], - }; - do { const response = await $.http.get( pathname, @@ -48,18 +40,13 @@ const fetchStargazers = async ($: IGlobalVariable) => { const links = parseLinkHeader(response.headers.link); pathname = links.prev?.uri; - if (response.httpError) { - stargazers.error = response.httpError; - return stargazers; - } - if (response.data.length) { for (const starEntry of response.data) { const { starred_at, user } = starEntry; const timestamp = DateTime.fromISO(starred_at).toMillis(); if (timestamp <= Number($.flow.lastInternalId) && !$.execution.testRun) - return stargazers; + return; const dataItem = { raw: user, @@ -68,24 +55,10 @@ const fetchStargazers = async ($: IGlobalVariable) => { }, }; - stargazers.data.push(dataItem); + $.triggerOutput.data.push(dataItem); } } } while (pathname && !$.execution.testRun); - - return stargazers; -}; - -const newStargazers = async ($: IGlobalVariable) => { - const stargazers = await fetchStargazers($); - - stargazers.data.sort((stargazerA, stargazerB) => { - return ( - Number(stargazerA.meta.internalId) - Number(stargazerB.meta.internalId) - ); - }); - - return stargazers; }; export default newStargazers; From bcff9f5a9e1741369cb2281b6ad800d78744978e Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 21 Oct 2022 19:38:33 +0200 Subject: [PATCH 10/15] refactor: Remove dedundant httpError assignment --- .../backend/src/apps/github/common/paginate-all.ts | 11 ++--------- .../src/apps/slack/data/list-channels/index.ts | 8 +------- .../src/apps/twitter/common/get-user-followers.ts | 8 +------- 3 files changed, 4 insertions(+), 23 deletions(-) diff --git a/packages/backend/src/apps/github/common/paginate-all.ts b/packages/backend/src/apps/github/common/paginate-all.ts index aa5ed1b8..8a6d6d35 100644 --- a/packages/backend/src/apps/github/common/paginate-all.ts +++ b/packages/backend/src/apps/github/common/paginate-all.ts @@ -24,15 +24,8 @@ export default async function paginateAll( url: links.next.uri, }); - if (nextPageResponse.httpError) { - aggregatedResponse.error = nextPageResponse.httpError; - - links = null; - } else { - aggregatedResponse.data.push(...nextPageResponse.data); - - links = parseLinkHeader(nextPageResponse.headers.link); - } + aggregatedResponse.data.push(...nextPageResponse.data); + links = parseLinkHeader(nextPageResponse.headers.link); } return aggregatedResponse; 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 e95fed0b..93b7e37a 100644 --- a/packages/backend/src/apps/slack/data/list-channels/index.ts +++ b/packages/backend/src/apps/slack/data/list-channels/index.ts @@ -15,14 +15,8 @@ export default { const response = await $.http.get('/conversations.list'); - if (response.httpError) { - channels.error = response.httpError; - return channels; - } - if (response.data.ok === false) { - channels.error = response.data; - return channels; + throw new Error(response.data); } channels.data = response.data.channels.map((channel: IJSONObject) => { diff --git a/packages/backend/src/apps/twitter/common/get-user-followers.ts b/packages/backend/src/apps/twitter/common/get-user-followers.ts index 849b5f29..45d47d3f 100644 --- a/packages/backend/src/apps/twitter/common/get-user-followers.ts +++ b/packages/backend/src/apps/twitter/common/get-user-followers.ts @@ -33,14 +33,8 @@ const getUserFollowers = async ( response = await $.http.get(requestPath); - if (response.httpError) { - followers.error = response.httpError; - return followers; - } - if (response.data?.errors) { - followers.error = response.data.errors; - return followers; + throw new Error(response.data.errors); } if (response.data.meta.result_count > 0) { From a56135ca57e030e0867425e0359ea8cdb92f2c0d Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Sat, 22 Oct 2022 19:29:02 +0200 Subject: [PATCH 11/15] refactor: Restructure apps with new data pushing logic --- .../apps/github/actions/create-issue/index.ts | 25 +++++-------- .../triggers/new-pull-requests/index.ts | 20 +++++------ .../new-pull-requests/new-pull-requests.ts | 18 ++++------ .../github/triggers/new-stargazers/index.ts | 10 +++--- .../github/triggers/new-watchers/index.ts | 22 +++++++----- .../triggers/new-watchers/new-watchers.ts | 36 ++++--------------- .../apps/twitter/common/get-user-followers.ts | 16 ++------- .../apps/twitter/triggers/my-tweets/index.ts | 6 ++-- .../triggers/new-follower-of-me/index.ts | 2 +- .../twitter/triggers/search-tweets/index.ts | 6 ++-- .../twitter/triggers/user-tweets/index.ts | 6 ++-- .../backend/src/helpers/global-variable.ts | 16 +++++++-- packages/backend/src/services/action.ts | 21 ++++++++--- packages/backend/src/services/flow.ts | 2 +- packages/backend/src/services/test-run.ts | 4 +-- packages/backend/src/services/trigger.ts | 10 +++--- packages/backend/src/workers/flow.ts | 8 +++-- packages/backend/src/workers/trigger.ts | 4 +-- packages/types/index.d.ts | 19 +++++----- 19 files changed, 115 insertions(+), 136 deletions(-) diff --git a/packages/backend/src/apps/github/actions/create-issue/index.ts b/packages/backend/src/apps/github/actions/create-issue/index.ts index 6a53da50..43ee8a12 100644 --- a/packages/backend/src/apps/github/actions/create-issue/index.ts +++ b/packages/backend/src/apps/github/actions/create-issue/index.ts @@ -27,25 +27,25 @@ export default defineAction({ arguments: [ { name: 'key', - value: 'listRepos' - } - ] - } + value: 'listRepos', + }, + ], + }, }, { label: 'Title', key: 'title', type: 'string', required: true, - variables: true + variables: true, }, { label: 'Body', key: 'body', type: 'string', required: true, - variables: true - } + variables: true, + }, ], }, { @@ -59,7 +59,7 @@ export default defineAction({ const title = $.step.parameters.title as string; const body = $.step.parameters.body as string; - if (!repoParameter) throw new Error('A repo must be set!') + if (!repoParameter) throw new Error('A repo must be set!'); if (!title) throw new Error('A title must be set!'); const { repoOwner, repo } = getRepoOwnerAndRepo(repoParameter); @@ -68,13 +68,6 @@ export default defineAction({ body, }); - const issue: IActionOutput = { - data: { - raw: response.data, - }, - error: response?.integrationError, - }; - - return issue; + $.setActionItem({ raw: response.data }); }, }); diff --git a/packages/backend/src/apps/github/triggers/new-pull-requests/index.ts b/packages/backend/src/apps/github/triggers/new-pull-requests/index.ts index 828b4fce..a6d262e2 100644 --- a/packages/backend/src/apps/github/triggers/new-pull-requests/index.ts +++ b/packages/backend/src/apps/github/triggers/new-pull-requests/index.ts @@ -9,7 +9,7 @@ export default defineTrigger({ substeps: [ { key: 'chooseConnection', - name: 'Choose connection' + name: 'Choose connection', }, { key: 'chooseTrigger', @@ -27,20 +27,20 @@ export default defineTrigger({ arguments: [ { name: 'key', - value: 'listRepos' - } - ] - } - } - ] + value: 'listRepos', + }, + ], + }, + }, + ], }, { key: 'testStep', - name: 'Test trigger' - } + name: 'Test trigger', + }, ], async run($) { - return await newPullRequests($); + await newPullRequests($); }, }); diff --git a/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts b/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts index 03c168d2..e827b546 100644 --- a/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts +++ b/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts @@ -1,7 +1,4 @@ -import { - IGlobalVariable, - ITriggerOutput, -} from '@automatisch/types'; +import { IGlobalVariable, ITriggerOutput } from '@automatisch/types'; import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo'; import parseLinkHeader from '../../../../helpers/parse-header-link'; @@ -29,16 +26,15 @@ const fetchPullRequests = async ($: IGlobalVariable) => { const response = await $.http.get(pathname, { params }); links = parseLinkHeader(response.headers.link); - if (response.integrationError) { - pullRequests.error = response.integrationError; - return pullRequests; - } - if (response.data.length) { for (const pullRequest of response.data) { const pullRequestId = pullRequest.id; - if (pullRequestId <= Number($.flow.lastInternalId) && !$.execution.testRun) return pullRequests; + if ( + pullRequestId <= Number($.flow.lastInternalId) && + !$.execution.testRun + ) + return pullRequests; const dataItem = { raw: pullRequest, @@ -53,7 +49,7 @@ const fetchPullRequests = async ($: IGlobalVariable) => { } while (links.next && !$.execution.testRun); return pullRequests; -} +}; const newPullRequests = async ($: IGlobalVariable) => { const pullRequests = await fetchPullRequests($); diff --git a/packages/backend/src/apps/github/triggers/new-stargazers/index.ts b/packages/backend/src/apps/github/triggers/new-stargazers/index.ts index f4393f73..cf033f96 100644 --- a/packages/backend/src/apps/github/triggers/new-stargazers/index.ts +++ b/packages/backend/src/apps/github/triggers/new-stargazers/index.ts @@ -44,11 +44,9 @@ export default defineTrigger({ await newStargazers($); }, - sort($) { - $.triggerOutput.data.sort((stargazerA, stargazerB) => { - return ( - Number(stargazerA.meta.internalId) - Number(stargazerB.meta.internalId) - ); - }); + sort(stargazerA, stargazerB) { + return ( + Number(stargazerA.meta.internalId) - Number(stargazerB.meta.internalId) + ); }, }); diff --git a/packages/backend/src/apps/github/triggers/new-watchers/index.ts b/packages/backend/src/apps/github/triggers/new-watchers/index.ts index cffd8f2f..a7f744d1 100644 --- a/packages/backend/src/apps/github/triggers/new-watchers/index.ts +++ b/packages/backend/src/apps/github/triggers/new-watchers/index.ts @@ -10,7 +10,7 @@ export default defineTrigger({ substeps: [ { key: 'chooseConnection', - name: 'Choose connection' + name: 'Choose connection', }, { key: 'chooseTrigger', @@ -28,20 +28,24 @@ export default defineTrigger({ arguments: [ { name: 'key', - value: 'listRepos' - } - ] - } + value: 'listRepos', + }, + ], + }, }, - ] + ], }, { key: 'testStep', - name: 'Test trigger' - } + name: 'Test trigger', + }, ], async run($) { - return await newWatchers($); + await newWatchers($); + }, + + sort() { + return -1; }, }); diff --git a/packages/backend/src/apps/github/triggers/new-watchers/new-watchers.ts b/packages/backend/src/apps/github/triggers/new-watchers/new-watchers.ts index 255ab493..fb4684b3 100644 --- a/packages/backend/src/apps/github/triggers/new-watchers/new-watchers.ts +++ b/packages/backend/src/apps/github/triggers/new-watchers/new-watchers.ts @@ -1,11 +1,8 @@ -import { - IGlobalVariable, - ITriggerOutput, -} from '@automatisch/types'; +import { IGlobalVariable, ITriggerOutput } from '@automatisch/types'; import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo'; import parseLinkHeader from '../../../../helpers/parse-header-link'; -const fetchWatchers = async ($: IGlobalVariable) => { +const newWatchers = async ($: IGlobalVariable) => { const repoParameter = $.step.parameters.repo as string; if (!repoParameter) throw new Error('A repo must be set!'); @@ -15,9 +12,9 @@ const fetchWatchers = async ($: IGlobalVariable) => { const firstPagePathname = `/repos/${repoOwner}/${repo}/subscribers`; const requestConfig = { params: { - per_page: 100 + per_page: 100, }, - } + }; const firstPageResponse = await $.http.get(firstPagePathname, requestConfig); const firstPageLinks = parseLinkHeader(firstPageResponse.headers.link); @@ -25,20 +22,11 @@ const fetchWatchers = async ($: IGlobalVariable) => { // in case there is only single page to fetch let pathname = firstPageLinks.last?.uri || firstPagePathname; - const watchers: ITriggerOutput = { - data: [], - }; - do { const response = await $.http.get(pathname, requestConfig); const links = parseLinkHeader(response.headers.link); pathname = links.prev?.uri; - if (response.integrationError) { - watchers.error = response.integrationError; - return watchers; - } - if (response.data.length) { // to iterate reverse-chronologically response.data.reverse(); @@ -46,7 +34,8 @@ const fetchWatchers = async ($: IGlobalVariable) => { for (const watcher of response.data) { const watcherId = watcher.id.toString(); - if ($.flow.isAlreadyProcessed(watcherId) && !$.execution.testRun) return watchers; + if ($.flow.isAlreadyProcessed(watcherId) && !$.execution.testRun) + return; const dataItem = { raw: watcher, @@ -55,21 +44,10 @@ const fetchWatchers = async ($: IGlobalVariable) => { }, }; - watchers.data.push(dataItem); + $.pushTriggerItem(dataItem); } } } while (pathname && !$.execution.testRun === false); - - return watchers; -} - -const newWatchers = async ($: IGlobalVariable) => { - const watchers = await fetchWatchers($); - - // to process chronologically - watchers.data.reverse(); - - return watchers; }; export default newWatchers; diff --git a/packages/backend/src/apps/twitter/common/get-user-followers.ts b/packages/backend/src/apps/twitter/common/get-user-followers.ts index 45d47d3f..cc174311 100644 --- a/packages/backend/src/apps/twitter/common/get-user-followers.ts +++ b/packages/backend/src/apps/twitter/common/get-user-followers.ts @@ -1,8 +1,4 @@ -import { - IGlobalVariable, - IJSONObject, - ITriggerOutput, -} from '@automatisch/types'; +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; import { URLSearchParams } from 'url'; import { omitBy, isEmpty } from 'lodash'; @@ -16,10 +12,6 @@ const getUserFollowers = async ( ) => { let response; - const followers: ITriggerOutput = { - data: [], - }; - do { const params: IJSONObject = { pagination_token: response?.data?.meta?.next_token, @@ -40,18 +32,16 @@ const getUserFollowers = async ( if (response.data.meta.result_count > 0) { for (const follower of response.data.data) { if ($.flow.isAlreadyProcessed(follower.id as string)) { - return followers; + return; } - followers.data.push({ + $.pushTriggerItem({ raw: follower, meta: { internalId: follower.id as string }, }); } } } while (response.data.meta.next_token && !$.execution.testRun); - - return followers; }; export default getUserFollowers; diff --git a/packages/backend/src/apps/twitter/triggers/my-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/my-tweets/index.ts index 8f9f4475..cfcd13f2 100644 --- a/packages/backend/src/apps/twitter/triggers/my-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/my-tweets/index.ts @@ -21,9 +21,7 @@ export default defineTrigger({ await getUserTweets($, { currentUser: true }); }, - sort($) { - $.triggerOutput.data.sort((tweet, nextTweet) => { - return Number(nextTweet.meta.internalId) - Number(tweet.meta.internalId); - }); + sort(tweet, nextTweet) { + return Number(nextTweet.meta.internalId) - Number(tweet.meta.internalId); }, }); diff --git a/packages/backend/src/apps/twitter/triggers/new-follower-of-me/index.ts b/packages/backend/src/apps/twitter/triggers/new-follower-of-me/index.ts index 8f5fe4f6..19adfd6c 100644 --- a/packages/backend/src/apps/twitter/triggers/new-follower-of-me/index.ts +++ b/packages/backend/src/apps/twitter/triggers/new-follower-of-me/index.ts @@ -19,6 +19,6 @@ export default defineTrigger({ ], async run($) { - return await myFollowers($); + await myFollowers($); }, }); diff --git a/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts index 3e69afd2..506bbe83 100644 --- a/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts @@ -34,9 +34,7 @@ export default defineTrigger({ await searchTweets($); }, - sort($) { - $.triggerOutput.data.sort((tweet, nextTweet) => { - return Number(nextTweet.meta.internalId) - Number(tweet.meta.internalId); - }); + sort(tweet, nextTweet) { + return Number(nextTweet.meta.internalId) - Number(tweet.meta.internalId); }, }); diff --git a/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts index 783fe028..dab530ae 100644 --- a/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts @@ -33,9 +33,7 @@ export default defineTrigger({ await getUserTweets($, { currentUser: false }); }, - sort($) { - $.triggerOutput.data.sort((tweet, nextTweet) => { - return Number(nextTweet.meta.internalId) - Number(tweet.meta.internalId); - }); + sort(tweet, nextTweet) { + return Number(nextTweet.meta.internalId) - Number(tweet.meta.internalId); }, }); diff --git a/packages/backend/src/helpers/global-variable.ts b/packages/backend/src/helpers/global-variable.ts index 26291fa9..1db67650 100644 --- a/packages/backend/src/helpers/global-variable.ts +++ b/packages/backend/src/helpers/global-variable.ts @@ -3,7 +3,13 @@ import Connection from '../models/connection'; import Flow from '../models/flow'; import Step from '../models/step'; import Execution from '../models/execution'; -import { IJSONObject, IApp, IGlobalVariable } from '@automatisch/types'; +import { + IJSONObject, + IApp, + IGlobalVariable, + ITriggerItem, + IActionItem, +} from '@automatisch/types'; type GlobalVariableOptions = { connection?: Connection; @@ -61,11 +67,15 @@ const globalVariable = async ( }, triggerOutput: { data: [], - error: null, }, actionOutput: { data: null, - error: null, + }, + pushTriggerItem: (triggerItem: ITriggerItem) => { + $.triggerOutput.data.push(triggerItem); + }, + setActionItem: (actionItem: IActionItem) => { + $.actionOutput.data = actionItem; }, }; diff --git a/packages/backend/src/services/action.ts b/packages/backend/src/services/action.ts index b4c3f66c..aefdeaf3 100644 --- a/packages/backend/src/services/action.ts +++ b/packages/backend/src/services/action.ts @@ -39,16 +39,29 @@ export const processAction = async (options: ProcessActionOptions) => { const actionCommand = await step.getActionCommand(); $.step.parameters = computedParameters; - const actionOutput = await actionCommand.run($); + + try { + await actionCommand.run($); + } catch (error) { + if (error?.response?.httpError) { + $.actionOutput.error = error.response.httpError; + } else { + try { + $.actionOutput.error = JSON.parse(error.message); + } catch { + $.actionOutput.error = { error: error.message }; + } + } + } const executionStep = await execution .$relatedQuery('executionSteps') .insertAndFetch({ stepId: $.step.id, - status: actionOutput.error ? 'failure' : 'success', + status: $.actionOutput.error ? 'failure' : 'success', dataIn: computedParameters, - dataOut: actionOutput.error ? null : actionOutput.data?.raw, - errorDetails: actionOutput.error ? actionOutput.error : null, + dataOut: $.actionOutput.error ? null : $.actionOutput.data?.raw, + errorDetails: $.actionOutput.error ? $.actionOutput.error : null, }); return { flowId, stepId, executionId, executionStep }; diff --git a/packages/backend/src/services/flow.ts b/packages/backend/src/services/flow.ts index 1a333872..4cde0fd7 100644 --- a/packages/backend/src/services/flow.ts +++ b/packages/backend/src/services/flow.ts @@ -35,7 +35,7 @@ export const processFlow = async (options: ProcessFlowOptions) => { } if (triggerCommand?.sort) { - triggerCommand.sort($); + $.triggerOutput.data.sort(triggerCommand.sort); } return $.triggerOutput; diff --git a/packages/backend/src/services/test-run.ts b/packages/backend/src/services/test-run.ts index 950aecc3..4d18028d 100644 --- a/packages/backend/src/services/test-run.ts +++ b/packages/backend/src/services/test-run.ts @@ -35,13 +35,13 @@ const testRun = async (options: TestRunOptions) => { return { executionStep: triggerExecutionStepWithError }; } - const firstTriggerDataItem = data[0]; + const firstTriggerItem = data[0]; const { executionId, executionStep: triggerExecutionStep } = await processTrigger({ flowId: flow.id, stepId: triggerStep.id, - triggerDataItem: firstTriggerDataItem, + triggerItem: firstTriggerItem, testRun: true, }); diff --git a/packages/backend/src/services/trigger.ts b/packages/backend/src/services/trigger.ts index 265f2bb6..8cfdc974 100644 --- a/packages/backend/src/services/trigger.ts +++ b/packages/backend/src/services/trigger.ts @@ -1,4 +1,4 @@ -import { IJSONObject, ITriggerDataItem } from '@automatisch/types'; +import { IJSONObject, ITriggerItem } from '@automatisch/types'; import Step from '../models/step'; import Flow from '../models/flow'; import Execution from '../models/execution'; @@ -7,13 +7,13 @@ import globalVariable from '../helpers/global-variable'; type ProcessTriggerOptions = { flowId: string; stepId: string; - triggerDataItem?: ITriggerDataItem; + triggerItem?: ITriggerItem; error?: IJSONObject; testRun?: boolean; }; export const processTrigger = async (options: ProcessTriggerOptions) => { - const { flowId, stepId, triggerDataItem, error, testRun } = options; + const { flowId, stepId, triggerItem, error, testRun } = options; const step = await Step.query().findById(stepId).throwIfNotFound(); @@ -29,7 +29,7 @@ export const processTrigger = async (options: ProcessTriggerOptions) => { const execution = await Execution.query().insert({ flowId: $.flow.id, testRun, - internalId: triggerDataItem?.meta.internalId, + internalId: triggerItem?.meta.internalId, }); const executionStep = await execution @@ -38,7 +38,7 @@ export const processTrigger = async (options: ProcessTriggerOptions) => { stepId: $.step.id, status: error ? 'failure' : 'success', dataIn: $.step.parameters, - dataOut: !error ? triggerDataItem?.raw : null, + dataOut: !error ? triggerItem?.raw : null, errorDetails: error, }); diff --git a/packages/backend/src/workers/flow.ts b/packages/backend/src/workers/flow.ts index 917583cf..d8dc670a 100644 --- a/packages/backend/src/workers/flow.ts +++ b/packages/backend/src/workers/flow.ts @@ -15,13 +15,15 @@ export const worker = new Worker( const { data, error } = await processFlow({ flowId }); - for (const triggerDataItem of data) { - const jobName = `${triggerStep.id}-${triggerDataItem.meta.internalId}`; + const reversedData = data.reverse(); + + for (const triggerItem of reversedData) { + const jobName = `${triggerStep.id}-${triggerItem.meta.internalId}`; const jobPayload = { flowId, stepId: triggerStep.id, - triggerDataItem, + triggerItem, }; await triggerQueue.add(jobName, jobPayload); diff --git a/packages/backend/src/workers/trigger.ts b/packages/backend/src/workers/trigger.ts index f82f568d..8d64e032 100644 --- a/packages/backend/src/workers/trigger.ts +++ b/packages/backend/src/workers/trigger.ts @@ -1,7 +1,7 @@ import { Worker } from 'bullmq'; import redisConfig from '../config/redis'; import logger from '../helpers/logger'; -import { IJSONObject, ITriggerDataItem } from '@automatisch/types'; +import { IJSONObject, ITriggerItem } from '@automatisch/types'; import actionQueue from '../queues/action'; import Step from '../models/step'; import { processTrigger } from '../services/trigger'; @@ -9,7 +9,7 @@ import { processTrigger } from '../services/trigger'; type JobData = { flowId: string; stepId: string; - triggerDataItem?: ITriggerDataItem; + triggerItem?: ITriggerItem; error?: IJSONObject; }; diff --git a/packages/types/index.d.ts b/packages/types/index.d.ts index 35808c4e..c1580321 100644 --- a/packages/types/index.d.ts +++ b/packages/types/index.d.ts @@ -194,11 +194,11 @@ export interface IService { } export interface ITriggerOutput { - data: ITriggerDataItem[]; + data: ITriggerItem[]; error?: IJSONObject; } -export interface ITriggerDataItem { +export interface ITriggerItem { raw: IJSONObject; meta: { internalId: string; @@ -212,17 +212,17 @@ export interface ITrigger { description: string; dedupeStrategy?: 'greatest' | 'unique' | 'last'; substeps: ISubstep[]; - getInterval?(parameters: IGlobalVariable['step']['parameters']): string; - run($: IGlobalVariable): Promise; - sort?($: IGlobalVariable): void | ITriggerOutput; + getInterval?(parameters: IStep['parameters']): string; + run($: IGlobalVariable): Promise; + sort?(item: ITriggerItem, nextItem: ITriggerItem): number; } export interface IActionOutput { - data: IActionDataItem; + data: IActionItem; error?: IJSONObject; } -export interface IActionDataItem { +export interface IActionItem { raw: { data?: IJSONObject; }; @@ -233,7 +233,7 @@ export interface IAction { key: string; description: string; substeps: ISubstep[]; - run($: IGlobalVariable): Promise; + run($: IGlobalVariable): Promise; } export interface IAuthentication { @@ -282,7 +282,8 @@ export type IGlobalVariable = { }; triggerOutput?: ITriggerOutput; actionOutput?: IActionOutput; - process?: (triggerDataItem: ITriggerDataItem) => Promise; + pushTriggerItem?: (triggerItem: ITriggerItem) => void; + setActionItem?: (actionItem: IActionItem) => void; }; declare module 'axios' { From 2bb058da361a2b2e8a1d5a2a17f7bf6bbe8772f9 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Sat, 22 Oct 2022 19:50:25 +0200 Subject: [PATCH 12/15] fix: Adjust action item of slack post message --- .../slack/actions/send-a-message-to-channel/post-message.ts | 6 +++++- packages/backend/src/helpers/global-variable.ts | 4 +++- packages/types/index.d.ts | 4 +--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts b/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts index efa05731..c19e61d0 100644 --- a/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts +++ b/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts @@ -16,7 +16,11 @@ const postMessage = async ( throw new Error(JSON.stringify(response.data)); } - $.actionOutput.data.raw = response?.data?.message; + const message = { + raw: response?.data?.message, + }; + + $.setActionItem(message); }; export default postMessage; diff --git a/packages/backend/src/helpers/global-variable.ts b/packages/backend/src/helpers/global-variable.ts index 1db67650..5ba1b1e3 100644 --- a/packages/backend/src/helpers/global-variable.ts +++ b/packages/backend/src/helpers/global-variable.ts @@ -69,7 +69,9 @@ const globalVariable = async ( data: [], }, actionOutput: { - data: null, + data: { + raw: null, + }, }, pushTriggerItem: (triggerItem: ITriggerItem) => { $.triggerOutput.data.push(triggerItem); diff --git a/packages/types/index.d.ts b/packages/types/index.d.ts index c1580321..d2e337f3 100644 --- a/packages/types/index.d.ts +++ b/packages/types/index.d.ts @@ -223,9 +223,7 @@ export interface IActionOutput { } export interface IActionItem { - raw: { - data?: IJSONObject; - }; + raw: IJSONObject; } export interface IAction { From b0dc0adf0e47e823ea94f245597246512a4272c9 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Sat, 22 Oct 2022 21:09:38 +0200 Subject: [PATCH 13/15] chore: Remove postgresql app with the old architecture --- .../src/apps/postgresql/assets/favicon.svg | 10 - .../src/apps/postgresql/authentication.ts | 39 ---- .../backend/src/apps/postgresql/index.d.ts | 0 packages/backend/src/apps/postgresql/index.ts | 15 -- .../backend/src/apps/postgresql/info.json | 201 ------------------ 5 files changed, 265 deletions(-) delete mode 100644 packages/backend/src/apps/postgresql/assets/favicon.svg delete mode 100644 packages/backend/src/apps/postgresql/authentication.ts delete mode 100644 packages/backend/src/apps/postgresql/index.d.ts delete mode 100644 packages/backend/src/apps/postgresql/index.ts delete mode 100644 packages/backend/src/apps/postgresql/info.json diff --git a/packages/backend/src/apps/postgresql/assets/favicon.svg b/packages/backend/src/apps/postgresql/assets/favicon.svg deleted file mode 100644 index 0bdb3e3e..00000000 --- a/packages/backend/src/apps/postgresql/assets/favicon.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/packages/backend/src/apps/postgresql/authentication.ts b/packages/backend/src/apps/postgresql/authentication.ts deleted file mode 100644 index 5f3db4a9..00000000 --- a/packages/backend/src/apps/postgresql/authentication.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { IAuthentication, IApp, IJSONObject } from '@automatisch/types'; -import { Client } from 'pg'; - -export default class Authentication implements IAuthentication { - appData: IApp; - connectionData: IJSONObject; - client: Client; - - constructor(appData: IApp, connectionData: IJSONObject) { - this.client = new Client({ - host: connectionData.host as string, - port: connectionData.port as number, - database: connectionData.database as string, - user: connectionData.username as string, - password: connectionData.password as string, - ssl: connectionData.ssl as boolean, - }); - - this.connectionData = connectionData; - this.appData = appData; - } - - async verifyCredentials() { - await this.client.connect(); - - return { - screenName: this.connectionData.database, - }; - } - - async isStillVerified() { - try { - await this.client.connect(); - return true; - } catch (error) { - return false; - } - } -} diff --git a/packages/backend/src/apps/postgresql/index.d.ts b/packages/backend/src/apps/postgresql/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/postgresql/index.ts b/packages/backend/src/apps/postgresql/index.ts deleted file mode 100644 index 24a44bec..00000000 --- a/packages/backend/src/apps/postgresql/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Authentication from './authentication'; -import { - IService, - IAuthentication, - IApp, - IJSONObject, -} from '@automatisch/types'; - -export default class PostgreSQL implements IService { - authenticationClient: IAuthentication; - - constructor(appData: IApp, connectionData: IJSONObject) { - this.authenticationClient = new Authentication(appData, connectionData); - } -} diff --git a/packages/backend/src/apps/postgresql/info.json b/packages/backend/src/apps/postgresql/info.json deleted file mode 100644 index 535b9394..00000000 --- a/packages/backend/src/apps/postgresql/info.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "name": "PostgreSQL", - "key": "postgresql", - "iconUrl": "{BASE_URL}/apps/postgresql/assets/favicon.svg", - "docUrl": "https://automatisch.io/docs/postgresql", - "primaryColor": "2DAAE1", - "supportsConnections": true, - "fields": [ - { - "key": "host", - "label": "Host", - "type": "string", - "required": true, - "readOnly": false, - "value": null, - "placeholder": null, - "description": "The host information Automatisch will connect to.", - "docUrl": "https://automatisch.io/docs/postgresql#host", - "clickToCopy": false - }, - { - "key": "port", - "label": "Port", - "type": "integer", - "required": true, - "readOnly": false, - "value": 5432, - "placeholder": null, - "description": null, - "docUrl": "https://automatisch.io/docs/postgresql#port", - "clickToCopy": false - }, - { - "key": "database", - "label": "Database", - "type": "string", - "required": true, - "readOnly": false, - "value": null, - "placeholder": null, - "description": "The name of the database.", - "docUrl": "https://automatisch.io/docs/postgresql#password", - "clickToCopy": false - }, - { - "key": "username", - "label": "Username", - "type": "string", - "required": true, - "readOnly": false, - "value": null, - "placeholder": null, - "description": null, - "docUrl": "https://automatisch.io/docs/postgresql#username", - "clickToCopy": false - }, - { - "key": "password", - "label": "Password", - "type": "string", - "required": false, - "readOnly": false, - "value": null, - "placeholder": null, - "description": null, - "docUrl": "https://automatisch.io/docs/postgresql#password", - "clickToCopy": false - }, - { - "key": "ssl", - "label": "Use SSL?", - "type": "boolean", - "required": true, - "readOnly": false, - "value": false, - "placeholder": null, - "description": null, - "docUrl": "https://automatisch.io/docs/postgresql#ssl", - "clickToCopy": false - } - ], - "authenticationSteps": [ - { - "step": 1, - "type": "mutation", - "name": "createConnection", - "arguments": [ - { - "name": "key", - "value": "{key}" - }, - { - "name": "formattedData", - "value": null, - "properties": [ - { - "name": "host", - "value": "{fields.host}" - }, - { - "name": "port", - "value": "{fields.port}" - }, - { - "name": "database", - "value": "{fields.database}" - }, - { - "name": "username", - "value": "{fields.username}" - }, - { - "name": "password", - "value": "{fields.password}" - }, - { - "name": "ssl", - "value": "{fields.ssl}" - } - ] - } - ] - }, - { - "step": 2, - "type": "mutation", - "name": "verifyConnection", - "arguments": [ - { - "name": "id", - "value": "{createConnection.id}" - } - ] - } - ], - "reconnectionSteps": [ - { - "step": 1, - "type": "mutation", - "name": "resetConnection", - "arguments": [ - { - "name": "id", - "value": "{connection.id}" - } - ] - }, - { - "step": 2, - "type": "mutation", - "name": "updateConnection", - "arguments": [ - { - "name": "id", - "value": "{connection.id}" - }, - { - "name": "formattedData", - "value": null, - "properties": [ - { - "name": "host", - "value": "{fields.host}" - }, - { - "name": "port", - "value": "{fields.port}" - }, - { - "name": "database", - "value": "{fields.database}" - }, - { - "name": "username", - "value": "{fields.username}" - }, - { - "name": "password", - "value": "{fields.password}" - }, - { - "name": "ssl", - "value": "{fields.ssl}" - } - ] - } - ] - }, - { - "step": 3, - "type": "mutation", - "name": "verifyConnection", - "arguments": [ - { - "name": "id", - "value": "{connection.id}" - } - ] - } - ] -} From d5cecde0e19de2280b87c46091b1a52e8cdfdcc3 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Sat, 22 Oct 2022 21:47:21 +0200 Subject: [PATCH 14/15] fix: Adjust sorting for new pull requests --- .../new-pull-requests/new-pull-requests.ts | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts b/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts index e827b546..ad26c9d9 100644 --- a/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts +++ b/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts @@ -1,8 +1,8 @@ -import { IGlobalVariable, ITriggerOutput } from '@automatisch/types'; +import { IGlobalVariable } from '@automatisch/types'; import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo'; import parseLinkHeader from '../../../../helpers/parse-header-link'; -const fetchPullRequests = async ($: IGlobalVariable) => { +const newPullRequests = async ($: IGlobalVariable) => { const repoParameter = $.step.parameters.repo as string; if (!repoParameter) throw new Error('A repo must be set!'); @@ -17,10 +17,6 @@ const fetchPullRequests = async ($: IGlobalVariable) => { per_page: 100, }; - const pullRequests: ITriggerOutput = { - data: [], - }; - let links; do { const response = await $.http.get(pathname, { params }); @@ -34,7 +30,7 @@ const fetchPullRequests = async ($: IGlobalVariable) => { pullRequestId <= Number($.flow.lastInternalId) && !$.execution.testRun ) - return pullRequests; + return; const dataItem = { raw: pullRequest, @@ -43,20 +39,10 @@ const fetchPullRequests = async ($: IGlobalVariable) => { }, }; - pullRequests.data.push(dataItem); + $.pushTriggerItem(dataItem); } } } while (links.next && !$.execution.testRun); - - return pullRequests; -}; - -const newPullRequests = async ($: IGlobalVariable) => { - const pullRequests = await fetchPullRequests($); - - pullRequests.data.reverse(); - - return pullRequests; }; export default newPullRequests; From a1692c3c37778c468b169f2d4cf31257b73ea867 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Sat, 22 Oct 2022 21:47:39 +0200 Subject: [PATCH 15/15] fix: Adjust sorting for new stargazers trigger --- .../backend/src/apps/github/triggers/new-stargazers/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/apps/github/triggers/new-stargazers/index.ts b/packages/backend/src/apps/github/triggers/new-stargazers/index.ts index cf033f96..5584e022 100644 --- a/packages/backend/src/apps/github/triggers/new-stargazers/index.ts +++ b/packages/backend/src/apps/github/triggers/new-stargazers/index.ts @@ -46,7 +46,7 @@ export default defineTrigger({ sort(stargazerA, stargazerB) { return ( - Number(stargazerA.meta.internalId) - Number(stargazerB.meta.internalId) + Number(stargazerB.meta.internalId) - Number(stargazerA.meta.internalId) ); }, });