feat: Create flow model and graphQL mutation

This commit is contained in:
Faruk AYDIN
2021-11-22 16:34:13 +01:00
committed by Ömer Faruk Aydın
parent b42cb759a5
commit 8a7d54bb25
12 changed files with 159 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
import CreateTweet from './actions/create-tweet';
export default class Actions {
createTweet: any
constructor(connectionData: any) {
this.createTweet = new CreateTweet(connectionData)
}
}

View File

@@ -0,0 +1,27 @@
import TwitterApi from 'twitter-api-v2';
export default class CreateTweet {
client: any
parameters: any
constructor(connectionData: any, parameters: any) {
this.client = new TwitterApi({
appKey: connectionData.consumerKey,
appSecret: connectionData.consumerSecret,
accessToken: connectionData.accessToken,
accessSecret: connectionData.accessSecret
});
this.parameters = parameters;
}
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];
}
}

View File

@@ -1,12 +1,15 @@
import Authentication from './authentication';
import Triggers from './triggers';
import Actions from './actions';
export default class Twitter {
authenticationClient: any
triggers: any
actions: any
constructor(connectionData: any) {
this.authenticationClient = new Authentication(connectionData);
this.triggers = new Triggers(connectionData);
this.actions = new Actions(connectionData);
}
}

View File

@@ -226,5 +226,19 @@
"key": "userTweet",
"description": "Will be triggered when a specific user tweet something new."
}
],
"actions": [
{
"name": "Create Tweet",
"key": "createTweet",
"description": "Will create a tweet.",
"parameters" : [
{
"name": "Message",
"key": "message",
"required": true
}
]
}
]
}

View File

@@ -0,0 +1,15 @@
import { Knex } from "knex";
export async function up(knex: Knex): Promise<void> {
return knex.schema.createTable('flows', (table) => {
table.increments('id');
table.string('name');
table.integer('user_id').references('id').inTable('users');
table.timestamps(true, true);
});
};
export async function down(knex: Knex): Promise<void> {
return knex.schema.dropTable('flows');
}

View File

@@ -0,0 +1,17 @@
import { Knex } from "knex";
export async function up(knex: Knex): Promise<void> {
return knex.schema.table('steps', (table) => {
table
.integer('flow_id')
.references('id')
.inTable('flows');
});
}
export async function down(knex: Knex): Promise<void> {
return knex.schema.table('steps', (table) => {
table.dropColumn('flow_id');
});
}

View File

@@ -11,6 +11,7 @@ type Params = {
}
const createConnectionResolver = async (params: Params, req: RequestWithCurrentUser) => {
const app = App.findOneByKey(params.key);
const connection = await Connection.query().insert({
key: params.key,
data: params.data,

View File

@@ -0,0 +1,18 @@
import Flow from '../../models/flow';
import flowType from '../types/flow';
import RequestWithCurrentUser from '../../types/express/request-with-current-user';
const createFlowResolver = async (req: RequestWithCurrentUser) => {
const flow = await Flow.query().insert({
userId: req.currentUser.id
});
return flow;
}
const createFlow = {
type: flowType,
resolve: (_: any, _params: any, req: RequestWithCurrentUser) => createFlowResolver(req)
};
export default createFlow;

View File

@@ -5,6 +5,7 @@ import updateConnection from './mutations/update-connection';
import resetConnection from './mutations/reset-connection';
import verifyConnection from './mutations/verify-connection';
import deleteConnection from './mutations/delete-connection';
import createFlow from './mutations/create-flow';
import createStep from './mutations/create-step';
import executeStep from './mutations/execute-step';
@@ -17,6 +18,7 @@ const rootMutation = new GraphQLObjectType({
resetConnection,
verifyConnection,
deleteConnection,
createFlow,
createStep,
executeStep
}

View File

@@ -0,0 +1,10 @@
import { GraphQLObjectType, GraphQLString } from 'graphql';
const flowType = new GraphQLObjectType({
name: 'Flow',
fields: {
name: { type: GraphQLString }
}
})
export default flowType;

View File

@@ -0,0 +1,31 @@
import Base from './base'
import Step from './step'
class Flow extends Base {
id!: number
userId!: number
static tableName = 'flows';
static jsonSchema = {
type: 'object',
properties: {
id: { type: 'integer' },
userId: { type: 'integer' }
}
}
static relationMappings = () => ({
steps: {
relation: Base.HasManyRelation,
modelClass: Step,
join: {
from: 'flows.id',
to: 'steps.flow_id',
},
}
})
}
export default Flow;

View File

@@ -1,4 +1,5 @@
import Base from './base'
import Flow from './flow'
enum StepEnumType {
'trigger',
@@ -28,6 +29,17 @@ class Step extends Base {
parameters: { type: 'object' },
}
}
static relationMappings = () => ({
flow: {
relation: Base.BelongsToOneRelation,
modelClass: Flow,
join: {
from: 'step.flow_id',
to: 'flows.id',
},
}
})
}
export default Step;