diff --git a/apps/server/src/api/middlewares/index.ts b/apps/server/src/api/middlewares/index.ts deleted file mode 100644 index 1beb455..0000000 --- a/apps/server/src/api/middlewares/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './db' diff --git a/apps/server/src/api/server.ts b/apps/server/src/api/server.ts deleted file mode 100644 index c21cf78..0000000 --- a/apps/server/src/api/server.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { implement } from '@orpc/server' -import { contract } from './contract' - -// biome-ignore lint/complexity/noBannedTypes: 暂无 context -type Context = {} - -export const os = implement(contract).$context() diff --git a/apps/server/src/lib/orpc/client.ts b/apps/server/src/client/orpc.client.ts similarity index 79% rename from apps/server/src/lib/orpc/client.ts rename to apps/server/src/client/orpc.client.ts index 8861026..69924fe 100644 --- a/apps/server/src/lib/orpc/client.ts +++ b/apps/server/src/client/orpc.client.ts @@ -3,8 +3,8 @@ import { RPCLink } from '@orpc/client/fetch' import { createRouterClient } from '@orpc/server' import { createIsomorphicFn } from '@tanstack/react-start' import { getRequestHeaders } from '@tanstack/react-start/server' -import { router } from '@/api/routers' -import type { RouterClient } from '@/api/types' +import { router } from '@/server/api/routers' +import type { RouterClient } from '@/server/api/types' const getORPCClient = createIsomorphicFn() .server(() => @@ -21,4 +21,4 @@ const getORPCClient = createIsomorphicFn() return createORPCClient(link) }) -export const client: RouterClient = getORPCClient() +export const orpc: RouterClient = getORPCClient() diff --git a/apps/server/src/lib/orpc/query-client.ts b/apps/server/src/client/query-client.ts similarity index 86% rename from apps/server/src/lib/orpc/query-client.ts rename to apps/server/src/client/query-client.ts index 8d8fe83..56c4976 100644 --- a/apps/server/src/lib/orpc/query-client.ts +++ b/apps/server/src/client/query-client.ts @@ -1,7 +1,7 @@ import { createTanstackQueryUtils } from '@orpc/tanstack-query' -import { client } from './client' +import { orpc as orpcClient } from './orpc.client' -export const orpc = createTanstackQueryUtils(client, { +export const orpc = createTanstackQueryUtils(orpcClient, { experimental_defaults: { todo: { create: { diff --git a/apps/server/src/lib/utils.ts b/apps/server/src/lib/utils.ts deleted file mode 100644 index e69de29..0000000 diff --git a/apps/server/src/routes/api/rpc.$.ts b/apps/server/src/routes/api/rpc.$.ts index a13e3b8..910bba9 100644 --- a/apps/server/src/routes/api/rpc.$.ts +++ b/apps/server/src/routes/api/rpc.$.ts @@ -2,7 +2,7 @@ import { ORPCError, onError, ValidationError } from '@orpc/server' import { RPCHandler } from '@orpc/server/fetch' import { createFileRoute } from '@tanstack/react-router' import { z } from 'zod' -import { router } from '@/api/routers' +import { router } from '@/server/api/routers' const handler = new RPCHandler(router, { interceptors: [ @@ -49,7 +49,9 @@ export const Route = createFileRoute('/api/rpc/$')({ ANY: async ({ request }) => { const { response } = await handler.handle(request, { prefix: '/api/rpc', - context: {}, + context: { + headers: request.headers, + }, }) return response ?? new Response('Not Found', { status: 404 }) diff --git a/apps/server/src/routes/index.tsx b/apps/server/src/routes/index.tsx index 97fd6cb..4c79913 100644 --- a/apps/server/src/routes/index.tsx +++ b/apps/server/src/routes/index.tsx @@ -4,7 +4,7 @@ import { isTauri } from '@tauri-apps/api/core' import { getCurrentWindow } from '@tauri-apps/api/window' import type { ChangeEventHandler, FormEventHandler } from 'react' import { useEffect, useState } from 'react' -import { orpc } from '@/lib/orpc/query-client' +import { orpc } from '@/client/query-client' export const Route = createFileRoute('/')({ component: Todos, diff --git a/apps/server/src/server/api/context.ts b/apps/server/src/server/api/context.ts new file mode 100644 index 0000000..b7f63e2 --- /dev/null +++ b/apps/server/src/server/api/context.ts @@ -0,0 +1,25 @@ +import type { Database } from '@/server/db' + +/** + * 基础 Context - 所有请求都包含的上下文 + */ +export interface BaseContext { + headers: Headers +} + +/** + * 数据库 Context - 通过 db middleware 扩展 + */ +export interface DBContext extends BaseContext { + db: Database +} + +/** + * 认证 Context - 通过 auth middleware 扩展(未来使用) + * + * @example + * export interface AuthContext extends DBContext { + * userId: string + * user: User + * } + */ diff --git a/apps/server/src/api/contract/index.ts b/apps/server/src/server/api/contracts/index.ts similarity index 65% rename from apps/server/src/api/contract/index.ts rename to apps/server/src/server/api/contracts/index.ts index cc3a507..669cfd5 100644 --- a/apps/server/src/api/contract/index.ts +++ b/apps/server/src/server/api/contracts/index.ts @@ -1,4 +1,4 @@ -import * as todo from './todo' +import * as todo from './todo.contract' export const contract = { todo, diff --git a/apps/server/src/api/contract/todo.ts b/apps/server/src/server/api/contracts/todo.contract.ts similarity index 94% rename from apps/server/src/api/contract/todo.ts rename to apps/server/src/server/api/contracts/todo.contract.ts index 4e06241..4f483bd 100644 --- a/apps/server/src/api/contract/todo.ts +++ b/apps/server/src/server/api/contracts/todo.contract.ts @@ -5,7 +5,7 @@ import { createUpdateSchema, } from 'drizzle-zod' import { z } from 'zod' -import { todoTable } from '@/db/schema' +import { todoTable } from '@/server/db/schema' const selectSchema = createSelectSchema(todoTable) diff --git a/apps/server/src/api/middlewares/db.ts b/apps/server/src/server/api/middlewares/db.middleware.ts similarity index 83% rename from apps/server/src/api/middlewares/db.ts rename to apps/server/src/server/api/middlewares/db.middleware.ts index eabc1e6..373089e 100644 --- a/apps/server/src/api/middlewares/db.ts +++ b/apps/server/src/server/api/middlewares/db.middleware.ts @@ -1,5 +1,5 @@ import { os } from '@orpc/server' -import { getDb } from '@/db' +import { getDb } from '@/server/db' export const db = os.middleware(async ({ context, next }) => { return next({ diff --git a/apps/server/src/server/api/middlewares/index.ts b/apps/server/src/server/api/middlewares/index.ts new file mode 100644 index 0000000..508e3be --- /dev/null +++ b/apps/server/src/server/api/middlewares/index.ts @@ -0,0 +1 @@ +export * from './db.middleware' diff --git a/apps/server/src/api/routers/index.ts b/apps/server/src/server/api/routers/index.ts similarity index 66% rename from apps/server/src/api/routers/index.ts rename to apps/server/src/server/api/routers/index.ts index 6c8f8aa..02a11fe 100644 --- a/apps/server/src/api/routers/index.ts +++ b/apps/server/src/server/api/routers/index.ts @@ -1,5 +1,5 @@ import { os } from '../server' -import * as todo from './todo' +import * as todo from './todo.router' export const router = os.router({ todo, diff --git a/apps/server/src/api/routers/todo.ts b/apps/server/src/server/api/routers/todo.router.ts similarity index 90% rename from apps/server/src/api/routers/todo.ts rename to apps/server/src/server/api/routers/todo.router.ts index 580b4d5..e176dea 100644 --- a/apps/server/src/api/routers/todo.ts +++ b/apps/server/src/server/api/routers/todo.router.ts @@ -1,8 +1,8 @@ import { ORPCError } from '@orpc/server' import { eq } from 'drizzle-orm' -import { db } from '@/api/middlewares' -import { os } from '@/api/server' -import { todoTable } from '@/db/schema' +import { todoTable } from '@/server/db/schema' +import { db } from '../middlewares' +import { os } from '../server' export const list = os.todo.list.use(db).handler(async ({ context }) => { const todos = await context.db.query.todoTable.findMany({ diff --git a/apps/server/src/server/api/server.ts b/apps/server/src/server/api/server.ts new file mode 100644 index 0000000..3eab072 --- /dev/null +++ b/apps/server/src/server/api/server.ts @@ -0,0 +1,5 @@ +import { implement } from '@orpc/server' +import type { BaseContext } from './context' +import { contract } from './contracts' + +export const os = implement(contract).$context() diff --git a/apps/server/src/api/types.ts b/apps/server/src/server/api/types.ts similarity index 87% rename from apps/server/src/api/types.ts rename to apps/server/src/server/api/types.ts index caf896b..5509525 100644 --- a/apps/server/src/api/types.ts +++ b/apps/server/src/server/api/types.ts @@ -3,7 +3,7 @@ import type { InferContractRouterInputs, InferContractRouterOutputs, } from '@orpc/contract' -import type { Contract } from './contract' +import type { Contract } from './contracts' export type RouterClient = ContractRouterClient export type RouterInputs = InferContractRouterInputs diff --git a/apps/server/src/db/index.ts b/apps/server/src/server/db/index.ts similarity index 66% rename from apps/server/src/db/index.ts rename to apps/server/src/server/db/index.ts index 78172b6..4646b5c 100644 --- a/apps/server/src/db/index.ts +++ b/apps/server/src/server/db/index.ts @@ -1,6 +1,6 @@ import { drizzle } from 'drizzle-orm/postgres-js' -import * as schema from '@/db/schema' import { env } from '@/env' +import * as schema from '@/server/db/schema' export const createDb = () => drizzle({ @@ -11,12 +11,12 @@ export const createDb = () => schema, }) -export type Db = ReturnType +export type Database = ReturnType export const getDb = (() => { - let db: Db | null = null + let db: Database | null = null - return (singleton = true): Db => { + return (singleton = true): Database => { if (!singleton) { return createDb() } diff --git a/apps/server/src/db/schema/index.ts b/apps/server/src/server/db/schema/index.ts similarity index 100% rename from apps/server/src/db/schema/index.ts rename to apps/server/src/server/db/schema/index.ts diff --git a/apps/server/src/db/schema/todo.ts b/apps/server/src/server/db/schema/todo.ts similarity index 100% rename from apps/server/src/db/schema/todo.ts rename to apps/server/src/server/db/schema/todo.ts diff --git a/apps/server/src/db/schema/utils/field.ts b/apps/server/src/server/db/schema/utils/field.ts similarity index 100% rename from apps/server/src/db/schema/utils/field.ts rename to apps/server/src/server/db/schema/utils/field.ts