From 7d36f8af8824edd8753476cfc3ba530af5881dd2 Mon Sep 17 00:00:00 2001 From: BennyKok Date: Tue, 9 Jan 2024 14:00:16 +0800 Subject: [PATCH] feat: add interactive api docs, rewrite run endpoint with hono and zod validator --- web/bun.lockb | Bin 471928 -> 544725 bytes web/package.json | 7 + web/src/app/(app)/api/[[...routes]]/route.ts | 295 ++++++++++++++++++ web/src/app/(app)/api/run/route.ts | 167 ---------- web/src/app/(docs)/docs/endpoints/page.mdx | 91 ++++++ web/src/components/docs/Navigation.tsx | 4 + web/src/components/docs/SwaggerUIClient.css | 3 + web/src/components/docs/SwaggerUIClient.tsx | 39 +++ web/src/components/docs/mdx.tsx | 7 + web/src/lib/drizzle-zod-hono.ts | 309 +++++++++++++++++++ web/src/server/getRunsOutput.tsx | 24 +- 11 files changed, 756 insertions(+), 190 deletions(-) create mode 100644 web/src/app/(app)/api/[[...routes]]/route.ts delete mode 100644 web/src/app/(app)/api/run/route.ts create mode 100644 web/src/app/(docs)/docs/endpoints/page.mdx create mode 100644 web/src/components/docs/SwaggerUIClient.css create mode 100644 web/src/components/docs/SwaggerUIClient.tsx create mode 100644 web/src/lib/drizzle-zod-hono.ts diff --git a/web/bun.lockb b/web/bun.lockb index 907bdf8329065de2550274520529899af032c768..6cd3e69f1d057c3fa595fa419d5ddb96f3cb77d6 100755 GIT binary patch delta 142115 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 diff --git a/web/package.json b/web/package.json index 173a59b..918f4e6 100644 --- a/web/package.json +++ b/web/package.json @@ -21,6 +21,10 @@ "@clerk/nextjs": "^4.27.4", "@headlessui/react": "^1.7.17", "@headlessui/tailwindcss": "^0.2.0", + "@hono/node-server": "^1.4.0", + "@hono/swagger-ui": "^0.2.1", + "@hono/zod-openapi": "^0.9.5", + "@hono/zod-validator": "^0.1.11", "@hookform/resolvers": "^3.3.2", "@mdx-js/loader": "^3.0.0", "@mdx-js/react": "^3.0.0", @@ -46,6 +50,7 @@ "@tanstack/react-table": "^8.10.7", "@types/jsonwebtoken": "^9.0.5", "@types/react-highlight-words": "^0.16.7", + "@types/swagger-ui-react": "^4.18.3", "@types/uuid": "^9.0.7", "acorn": "^8.11.2", "class-variance-authority": "^0.7.0", @@ -58,6 +63,7 @@ "fast-glob": "^3.3.2", "flexsearch": "^0.7.31", "framer-motion": "^10.16.16", + "hono": "^3.12.0", "jsonwebtoken": "^9.0.2", "lucide-react": "^0.294.0", "mdast-util-to-string": "^4.0.0", @@ -83,6 +89,7 @@ "shikiji": "^0.9.3", "simple-functional-loader": "^1.2.1", "sonner": "^1.2.4", + "swagger-ui-react": "^5.11.0", "swr": "^2.2.4", "tailwind-merge": "^2.1.0", "tailwindcss-animate": "^1.0.7", diff --git a/web/src/app/(app)/api/[[...routes]]/route.ts b/web/src/app/(app)/api/[[...routes]]/route.ts new file mode 100644 index 0000000..d7dd327 --- /dev/null +++ b/web/src/app/(app)/api/[[...routes]]/route.ts @@ -0,0 +1,295 @@ +import { createRun } from "../../../../server/createRun"; +import { db } from "@/db/db"; +import { deploymentsTable, workflowRunsTable } from "@/db/schema"; +import { createSelectSchema } from "@/lib/drizzle-zod-hono"; +import { isKeyRevoked } from "@/server/curdApiKeys"; +import { getRunsData } from "@/server/getRunsOutput"; +import { parseJWT } from "@/server/parseJWT"; +import { replaceCDNUrl } from "@/server/replaceCDNUrl"; +import type { ResponseConfig } from "@asteasolutions/zod-to-openapi"; +import { z, createRoute } from "@hono/zod-openapi"; +import { OpenAPIHono } from "@hono/zod-openapi"; +import { eq } from "drizzle-orm"; +import { handle } from "hono/vercel"; + +export const dynamic = "force-dynamic"; + +export const app = new OpenAPIHono().basePath("/api"); + +declare module "hono" { + interface ContextVariableMap { + apiKeyTokenData: ReturnType; + } +} + +const authError = { + 401: { + content: { + "text/plain": { + schema: z.string().openapi({ + type: "string", + example: "Invalid or expired token", + }), + }, + }, + description: "Invalid or expired token", + }, +} satisfies { + [statusCode: string]: ResponseConfig; +}; + +app.use("/run", async (c, next) => { + const token = c.req.raw.headers.get("Authorization")?.split(" ")?.[1]; // Assuming token is sent as "Bearer your_token" + const userData = token ? parseJWT(token) : undefined; + if (!userData || token === undefined) { + return c.text("Invalid or expired token", 401); + } else { + const revokedKey = await isKeyRevoked(token); + if (revokedKey) return c.text("Revoked token", 401); + } + + c.set("apiKeyTokenData", userData); + + await next(); +}); + +// console.log(RunOutputZod.shape); + +const getOutputRoute = createRoute({ + method: "get", + path: "/run", + tags: ["workflows"], + summary: "Get workflow run output", + description: + "Call this to get a run's output, usually in conjunction with polling method", + request: { + query: z.object({ + run_id: z.string(), + }), + }, + responses: { + 200: { + content: { + "application/json": { + // https://github.com/asteasolutions/zod-to-openapi/issues/194 + schema: createSelectSchema(workflowRunsTable, { + workflow_inputs: (schema) => + schema.workflow_inputs.openapi({ + type: "object", + example: { + input_text: "some external text input", + input_image: "https://somestatic.png", + }, + }), + }), + }, + }, + description: "Retrieve the output", + }, + 400: { + content: { + "application/json": { + schema: z.object({ + code: z.number().openapi({ + type: "string", + example: 400, + }), + message: z.string().openapi({ + type: "string", + example: "Workflow not found", + }), + }), + }, + }, + description: "Workflow not found", + }, + 500: { + content: { + "application/json": { + schema: z.object({ + error: z.string(), + }), + }, + }, + description: "Error getting output", + }, + ...authError, + }, +}); + +app.openapi(getOutputRoute, async (c) => { + const data = c.req.valid("query"); + const apiKeyTokenData = c.get("apiKeyTokenData")!; + + try { + const run = await getRunsData(apiKeyTokenData, data.run_id); + + if (!run) + return c.json( + { + code: 400, + message: "Workflow not found", + }, + 400 + ); + + // Fill in the CDN url + if (run?.status === "success" && run?.outputs?.length > 0) { + for (let i = 0; i < run.outputs.length; i++) { + const output = run.outputs[i]; + + if (output.data?.images !== undefined) { + for (let j = 0; j < output.data?.images.length; j++) { + const element = output.data?.images[j]; + element.url = replaceCDNUrl( + `${process.env.SPACES_ENDPOINT}/${process.env.SPACES_BUCKET}/outputs/runs/${run.id}/${element.filename}` + ); + } + } else if (output.data?.files !== undefined) { + for (let j = 0; j < output.data?.files.length; j++) { + const element = output.data?.files[j]; + element.url = replaceCDNUrl( + `${process.env.SPACES_ENDPOINT}/${process.env.SPACES_BUCKET}/outputs/runs/${run.id}/${element.filename}` + ); + } + } + } + } + + return c.json(run, 200); + } catch (error: any) { + return c.json( + { + error: error.message, + }, + { + status: 500, + } + ); + } +}); + +const createRunRoute = createRoute({ + method: "post", + path: "/run", + tags: ["workflows"], + summary: "Run a workflow via deployment_id", + request: { + body: { + content: { + "application/json": { + schema: z.object({ + deployment_id: z.string(), + inputs: z.record(z.string()).optional(), + }), + }, + }, + }, + // headers: z.object({ + // "Authorization": z. + // }) + }, + responses: { + 200: { + content: { + "application/json": { + schema: z.object({ + run_id: z.string(), + }), + }, + }, + description: "Workflow queued", + }, + 500: { + content: { + "application/json": { + schema: z.object({ + error: z.string(), + }), + }, + }, + description: "Error creating run", + }, + ...authError, + }, +}); + +app.openapi(createRunRoute, async (c) => { + const data = c.req.valid("json"); + const origin = new URL(c.req.url).origin; + const apiKeyTokenData = c.get("apiKeyTokenData")!; + + const { deployment_id, inputs } = data; + + 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({ + origin, + workflow_version_id: deploymentData.version, + machine_id: deploymentData.machine, + inputs, + isManualRun: false, + apiUser: apiKeyTokenData, + }); + + if ("error" in run_id) throw new Error(run_id.error); + + return c.json({ + run_id: "workflow_run_id" in run_id ? run_id.workflow_run_id : "", + }); + } catch (error: any) { + return c.json( + { + error: error.message, + }, + { + status: 500, + } + ); + } +}); + +// The OpenAPI documentation will be available at /doc +app.doc("/doc", { + openapi: "3.0.0", + servers: [{ url: "/api" }], + security: [{ bearerAuth: [] }], + info: { + version: "0.0.1", + title: "Comfy Deploy API", + description: + "Interact with Comfy Deploy programmatically to trigger run and retrieve output", + }, +}); + +app.openAPIRegistry.registerComponent("securitySchemes", "bearerAuth", { + type: "apiKey", + bearerFormat: "JWT", + in: "header", + name: "Authorization", + description: + "API token created in Comfy Deploy /api-keys", +}); + +const handler = handle(app); + +export const GET = handler; +export const POST = handler; diff --git a/web/src/app/(app)/api/run/route.ts b/web/src/app/(app)/api/run/route.ts deleted file mode 100644 index a613814..0000000 --- a/web/src/app/(app)/api/run/route.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { parseDataSafe } from "../../../../lib/parseDataSafe"; -import { createRun } from "../../../../server/createRun"; -import { db } from "@/db/db"; -import { deploymentsTable } from "@/db/schema"; -import { isKeyRevoked } from "@/server/curdApiKeys"; -import { getRunsData } from "@/server/getRunsOutput"; -import { parseJWT } from "@/server/parseJWT"; -import { replaceCDNUrl } from "@/server/replaceCDNUrl"; -import { eq } from "drizzle-orm"; -import { NextResponse } from "next/server"; -import { z } from "zod"; - -export const dynamic = "force-dynamic"; - -const Request = z.object({ - deployment_id: z.string(), - inputs: z.record(z.string()).optional(), -}); - -const Request2 = z.object({ - run_id: z.string(), -}); - -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 { - error: new NextResponse("Invalid or expired token", { - status: 401, - }), - }; - } else { - const revokedKey = await isKeyRevoked(token); - if (revokedKey) - return { - error: new NextResponse("Revoked token", { - status: 401, - }), - }; - } - - return { - data: userData, - }; -} - -export async function GET(request: Request) { - const apiKeyTokenData = await checkToken(request); - if (apiKeyTokenData.error) return apiKeyTokenData.error; - - const [data, error] = await parseDataSafe(Request2, request); - if (!data || error) return error; - - // 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++) { - const output = run.outputs[i]; - - if (output.data?.images !== undefined) { - for (let j = 0; j < output.data?.images.length; j++) { - const element = output.data?.images[j]; - element.url = replaceCDNUrl( - `${process.env.SPACES_ENDPOINT}/${process.env.SPACES_BUCKET}/outputs/runs/${run.id}/${element.filename}` - ); - } - } else if (output.data?.files !== undefined) { - for (let j = 0; j < output.data?.files.length; j++) { - const element = output.data?.files[j]; - element.url = replaceCDNUrl( - `${process.env.SPACES_ENDPOINT}/${process.env.SPACES_BUCKET}/outputs/runs/${run.id}/${element.filename}` - ); - } - } - } - } - - return NextResponse.json(run, { - status: 200, - }); -} - -export async function POST(request: Request) { - const apiKeyTokenData = await checkToken(request); - if (apiKeyTokenData.error) return apiKeyTokenData.error; - - const [data, error] = await parseDataSafe(Request, request); - if (!data || error) return error; - - const origin = new URL(request.url).origin; - - const { deployment_id, inputs } = data; - - 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({ - origin, - 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); - - return NextResponse.json( - { - run_id: "workflow_run_id" in run_id ? run_id.workflow_run_id : "", - }, - { - status: 200, - } - ); - } catch (error: any) { - return NextResponse.json( - { - error: error.message, - }, - { - status: 500, - } - ); - } -} diff --git a/web/src/app/(docs)/docs/endpoints/page.mdx b/web/src/app/(docs)/docs/endpoints/page.mdx new file mode 100644 index 0000000..b88ebff --- /dev/null +++ b/web/src/app/(docs)/docs/endpoints/page.mdx @@ -0,0 +1,91 @@ +export const metadata = { + title: 'Workflow API', + description: + 'Get started with API integration to run any deploy ComfyUI workflow', +} + +{/* # Workflow API */} + +{/* Get started with API integration to run any deploy ComfyUI workflow */} + + + +{/* ## Trigger a run {{ tag: 'POST', label: '/api/run' }} + + + + + Trigger a run with a deployment id + + ### Optional attributes + + + + Limit to attachments from a given conversation. + + + Limit the number of attachments returned. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl -G https://api.protocol.chat/v1/attachments \ + -H "Authorization: Bearer {token}" \ + -d conversation_id="xgQQXg3hrtjh7AvZ" \ + -d limit=10 + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.attachments.list() + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.attachments.list() + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->attachments->list(); + ``` + + + + ```json {{ title: 'Response' }} + { + "has_more": false, + "data": [ + { + "id": "Nc6yKKMpcxiiFxp6", + "message_id": "LoPsJaMcPBuFNjg1", + "filename": "Invoice_room_service__Plaza_Hotel.pdf", + "file_url": "https://assets.protocol.chat/attachments/Invoice_room_service__Plaza_Hotel.pdf", + "file_type": "application/pdf", + "file_size": 21352, + "created_at": 692233200 + }, + { + "id": "hSIhXBhNe8X1d8Et" + // ... + } + ] + } + ``` + + + + +--- */} \ No newline at end of file diff --git a/web/src/components/docs/Navigation.tsx b/web/src/components/docs/Navigation.tsx index 29c62fa..ecef091 100644 --- a/web/src/components/docs/Navigation.tsx +++ b/web/src/components/docs/Navigation.tsx @@ -238,6 +238,10 @@ export const navigation: Array = [ { title: "Installation", href: "/docs/install" }, ], }, + { + title: "API", + links: [{ title: "Endpoints", href: "/docs/endpoints" }], + }, ]; export function Navigation(props: React.ComponentPropsWithoutRef<"nav">) { diff --git a/web/src/components/docs/SwaggerUIClient.css b/web/src/components/docs/SwaggerUIClient.css new file mode 100644 index 0000000..2a0c716 --- /dev/null +++ b/web/src/components/docs/SwaggerUIClient.css @@ -0,0 +1,3 @@ +.swagger-ui .info { + margin: 0 !important; +} \ No newline at end of file diff --git a/web/src/components/docs/SwaggerUIClient.tsx b/web/src/components/docs/SwaggerUIClient.tsx new file mode 100644 index 0000000..ceb7854 --- /dev/null +++ b/web/src/components/docs/SwaggerUIClient.tsx @@ -0,0 +1,39 @@ +"use client"; + +import "./SwaggerUIClient.css"; +import type { ComponentProps } from "react"; +import React from "react"; +import _SwaggerUI from "swagger-ui-react"; +import "swagger-ui-react/swagger-ui.css"; + +// Create the layout component +class AugmentingLayout extends React.Component { + render() { + const { getComponent } = this.props; + const BaseLayout = getComponent("BaseLayout", true); + return ( +

+ +
+ ); + } +} + +const AugmentingLayoutPlugin = () => { + return { + components: { + AugmentingLayout: AugmentingLayout, + }, + }; +}; + +export default function SwaggerUI(props: ComponentProps) { + return ( + <_SwaggerUI + {...props} + persistAuthorization={true} + plugins={[AugmentingLayoutPlugin]} + layout="AugmentingLayout" + /> + ); +} diff --git a/web/src/components/docs/mdx.tsx b/web/src/components/docs/mdx.tsx index 7f4a2ae..1be9302 100644 --- a/web/src/components/docs/mdx.tsx +++ b/web/src/components/docs/mdx.tsx @@ -2,9 +2,16 @@ import { Feedback } from "@/components/docs/Feedback"; import { Heading } from "@/components/docs/Heading"; import { Prose } from "@/components/docs/Prose"; import { cn } from "@/lib/utils"; +// import { SwaggerUI } from "@hono/swagger-ui"; import clsx from "clsx"; +import dynamic from "next/dynamic"; +// import _SwaggerUI from "swagger-ui-react"; import Link from "next/link"; +export const SwaggerUI = dynamic(() => import("./SwaggerUIClient"), { + ssr: false, +}); + export const a = Link; export { Button } from "@/components/docs/Button"; export { CodeGroup, Code as code, Pre as pre } from "@/components/docs/Code"; diff --git a/web/src/lib/drizzle-zod-hono.ts b/web/src/lib/drizzle-zod-hono.ts new file mode 100644 index 0000000..7174548 --- /dev/null +++ b/web/src/lib/drizzle-zod-hono.ts @@ -0,0 +1,309 @@ +import { z } from "@hono/zod-openapi"; +import { + type Assume, + type Column, + type DrizzleTypeError, + type Equal, + getTableColumns, + is, + type Simplify, + type Table, +} from "drizzle-orm"; +import { + MySqlChar, + MySqlVarBinary, + MySqlVarChar, +} from "drizzle-orm/mysql-core"; +import { type PgArray, PgChar, PgUUID, PgVarchar } from "drizzle-orm/pg-core"; +import { SQLiteText } from "drizzle-orm/sqlite-core"; + +const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]); +type Literal = z.infer; +type Json = Literal | { [key: string]: Json } | Json[]; +export const jsonSchema: z.ZodType = z.lazy(() => + z.union([literalSchema, z.array(jsonSchema), z.record(jsonSchema)]) +); + +type MapInsertColumnToZod< + TColumn extends Column, + TType extends z.ZodTypeAny +> = TColumn["_"]["notNull"] extends false + ? z.ZodOptional> + : TColumn["_"]["hasDefault"] extends true + ? z.ZodOptional + : TType; + +type MapSelectColumnToZod< + TColumn extends Column, + TType extends z.ZodTypeAny +> = TColumn["_"]["notNull"] extends false ? z.ZodNullable : TType; + +type MapColumnToZod< + TColumn extends Column, + TType extends z.ZodTypeAny, + TMode extends "insert" | "select" +> = TMode extends "insert" + ? MapInsertColumnToZod + : MapSelectColumnToZod; + +type MaybeOptional< + TColumn extends Column, + TType extends z.ZodTypeAny, + TMode extends "insert" | "select", + TNoOptional extends boolean +> = TNoOptional extends true ? TType : MapColumnToZod; + +type GetZodType = + TColumn["_"]["dataType"] extends infer TDataType + ? TDataType extends "custom" + ? z.ZodAny + : TDataType extends "json" + ? z.ZodType + : TColumn extends { enumValues: [string, ...string[]] } + ? Equal extends true + ? z.ZodString + : z.ZodEnum + : TDataType extends "array" + ? z.ZodArray< + GetZodType["baseColumn"]> + > + : TDataType extends "bigint" + ? z.ZodBigInt + : TDataType extends "number" + ? z.ZodNumber + : TDataType extends "string" + ? z.ZodString + : TDataType extends "boolean" + ? z.ZodBoolean + : TDataType extends "date" + ? // ? z.ZodDate + z.ZodString + : z.ZodAny + : never; + +type ValueOrUpdater = T | ((arg: TUpdaterArg) => T); + +type UnwrapValueOrUpdater = T extends ValueOrUpdater + ? U + : never; + +export type Refine = { + [K in keyof TTable["_"]["columns"]]?: ValueOrUpdater< + z.ZodTypeAny, + TMode extends "select" + ? BuildSelectSchema + : BuildInsertSchema + >; +}; + +export type BuildInsertSchema< + TTable extends Table, + TRefine extends Refine | {}, + TNoOptional extends boolean = false +> = TTable["_"]["columns"] extends infer TColumns extends Record< + string, + Column +> + ? { + [K in keyof TColumns & string]: MaybeOptional< + TColumns[K], + K extends keyof TRefine + ? Assume, z.ZodTypeAny> + : GetZodType, + "insert", + TNoOptional + >; + } + : never; + +export type BuildSelectSchema< + TTable extends Table, + TRefine extends Refine, + TNoOptional extends boolean = false +> = Simplify<{ + [K in keyof TTable["_"]["columns"]]: MaybeOptional< + TTable["_"]["columns"][K], + K extends keyof TRefine + ? Assume, z.ZodTypeAny> + : GetZodType, + "select", + TNoOptional + >; +}>; + +export function createInsertSchema< + TTable extends Table, + TRefine extends Refine = Refine +>( + table: TTable, + /** + * @param refine Refine schema fields + */ + refine?: { + [K in keyof TRefine]: K extends keyof TTable["_"]["columns"] + ? TRefine[K] + : DrizzleTypeError<`Column '${K & + string}' does not exist in table '${TTable["_"]["name"]}'`>; + } +): z.ZodObject< + BuildInsertSchema< + TTable, + Equal> extends true ? {} : TRefine + > +> { + const columns = getTableColumns(table); + const columnEntries = Object.entries(columns); + + let schemaEntries = Object.fromEntries( + columnEntries.map(([name, column]) => { + return [name, mapColumnToSchema(column)]; + }) + ); + + if (refine) { + schemaEntries = Object.assign( + schemaEntries, + Object.fromEntries( + Object.entries(refine).map(([name, refineColumn]) => { + return [ + name, + typeof refineColumn === "function" + ? refineColumn( + schemaEntries as BuildInsertSchema + ) + : refineColumn, + ]; + }) + ) + ); + } + + for (const [name, column] of columnEntries) { + if (!column.notNull) { + schemaEntries[name] = schemaEntries[name]!.nullable().optional(); + } else if (column.hasDefault) { + schemaEntries[name] = schemaEntries[name]!.optional(); + } + } + + return z.object(schemaEntries) as any; +} + +export function createSelectSchema< + TTable extends Table, + TRefine extends Refine = Refine +>( + table: TTable, + /** + * @param refine Refine schema fields + */ + refine?: { + [K in keyof TRefine]: K extends keyof TTable["_"]["columns"] + ? TRefine[K] + : DrizzleTypeError<`Column '${K & + string}' does not exist in table '${TTable["_"]["name"]}'`>; + } +): z.ZodObject< + BuildSelectSchema< + TTable, + Equal> extends true ? {} : TRefine + > +> { + const columns = getTableColumns(table); + const columnEntries = Object.entries(columns); + + let schemaEntries = Object.fromEntries( + columnEntries.map(([name, column]) => { + return [name, mapColumnToSchema(column)]; + }) + ); + + if (refine) { + schemaEntries = Object.assign( + schemaEntries, + Object.fromEntries( + Object.entries(refine).map(([name, refineColumn]) => { + return [ + name, + typeof refineColumn === "function" + ? refineColumn( + schemaEntries as BuildSelectSchema + ) + : refineColumn, + ]; + }) + ) + ); + } + + for (const [name, column] of columnEntries) { + if (!column.notNull) { + schemaEntries[name] = schemaEntries[name]!.nullable(); + } + } + + return z.object(schemaEntries) as any; +} + +function isWithEnum( + column: Column +): column is typeof column & { enumValues: [string, ...string[]] } { + return ( + "enumValues" in column && + Array.isArray(column.enumValues) && + column.enumValues.length > 0 + ); +} + +function mapColumnToSchema(column: Column): z.ZodTypeAny { + let type: z.ZodTypeAny | undefined; + + if (isWithEnum(column)) { + type = column.enumValues.length ? z.enum(column.enumValues) : z.string(); + } + + if (!type) { + if (is(column, PgUUID)) { + type = z.string().uuid(); + } else if (column.dataType === "custom") { + type = z.any(); + } else if (column.dataType === "json") { + type = jsonSchema; + } else if (column.dataType === "array") { + type = z.array( + mapColumnToSchema((column as PgArray).baseColumn) + ); + } else if (column.dataType === "number") { + type = z.number(); + } else if (column.dataType === "bigint") { + type = z.bigint(); + } else if (column.dataType === "boolean") { + type = z.boolean(); + } else if (column.dataType === "date") { + // type = z.date(); + type = z.string(); + } else if (column.dataType === "string") { + let sType = z.string(); + + if ( + (is(column, PgChar) || + is(column, PgVarchar) || + is(column, MySqlVarChar) || + is(column, MySqlVarBinary) || + is(column, MySqlChar) || + is(column, SQLiteText)) && + typeof column.length === "number" + ) { + sType = sType.max(column.length); + } + + type = sType; + } + } + + if (!type) { + type = z.any(); + } + + return type; +} diff --git a/web/src/server/getRunsOutput.tsx b/web/src/server/getRunsOutput.tsx index 8716fee..52d137c 100644 --- a/web/src/server/getRunsOutput.tsx +++ b/web/src/server/getRunsOutput.tsx @@ -20,29 +20,7 @@ export async function getRunsOutput(run_id: string) { export async function getRunsData(user: APIKeyUserType, run_id: string) { const data = await db.query.workflowRunsTable.findFirst({ - where: and( - eq(workflowRunsTable.id, run_id) - // inArray( - // workflowRunsTable.workflow_id, - // db - // .select({ - // id: workflowTable.id, - // }) - // .from(workflowTable) - // .innerJoin( - // workflowRunsTable, - // eq(workflowTable.id, workflowRunsTable.workflow_id) - // ) - // .where( - // and( - // eq(workflowTable.id, workflowRunsTable.workflow_id), - // user.org_id - // ? eq(workflowTable.org_id, user.org_id) - // : eq(workflowTable.user_id, user.user_id!) - // ) - // ) - // ) - ), + where: and(eq(workflowRunsTable.id, run_id)), with: { workflow: { columns: {