Skip to content

Commit a4c2d2e

Browse files
committed
implements google form node
1 parent 22a3cc3 commit a4c2d2e

File tree

21 files changed

+437
-14
lines changed

21 files changed

+437
-14
lines changed

mprocs.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,8 @@ procs:
55

66
next:
77
description: Run Next.js development server
8-
cmd: ["npm", "run", "dev"]
8+
cmd: ["npm", "run", "dev"]
9+
10+
ngrok:
11+
description: Run Next.js development server
12+
cmd: ["npm", "run", "ngrok:dev"]

package-lock.json

Lines changed: 94 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
"lint": "biome check",
1010
"format": "biome format --write",
1111
"inngest:dev": "inngest-cli dev",
12-
"dev:all": "mprocs"
12+
"dev:all": "dotenv -- mprocs",
13+
"ngrok:dev": "dotenv -- ngrok http --url=$NGROK_URL 3000"
1314
},
1415
"dependencies": {
1516
"@ai-sdk/google": "^2.0.26",
@@ -93,6 +94,7 @@
9394
"@types/react": "^19",
9495
"@types/react-dom": "^19",
9596
"@types/toposort": "^2.0.7",
97+
"dotenv-cli": "^11.0.0",
9698
"inngest-cli": "^1.13.2",
9799
"mprocs": "^0.7.3",
98100
"prisma": "^6.18.0",
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterEnum
2+
ALTER TYPE "NodeType" ADD VALUE 'GOOGLE_FORM_TRIGGER';

prisma/schema.prisma

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ enum NodeType {
8383
INITIAL
8484
MANUAL_TRIGGER
8585
HTTP_REQUEST
86+
GOOGLE_FORM_TRIGGER
8687
}
8788

8889
model Node {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { sendWorkflowExecution } from "@/inngest/utils";
2+
import { NextResponse, type NextRequest } from "next/server";
3+
4+
export async function POST(req: NextRequest) {
5+
try {
6+
const url = new URL(req.url);
7+
const workflowId = url.searchParams.get("workflowId");
8+
9+
if (!workflowId) {
10+
return NextResponse.json({
11+
success: false,
12+
error: "Query Parameter workflowId is required",
13+
status: 400,
14+
});
15+
}
16+
17+
const body = await req.json();
18+
19+
const formData = {
20+
...body,
21+
raw: body,
22+
};
23+
24+
await sendWorkflowExecution({
25+
workflowId,
26+
initialData: {
27+
googleForm: formData,
28+
},
29+
});
30+
31+
return NextResponse.json({
32+
success: true,
33+
status: 200,
34+
});
35+
} catch (error) {
36+
console.error("Google from webhook error: ", error);
37+
return NextResponse.json({
38+
success: false,
39+
error: "Failed to process google form submission",
40+
status: 500,
41+
});
42+
}
43+
}

src/components/react-flow/NodeSelector.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ const triggerNodes: NodeTypeOption[] = [
2929
"Runs flow when clicking a button. Good for getting started quickly",
3030
icon: MousePointerIcon,
3131
},
32+
{
33+
type: NodeType.GOOGLE_FORM_TRIGGER,
34+
label: "Google Form",
35+
description: "Runs flow when a Google Form is submitted",
36+
icon: "/logos/googleform.svg",
37+
},
3238
];
3339

3440
const execNodes: NodeTypeOption[] = [

src/config/nodeTypes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import InitialNode from "@/components/react-flow/InitialNode";
2+
import GoogleFormTriggerNode from "@/features/executions/components/google-form-trigger/Node";
23
import HttpRequestNode from "@/features/executions/components/http-request/Node";
34
import ManualTriggerNode from "@/features/executions/components/manual-trigger/Node";
45
import { NodeType } from "@prisma/client";
@@ -8,6 +9,7 @@ export const nodeTypes = {
89
[NodeType.INITIAL]: InitialNode,
910
[NodeType.MANUAL_TRIGGER]: ManualTriggerNode,
1011
[NodeType.HTTP_REQUEST]: HttpRequestNode,
12+
[NodeType.GOOGLE_FORM_TRIGGER]: GoogleFormTriggerNode,
1113
} as const satisfies NodeTypes;
1214

1315
export type RegisteredNodeType = keyof typeof nodeTypes;

src/features/executions/ExecutorRegistry.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { NodeType } from "@prisma/client";
22
import { manualTriggerExecutor } from "@/features/executions/components/manual-trigger/Executor";
3-
import { HttpRequestExecutor } from "./components/http-request/Executor";
3+
import { httpRequestExecutor } from "./components/http-request/Executor";
44
import type { GetStepTools, Inngest } from "inngest";
55
import type { Realtime } from "@inngest/realtime";
6+
import { googleFormTriggerExecutor } from "./components/google-form-trigger/Executor";
67

78
export type WorkflowContext = Record<string, unknown>;
89

@@ -23,7 +24,8 @@ export type NodeExecutor<TData = Record<string, unknown>> = (
2324
const executorRegistry: Record<NodeType, NodeExecutor> = {
2425
[NodeType.MANUAL_TRIGGER]: manualTriggerExecutor,
2526
[NodeType.INITIAL]: manualTriggerExecutor,
26-
[NodeType.HTTP_REQUEST]: HttpRequestExecutor as NodeExecutor,
27+
[NodeType.HTTP_REQUEST]: httpRequestExecutor as NodeExecutor,
28+
[NodeType.GOOGLE_FORM_TRIGGER]: googleFormTriggerExecutor,
2729
};
2830

2931
export const getExecutor = (type: NodeType): NodeExecutor => {

0 commit comments

Comments
 (0)