From b42cb759a56e687b229205b4d510dadefe43616c Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 19 Nov 2021 18:21:04 +0100 Subject: [PATCH] feat: Introduce my tweet trigger with execute step mutation --- packages/backend/src/apps/twitter/index.ts | 3 ++ packages/backend/src/apps/twitter/triggers.ts | 9 +++++ .../src/apps/twitter/triggers/my-tweet.ts | 24 +++++++++++++ .../src/graphql/mutations/execute-step.ts | 36 +++++++++++++++++++ packages/backend/src/graphql/root-mutation.ts | 2 ++ 5 files changed, 74 insertions(+) create mode 100644 packages/backend/src/apps/twitter/triggers.ts create mode 100644 packages/backend/src/apps/twitter/triggers/my-tweet.ts create mode 100644 packages/backend/src/graphql/mutations/execute-step.ts diff --git a/packages/backend/src/apps/twitter/index.ts b/packages/backend/src/apps/twitter/index.ts index f3c10d21..837cbc7f 100644 --- a/packages/backend/src/apps/twitter/index.ts +++ b/packages/backend/src/apps/twitter/index.ts @@ -1,9 +1,12 @@ import Authentication from './authentication'; +import Triggers from './triggers'; export default class Twitter { authenticationClient: any + triggers: any constructor(connectionData: any) { this.authenticationClient = new Authentication(connectionData); + this.triggers = new Triggers(connectionData); } } diff --git a/packages/backend/src/apps/twitter/triggers.ts b/packages/backend/src/apps/twitter/triggers.ts new file mode 100644 index 00000000..535c1e20 --- /dev/null +++ b/packages/backend/src/apps/twitter/triggers.ts @@ -0,0 +1,9 @@ +import MyTweet from './triggers/my-tweet'; + +export default class Triggers { + myTweet: any + + constructor(connectionData: any) { + this.myTweet = new MyTweet(connectionData) + } +} diff --git a/packages/backend/src/apps/twitter/triggers/my-tweet.ts b/packages/backend/src/apps/twitter/triggers/my-tweet.ts new file mode 100644 index 00000000..b461a81a --- /dev/null +++ b/packages/backend/src/apps/twitter/triggers/my-tweet.ts @@ -0,0 +1,24 @@ +import TwitterApi from 'twitter-api-v2'; + +export default class MyTweet { + client: any + + constructor(connectionData: any) { + this.client = new TwitterApi({ + appKey: connectionData.consumerKey, + appSecret: connectionData.consumerSecret, + accessToken: connectionData.accessToken, + accessSecret: connectionData.accessSecret + }); + } + + async run() { + const response = await this.client.currentUser(); + const username = response.screen_name; + + const userTimeline = await this.client.v1.userTimelineByUsername(username); + const fetchedTweets = userTimeline.tweets; + + return fetchedTweets[0]; + } +} diff --git a/packages/backend/src/graphql/mutations/execute-step.ts b/packages/backend/src/graphql/mutations/execute-step.ts new file mode 100644 index 00000000..ad993c4d --- /dev/null +++ b/packages/backend/src/graphql/mutations/execute-step.ts @@ -0,0 +1,36 @@ +import { GraphQLString, GraphQLNonNull } from 'graphql'; +import App from '../../models/app'; +import Connection from '../../models/connection'; +import Step from '../../models/step'; +import stepType from '../types/step'; +import RequestWithCurrentUser from '../../types/express/request-with-current-user'; + +type Params = { + id: string, + data: object +} +const executeStepResolver = async (params: Params, req: RequestWithCurrentUser) => { + let step = await Step.query().findOne({ + id: params.id + }) + + let connection = await Connection.query().findOne({ + id: step.connectionId + }) + + const appClass = (await import(`../../apps/${step.appKey}`)).default; + const appInstance = new appClass(connection.data); + await appInstance.triggers[step.key].run(); + + return step; +} + +const executeStep = { + type: stepType, + args: { + id: { type: GraphQLNonNull(GraphQLString) } + }, + resolve: (_: any, params: Params, req: RequestWithCurrentUser) => executeStepResolver(params, req) +}; + +export default executeStep; diff --git a/packages/backend/src/graphql/root-mutation.ts b/packages/backend/src/graphql/root-mutation.ts index a50b4be5..a5f616de 100644 --- a/packages/backend/src/graphql/root-mutation.ts +++ b/packages/backend/src/graphql/root-mutation.ts @@ -6,6 +6,7 @@ import resetConnection from './mutations/reset-connection'; import verifyConnection from './mutations/verify-connection'; import deleteConnection from './mutations/delete-connection'; import createStep from './mutations/create-step'; +import executeStep from './mutations/execute-step'; const rootMutation = new GraphQLObjectType({ name: 'Mutation', @@ -17,6 +18,7 @@ const rootMutation = new GraphQLObjectType({ verifyConnection, deleteConnection, createStep, + executeStep } });