From ae365752566416af72b18bf94215e539af0af7c2 Mon Sep 17 00:00:00 2001 From: imbytecat Date: Sun, 18 Jan 2026 03:37:51 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84RPC=E5=90=88?= =?UTF-8?q?=E7=BA=A6=E4=B8=8E=E5=AE=A2=E6=88=B7=E7=AB=AF=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E4=BD=93=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新客户端类型引用,将APIClient替换为RouterClient以保持类型一致性。 - 删除旧的 RPC 合约定义文件,移除过时的类型和验证逻辑。 - 添加合约入口文件并导出待办事项合约 - 添加待办事项合约,定义列表、创建、更新和删除操作的输入输出验证规则。 - 更新 todo 处理程序以使用统一的合约导入并简化导入路径。 - 调整导出内容,仅导出客户端的orpc函数和类型模块。 - 使用合约类型替换原有路由客户端类型,并引入合约输入输出的类型推断。 --- src/orpc/client.ts | 8 +++--- src/orpc/contract.ts | 49 ------------------------------------- src/orpc/contracts/index.ts | 5 ++++ src/orpc/contracts/todo.ts | 45 ++++++++++++++++++++++++++++++++++ src/orpc/handlers/todo.ts | 10 ++++---- src/orpc/index.ts | 4 +-- src/orpc/types.ts | 13 +++++++--- 7 files changed, 71 insertions(+), 63 deletions(-) delete mode 100644 src/orpc/contract.ts create mode 100644 src/orpc/contracts/index.ts create mode 100644 src/orpc/contracts/todo.ts diff --git a/src/orpc/client.ts b/src/orpc/client.ts index 43b22fc..8de2d89 100644 --- a/src/orpc/client.ts +++ b/src/orpc/client.ts @@ -1,11 +1,11 @@ import { createORPCClient } from '@orpc/client' import { RPCLink } from '@orpc/client/fetch' -import { createRouterClient, type RouterClient } from '@orpc/server' +import { createRouterClient } from '@orpc/server' import { createTanstackQueryUtils } from '@orpc/tanstack-query' import { createIsomorphicFn } from '@tanstack/react-start' import { getRequestHeaders } from '@tanstack/react-start/server' import { router } from './router' -import type { APIClient } from './types' +import type { RouterClient } from './types' const getORPCClient = createIsomorphicFn() .server(() => @@ -19,9 +19,9 @@ const getORPCClient = createIsomorphicFn() const link = new RPCLink({ url: `${window.location.origin}/api/rpc`, }) - return createORPCClient(link) + return createORPCClient(link) }) -const client: APIClient = getORPCClient() +const client: RouterClient = getORPCClient() export const orpc = createTanstackQueryUtils(client) diff --git a/src/orpc/contract.ts b/src/orpc/contract.ts deleted file mode 100644 index bf05936..0000000 --- a/src/orpc/contract.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { oc } from '@orpc/contract' -import { z } from 'zod' - -export const todoSchema = z.object({ - id: z.uuid(), - title: z.string(), - completed: z.boolean(), - createdAt: z.date(), - updatedAt: z.date(), -}) - -export const todoInsertSchema = z.object({ - title: z.string().min(1), - completed: z.boolean().optional(), -}) - -export const todoUpdateSchema = z.object({ - title: z.string().min(1).optional(), - completed: z.boolean().optional(), -}) - -export const todoContract = { - list: oc.input(z.void()).output(z.array(todoSchema)), - - create: oc.input(todoInsertSchema).output(todoSchema), - - update: oc - .input( - z.object({ - id: z.uuid(), - data: todoUpdateSchema, - }), - ) - .output(todoSchema), - - remove: oc - .input( - z.object({ - id: z.uuid(), - }), - ) - .output(z.void()), -} - -export const contract = { - todo: todoContract, -} - -export type Contract = typeof contract diff --git a/src/orpc/contracts/index.ts b/src/orpc/contracts/index.ts new file mode 100644 index 0000000..0056f6e --- /dev/null +++ b/src/orpc/contracts/index.ts @@ -0,0 +1,5 @@ +import { todoContract } from './todo' + +export const contract = { + todo: todoContract, +} diff --git a/src/orpc/contracts/todo.ts b/src/orpc/contracts/todo.ts new file mode 100644 index 0000000..69ea79f --- /dev/null +++ b/src/orpc/contracts/todo.ts @@ -0,0 +1,45 @@ +import { oc } from '@orpc/contract' +import { + createInsertSchema, + createSelectSchema, + createUpdateSchema, +} from 'drizzle-zod' +import { z } from 'zod' +import { todoTable } from '@/db/schema' + +const selectSchema = createSelectSchema(todoTable).omit({ + id: true, + createdAt: true, + updatedAt: true, +}) + +const insertSchema = createInsertSchema(todoTable).omit({ + id: true, + createdAt: true, + updatedAt: true, +}) + +const updateSchema = createUpdateSchema(todoTable) + +export const todoContract = { + list: oc.input(z.void()).output(z.array(selectSchema)), + + create: oc.input(insertSchema).output(selectSchema), + + update: oc + .input( + z.object({ + id: z.uuid(), + data: updateSchema, + }), + ) + .output(selectSchema), + + remove: oc + .input( + z.object({ + id: z.uuid(), + }), + ) + .output(z.void()), +} diff --git a/src/orpc/handlers/todo.ts b/src/orpc/handlers/todo.ts index 1864c84..65702f7 100644 --- a/src/orpc/handlers/todo.ts +++ b/src/orpc/handlers/todo.ts @@ -1,10 +1,10 @@ import { implement, ORPCError } from '@orpc/server' import { eq } from 'drizzle-orm' import { todoTable } from '@/db/schema' -import { todoContract } from '@/orpc/contract' import { dbProvider } from '@/orpc/middlewares' +import { contract } from '../contracts' -export const list = implement(todoContract.list) +export const list = implement(contract.todo.list) .use(dbProvider) .handler(async ({ context }) => { const todos = await context.db.query.todoTable.findMany({ @@ -13,7 +13,7 @@ export const list = implement(todoContract.list) return todos }) -export const create = implement(todoContract.create) +export const create = implement(contract.todo.create) .use(dbProvider) .handler(async ({ context, input }) => { const [newTodo] = await context.db @@ -28,7 +28,7 @@ export const create = implement(todoContract.create) return newTodo }) -export const update = implement(todoContract.update) +export const update = implement(contract.todo.update) .use(dbProvider) .handler(async ({ context, input }) => { const [updatedTodo] = await context.db @@ -44,7 +44,7 @@ export const update = implement(todoContract.update) return updatedTodo }) -export const remove = implement(todoContract.remove) +export const remove = implement(contract.todo.remove) .use(dbProvider) .handler(async ({ context, input }) => { await context.db.delete(todoTable).where(eq(todoTable.id, input.id)) diff --git a/src/orpc/index.ts b/src/orpc/index.ts index ebe1c97..d276e39 100644 --- a/src/orpc/index.ts +++ b/src/orpc/index.ts @@ -1,2 +1,2 @@ -export * from './client' -export * from './contract' +export { orpc } from './client' +export * from './types' diff --git a/src/orpc/types.ts b/src/orpc/types.ts index 988dcbb..c95875f 100644 --- a/src/orpc/types.ts +++ b/src/orpc/types.ts @@ -1,4 +1,11 @@ -import type { RouterClient } from '@orpc/server' -import type { router } from './router' +import type { + ContractRouterClient, + InferContractRouterInputs, + InferContractRouterOutputs, +} from '@orpc/contract' +import type { contract } from './contracts' -export type APIClient = RouterClient +export type Contract = typeof contract +export type RouterClient = ContractRouterClient +export type RouterInputs = InferContractRouterInputs +export type RouterOutputs = InferContractRouterOutputs