diff --git a/builder/modal-builder/.env.example b/builder/modal-builder/.env.example index 69285d7..40f6f24 100644 --- a/builder/modal-builder/.env.example +++ b/builder/modal-builder/.env.example @@ -1,3 +1,5 @@ MODAL_TOKEN_ID= MODAL_TOKEN_SECRET= + +# On production set to False DEPLOY_TEST_FLAG=True \ No newline at end of file diff --git a/web/src/app/(app)/api/upload/route.ts b/web/src/app/(app)/api/upload/route.ts index c6c2d8f..6a1a68d 100644 --- a/web/src/app/(app)/api/upload/route.ts +++ b/web/src/app/(app)/api/upload/route.ts @@ -1,9 +1,9 @@ +import { createNewWorkflow } from "../../../../server/createNewWorkflow"; import { parseJWT } from "../../../../server/parseJWT"; import { db } from "@/db/db"; import { snapshotType, workflowAPIType, - workflowTable, workflowType, workflowVersionTable, } from "@/db/schema"; @@ -76,29 +76,44 @@ export async function POST(request: Request) { try { if ((!workflow_id || workflow_id.length == 0) && workflow_name) { // Create a new parent workflow - const workflow_parent = await db - .insert(workflowTable) - .values({ - user_id, - name: workflow_name, + const { workflow_id: _workflow_id, version: _version } = + await createNewWorkflow({ + user_id: user_id, org_id: org_id, - }) - .returning(); + workflow_name: workflow_name, + workflowData: { + workflow, + workflow_api, + snapshot, + }, + }); - workflow_id = workflow_parent[0].id; + workflow_id = _workflow_id; + version = _version; - // Create a new version - const data = await db - .insert(workflowVersionTable) - .values({ - workflow_id: workflow_id, - workflow, - workflow_api, - version: 1, - snapshot: snapshot, - }) - .returning(); - version = data[0].version; + // const workflow_parent = await db + // .insert(workflowTable) + // .values({ + // user_id, + // name: workflow_name, + // org_id: org_id, + // }) + // .returning(); + + // workflow_id = workflow_parent[0].id; + + // // Create a new version + // const data = await db + // .insert(workflowVersionTable) + // .values({ + // workflow_id: workflow_id, + // workflow, + // workflow_api, + // version: 1, + // snapshot: snapshot, + // }) + // .returning(); + // version = data[0].version; } else if (workflow_id) { // Case 2 update workflow const data = await db diff --git a/web/src/app/(app)/share/[share_id]/page.tsx b/web/src/app/(app)/share/[share_id]/page.tsx index 7693d50..ae8de65 100644 --- a/web/src/app/(app)/share/[share_id]/page.tsx +++ b/web/src/app/(app)/share/[share_id]/page.tsx @@ -1,7 +1,9 @@ +import { ButtonAction } from "@/components/ButtonActionLoader"; import { PublicRunOutputs, RunWorkflowInline, } from "@/components/VersionSelect"; +import { Button } from "@/components/ui/button"; import { Card, CardContent, @@ -14,7 +16,7 @@ import { usersTable } from "@/db/schema"; import { getInputsFromWorkflow } from "@/lib/getInputsFromWorkflow"; import { getRelativeTime } from "@/lib/getRelativeTime"; import { setInitialUserData } from "@/lib/setInitialUserData"; -import { findSharedDeployment } from "@/server/curdDeploments"; +import { cloneWorkflow, findSharedDeployment } from "@/server/curdDeploments"; import { auth, clerkClient } from "@clerk/nextjs/server"; import { eq } from "drizzle-orm"; import { redirect } from "next/navigation"; @@ -55,10 +57,19 @@ export default async function Page({
- - {userName} - {" / "} - {sharedDeployment.workflow.name} + +
+ {userName} + {" / "} + {sharedDeployment.workflow.name} +
+
{getRelativeTime(sharedDeployment?.updated_at)} diff --git a/web/src/server/createNewWorkflow.ts b/web/src/server/createNewWorkflow.ts new file mode 100644 index 0000000..3636ff9 --- /dev/null +++ b/web/src/server/createNewWorkflow.ts @@ -0,0 +1,46 @@ +import { db } from "@/db/db"; +import type { WorkflowVersionType } from "@/db/schema"; +import { workflowTable, workflowVersionTable } from "@/db/schema"; + +export async function createNewWorkflow({ + workflow_name, + user_id, + org_id, + workflowData, +}: { + workflow_name: string; + user_id: string; + org_id?: string; + workflowData: Pick< + WorkflowVersionType, + "workflow" | "workflow_api" | "snapshot" + >; +}) { + // Create a new parent workflow + const workflow_parent = await db + .insert(workflowTable) + .values({ + user_id, + name: workflow_name, + org_id: org_id, + }) + .returning(); + + const workflow_id = workflow_parent[0].id; + + // Create a new version + const data = await db + .insert(workflowVersionTable) + .values({ + workflow_id: workflow_id, + version: 1, + ...workflowData, + }) + .returning(); + const version = data[0].version; + + return { + workflow_id, + version, + }; +} diff --git a/web/src/server/curdDeploments.ts b/web/src/server/curdDeploments.ts index 398418b..0a0d2f4 100644 --- a/web/src/server/curdDeploments.ts +++ b/web/src/server/curdDeploments.ts @@ -3,10 +3,12 @@ import { db } from "@/db/db"; import type { DeploymentType } from "@/db/schema"; import { deploymentsTable, workflowTable } from "@/db/schema"; +import { createNewWorkflow } from "@/server/createNewWorkflow"; import { withServerPromise } from "@/server/withServerPromise"; import { auth } from "@clerk/nextjs"; import { and, eq, isNull } from "drizzle-orm"; import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; import "server-only"; export async function createDeployments( @@ -18,6 +20,10 @@ export async function createDeployments( const { userId } = auth(); if (!userId) throw new Error("No user id"); + if (!machine_id) { + throw new Error("No machine id provided"); + } + // Same environment and same workflow const existingDeployment = await db.query.deploymentsTable.findFirst({ where: and( @@ -108,7 +114,6 @@ export async function findSharedDeployment(workflow_id: string) { export const removePublicShareDeployment = withServerPromise( async (deployment_id: string) => { - // throw new Error("Not implemented"); await db .delete(deploymentsTable) .where( @@ -119,3 +124,41 @@ export const removePublicShareDeployment = withServerPromise( ); } ); + +export const cloneWorkflow = withServerPromise( + async (deployment_id: string) => { + const deployment = await db.query.deploymentsTable.findFirst({ + where: and( + eq(deploymentsTable.environment, "public-share"), + eq(deploymentsTable.id, deployment_id) + ), + with: { + version: true, + workflow: true, + }, + }); + + if (!deployment) throw new Error("No deployment found"); + + const { userId, orgId } = auth(); + + if (!userId) throw new Error("No user id"); + + await createNewWorkflow({ + user_id: userId, + org_id: orgId, + workflow_name: `${deployment.workflow.name} (Cloned)`, + workflowData: { + workflow: deployment.version.workflow, + workflow_api: deployment?.version.workflow_api, + snapshot: deployment?.version.snapshot, + }, + }); + + redirect(`/workflows/${deployment.workflow.id}`); + + return { + message: "Successfully cloned workflow", + }; + } +);