From c66de455226c1cf3daf2da844b4e34b26426d035 Mon Sep 17 00:00:00 2001 From: BennyKok Date: Mon, 1 Jan 2024 23:13:01 +0800 Subject: [PATCH] feat(all): add organisation, api updates with organisation check Now calling run endpoints with GET, POST will check against the API key, whether there is org_id or not, if the operation workflow doesnt match with the user org or user id, will return with workflow not found, run not found --- web/bun.lockb | Bin 451715 -> 452063 bytes web/drizzle/0016_overrated_cable.sql | 2 + web/drizzle/meta/0016_snapshot.json | 675 ++++++++++++++++++ web/drizzle/meta/_journal.json | 7 + web/package.json | 1 + web/src/app/(app)/api/run/route.ts | 78 +- web/src/app/(app)/api/upload/route.ts | 1 + web/src/app/(app)/layout.tsx | 13 +- web/src/app/(app)/machines/page.tsx | 9 +- web/src/app/(app)/workflows/page.tsx | 9 +- .../{NavbarRight.tsx => NavbarMenu.tsx} | 8 +- web/src/components/VersionDetails.tsx | 2 +- web/src/components/VersionSelect.tsx | 8 +- web/src/db/schema.ts | 7 + web/src/server/APIKeyBodyRequest.ts | 2 + web/src/server/createRun.ts | 73 +- web/src/server/curdApiKeys.ts | 12 +- web/src/server/curdMachine.ts | 3 +- web/src/server/getRunsOutput.tsx | 56 +- 19 files changed, 907 insertions(+), 59 deletions(-) create mode 100644 web/drizzle/0016_overrated_cable.sql create mode 100644 web/drizzle/meta/0016_snapshot.json rename web/src/components/{NavbarRight.tsx => NavbarMenu.tsx} (86%) diff --git a/web/bun.lockb b/web/bun.lockb index da357e6decfde015c88dd84378e54b47471c102c..83956cba26f71f2db40f320f5491e5a649fed4db 100755 GIT binary patch delta 68013 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 statement-breakpoint +ALTER TABLE "comfyui_deploy"."workflows" ADD COLUMN "org_id" text; \ No newline at end of file diff --git a/web/drizzle/meta/0016_snapshot.json b/web/drizzle/meta/0016_snapshot.json new file mode 100644 index 0000000..dfb8ba9 --- /dev/null +++ b/web/drizzle/meta/0016_snapshot.json @@ -0,0 +1,675 @@ +{ + "id": "89f22940-a898-4086-8a65-5f9c40fc7f0d", + "prevId": "92bef822-0089-48aa-8f43-5bba40cdce2e", + "version": "5", + "dialect": "pg", + "tables": { + "api_keys": { + "name": "api_keys", + "schema": "comfyui_deploy", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "org_id": { + "name": "org_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "revoked": { + "name": "revoked", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "api_keys_user_id_users_id_fk": { + "name": "api_keys_user_id_users_id_fk", + "tableFrom": "api_keys", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "api_keys_key_unique": { + "name": "api_keys_key_unique", + "nullsNotDistinct": false, + "columns": [ + "key" + ] + } + } + }, + "deployments": { + "name": "deployments", + "schema": "comfyui_deploy", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workflow_version_id": { + "name": "workflow_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "machine_id": { + "name": "machine_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "environment": { + "name": "environment", + "type": "deployment_environment", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "deployments_user_id_users_id_fk": { + "name": "deployments_user_id_users_id_fk", + "tableFrom": "deployments", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployments_workflow_version_id_workflow_versions_id_fk": { + "name": "deployments_workflow_version_id_workflow_versions_id_fk", + "tableFrom": "deployments", + "tableTo": "workflow_versions", + "columnsFrom": [ + "workflow_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "deployments_workflow_id_workflows_id_fk": { + "name": "deployments_workflow_id_workflows_id_fk", + "tableFrom": "deployments", + "tableTo": "workflows", + "columnsFrom": [ + "workflow_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "deployments_machine_id_machines_id_fk": { + "name": "deployments_machine_id_machines_id_fk", + "tableFrom": "deployments", + "tableTo": "machines", + "columnsFrom": [ + "machine_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "machines": { + "name": "machines", + "schema": "comfyui_deploy", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "org_id": { + "name": "org_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "disabled": { + "name": "disabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "auth_token": { + "name": "auth_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "machine_type", + "primaryKey": false, + "notNull": true, + "default": "'classic'" + } + }, + "indexes": {}, + "foreignKeys": { + "machines_user_id_users_id_fk": { + "name": "machines_user_id_users_id_fk", + "tableFrom": "machines", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "comfyui_deploy", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "workflow_run_outputs": { + "name": "workflow_run_outputs", + "schema": "comfyui_deploy", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "run_id": { + "name": "run_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "data": { + "name": "data", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "workflow_run_outputs_run_id_workflow_runs_id_fk": { + "name": "workflow_run_outputs_run_id_workflow_runs_id_fk", + "tableFrom": "workflow_run_outputs", + "tableTo": "workflow_runs", + "columnsFrom": [ + "run_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "workflow_runs": { + "name": "workflow_runs", + "schema": "comfyui_deploy", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "workflow_version_id": { + "name": "workflow_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "workflow_inputs": { + "name": "workflow_inputs", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "workflow_id": { + "name": "workflow_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "machine_id": { + "name": "machine_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "origin": { + "name": "origin", + "type": "workflow_run_origin", + "primaryKey": false, + "notNull": true, + "default": "'api'" + }, + "status": { + "name": "status", + "type": "workflow_run_status", + "primaryKey": false, + "notNull": true, + "default": "'not-started'" + }, + "ended_at": { + "name": "ended_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "workflow_runs_workflow_version_id_workflow_versions_id_fk": { + "name": "workflow_runs_workflow_version_id_workflow_versions_id_fk", + "tableFrom": "workflow_runs", + "tableTo": "workflow_versions", + "columnsFrom": [ + "workflow_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "workflow_runs_workflow_id_workflows_id_fk": { + "name": "workflow_runs_workflow_id_workflows_id_fk", + "tableFrom": "workflow_runs", + "tableTo": "workflows", + "columnsFrom": [ + "workflow_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workflow_runs_machine_id_machines_id_fk": { + "name": "workflow_runs_machine_id_machines_id_fk", + "tableFrom": "workflow_runs", + "tableTo": "machines", + "columnsFrom": [ + "machine_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "workflows": { + "name": "workflows", + "schema": "comfyui_deploy", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "org_id": { + "name": "org_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "workflows_user_id_users_id_fk": { + "name": "workflows_user_id_users_id_fk", + "tableFrom": "workflows", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "workflow_versions": { + "name": "workflow_versions", + "schema": "comfyui_deploy", + "columns": { + "workflow_id": { + "name": "workflow_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "workflow": { + "name": "workflow", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "workflow_api": { + "name": "workflow_api", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "version": { + "name": "version", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "workflow_versions_workflow_id_workflows_id_fk": { + "name": "workflow_versions_workflow_id_workflows_id_fk", + "tableFrom": "workflow_versions", + "tableTo": "workflows", + "columnsFrom": [ + "workflow_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "deployment_environment": { + "name": "deployment_environment", + "values": { + "staging": "staging", + "production": "production" + } + }, + "machine_type": { + "name": "machine_type", + "values": { + "classic": "classic", + "runpod-serverless": "runpod-serverless" + } + }, + "workflow_run_origin": { + "name": "workflow_run_origin", + "values": { + "manual": "manual", + "api": "api" + } + }, + "workflow_run_status": { + "name": "workflow_run_status", + "values": { + "not-started": "not-started", + "running": "running", + "uploading": "uploading", + "success": "success", + "failed": "failed" + } + } + }, + "schemas": { + "comfyui_deploy": "comfyui_deploy" + }, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + } +} \ No newline at end of file diff --git a/web/drizzle/meta/_journal.json b/web/drizzle/meta/_journal.json index 85e9471..8b479fd 100644 --- a/web/drizzle/meta/_journal.json +++ b/web/drizzle/meta/_journal.json @@ -113,6 +113,13 @@ "when": 1703409502387, "tag": "0015_simple_killmonger", "breakpoints": true + }, + { + "idx": 16, + "version": "5", + "when": 1704092053001, + "tag": "0016_overrated_cable", + "breakpoints": true } ] } \ No newline at end of file diff --git a/web/package.json b/web/package.json index c075a23..808e4cb 100644 --- a/web/package.json +++ b/web/package.json @@ -61,6 +61,7 @@ "lucide-react": "^0.294.0", "mdast-util-to-string": "^4.0.0", "mdx-annotations": "^0.1.4", + "mitata": "^0.1.6", "nanoid": "^5.0.4", "next": "14.0.3", "next-plausible": "^3.12.0", diff --git a/web/src/app/(app)/api/run/route.ts b/web/src/app/(app)/api/run/route.ts index 8d54482..a613814 100644 --- a/web/src/app/(app)/api/run/route.ts +++ b/web/src/app/(app)/api/run/route.ts @@ -25,26 +25,57 @@ async function checkToken(request: Request) { const token = request.headers.get("Authorization")?.split(" ")?.[1]; // Assuming token is sent as "Bearer your_token" const userData = token ? parseJWT(token) : undefined; if (!userData || token === undefined) { - return new NextResponse("Invalid or expired token", { - status: 401, - }); + return { + error: new NextResponse("Invalid or expired token", { + status: 401, + }), + }; } else { const revokedKey = await isKeyRevoked(token); if (revokedKey) - return new NextResponse("Revoked token", { - status: 401, - }); + return { + error: new NextResponse("Revoked token", { + status: 401, + }), + }; } + + return { + data: userData, + }; } export async function GET(request: Request) { - const invalidRequest = await checkToken(request); - if (invalidRequest) return invalidRequest; + const apiKeyTokenData = await checkToken(request); + if (apiKeyTokenData.error) return apiKeyTokenData.error; const [data, error] = await parseDataSafe(Request2, request); if (!data || error) return error; - const run = await getRunsData(data.run_id); + // return NextResponse.json( + // await db + // .select() + // .from(workflowTable) + // .innerJoin( + // workflowRunsTable, + // eq(workflowTable.id, workflowRunsTable.workflow_id) + // ) + // .where( + // and( + // eq(workflowTable.id, workflowRunsTable.workflow_id), + // apiKeyTokenData.data.org_id + // ? eq(workflowTable.org_id, apiKeyTokenData.data.org_id) + // : eq(workflowTable.user_id, apiKeyTokenData.data.user_id!) + // ) + // ), + // { + // status: 200, + // } + // ); + + const run = await getRunsData(apiKeyTokenData.data, data.run_id); + + if (!run) return new NextResponse("Run not found", { status: 404 }); if (run?.status === "success" && run?.outputs?.length > 0) { for (let i = 0; i < run.outputs.length; i++) { @@ -74,8 +105,8 @@ export async function GET(request: Request) { } export async function POST(request: Request) { - const invalidRequest = await checkToken(request); - if (invalidRequest) return invalidRequest; + const apiKeyTokenData = await checkToken(request); + if (apiKeyTokenData.error) return apiKeyTokenData.error; const [data, error] = await parseDataSafe(Request, request); if (!data || error) return error; @@ -87,16 +118,31 @@ export async function POST(request: Request) { try { const deploymentData = await db.query.deploymentsTable.findFirst({ where: eq(deploymentsTable.id, deployment_id), + with: { + machine: true, + version: { + with: { + workflow: { + columns: { + org_id: true, + user_id: true, + }, + }, + }, + }, + }, }); if (!deploymentData) throw new Error("Deployment not found"); - const run_id = await createRun( + const run_id = await createRun({ origin, - deploymentData.workflow_version_id, - deploymentData.machine_id, - inputs - ); + workflow_version_id: deploymentData.version, + machine_id: deploymentData.machine, + inputs, + isManualRun: false, + apiUser: apiKeyTokenData.data, + }); if ("error" in run_id) throw new Error(run_id.error); diff --git a/web/src/app/(app)/api/upload/route.ts b/web/src/app/(app)/api/upload/route.ts index f3325a8..93fe167 100644 --- a/web/src/app/(app)/api/upload/route.ts +++ b/web/src/app/(app)/api/upload/route.ts @@ -79,6 +79,7 @@ export async function POST(request: Request) { .values({ user_id, name: workflow_name, + org_id: org_id, }) .returning(); diff --git a/web/src/app/(app)/layout.tsx b/web/src/app/(app)/layout.tsx index 88d2976..437bf5b 100644 --- a/web/src/app/(app)/layout.tsx +++ b/web/src/app/(app)/layout.tsx @@ -1,8 +1,8 @@ import "./globals.css"; -import { NavbarRight } from "@/components/NavbarRight"; +import { NavbarMenu } from "@/components/NavbarMenu"; import { Button } from "@/components/ui/button"; import { TooltipProvider } from "@/components/ui/tooltip"; -import { ClerkProvider, UserButton } from "@clerk/nextjs"; +import { ClerkProvider, OrganizationSwitcher, UserButton } from "@clerk/nextjs"; import { Github } from "lucide-react"; import type { Metadata } from "next"; import meta from "next-gen/config"; @@ -54,9 +54,16 @@ export default function RootLayout({ > {meta.name} - +
+