feat: Create flow model and graphQL mutation
This commit is contained in:

committed by
Ömer Faruk Aydın

parent
b42cb759a5
commit
8a7d54bb25
9
packages/backend/src/apps/twitter/actions.ts
Normal file
9
packages/backend/src/apps/twitter/actions.ts
Normal 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)
|
||||
}
|
||||
}
|
27
packages/backend/src/apps/twitter/actions/create-tweet.ts
Normal file
27
packages/backend/src/apps/twitter/actions/create-tweet.ts
Normal 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];
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@@ -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');
|
||||
}
|
@@ -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');
|
||||
});
|
||||
}
|
@@ -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,
|
||||
|
18
packages/backend/src/graphql/mutations/create-flow.ts
Normal file
18
packages/backend/src/graphql/mutations/create-flow.ts
Normal 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;
|
@@ -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
|
||||
}
|
||||
|
10
packages/backend/src/graphql/types/flow.ts
Normal file
10
packages/backend/src/graphql/types/flow.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { GraphQLObjectType, GraphQLString } from 'graphql';
|
||||
|
||||
const flowType = new GraphQLObjectType({
|
||||
name: 'Flow',
|
||||
fields: {
|
||||
name: { type: GraphQLString }
|
||||
}
|
||||
})
|
||||
|
||||
export default flowType;
|
31
packages/backend/src/models/flow.ts
Normal file
31
packages/backend/src/models/flow.ts
Normal 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;
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user