From df485b54c9ddcb1ad39906e8b5563d90cf95135d Mon Sep 17 00:00:00 2001 From: imbytecat Date: Mon, 30 Mar 2026 21:27:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=AE=A4=E8=AF=81=20?= =?UTF-8?q?API=20=E8=B7=AF=E7=94=B1=E5=92=8C=E4=B8=AD=E9=97=B4=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/server/src/routes/api/auth.$.ts | 11 ++++++++++ apps/server/src/server/api/context.ts | 20 +++++-------------- .../server/api/middlewares/auth.middleware.ts | 19 ++++++++++++++++++ .../src/server/api/middlewares/index.ts | 1 + 4 files changed, 36 insertions(+), 15 deletions(-) create mode 100644 apps/server/src/routes/api/auth.$.ts create mode 100644 apps/server/src/server/api/middlewares/auth.middleware.ts diff --git a/apps/server/src/routes/api/auth.$.ts b/apps/server/src/routes/api/auth.$.ts new file mode 100644 index 0000000..b9d9c19 --- /dev/null +++ b/apps/server/src/routes/api/auth.$.ts @@ -0,0 +1,11 @@ +import { createFileRoute } from '@tanstack/react-router' +import { auth } from '@/server/auth' + +export const Route = createFileRoute('/api/auth/$' as never)({ + server: { + handlers: { + GET: ({ request }) => auth.handler(request), + POST: ({ request }) => auth.handler(request), + }, + }, +}) diff --git a/apps/server/src/server/api/context.ts b/apps/server/src/server/api/context.ts index 9d4772f..eaabdbb 100644 --- a/apps/server/src/server/api/context.ts +++ b/apps/server/src/server/api/context.ts @@ -1,25 +1,15 @@ +import type { auth } from '@/server/auth' import type { DB } from '@/server/db' -/** - * 基础 Context - 所有请求都包含的上下文 - */ export interface BaseContext { headers: Headers } -/** - * 数据库 Context - 通过 db middleware 扩展 - */ export interface DBContext extends BaseContext { db: DB } -/** - * 认证 Context - 通过 auth middleware 扩展(未来使用) - * - * @example - * export interface AuthContext extends DBContext { - * userId: string - * user: User - * } - */ +export interface AuthContext extends DBContext { + user: typeof auth.$Infer.Session.user + session: typeof auth.$Infer.Session.session +} diff --git a/apps/server/src/server/api/middlewares/auth.middleware.ts b/apps/server/src/server/api/middlewares/auth.middleware.ts new file mode 100644 index 0000000..c83a5d0 --- /dev/null +++ b/apps/server/src/server/api/middlewares/auth.middleware.ts @@ -0,0 +1,19 @@ +import { ORPCError } from '@orpc/server' +import { os } from '@/server/api/server' +import { auth } from '@/server/auth' + +export const authMiddleware = os.middleware(async ({ context, next }) => { + const sessionData = await auth.api.getSession({ headers: context.headers }) + + if (!sessionData?.session || !sessionData?.user) { + throw new ORPCError('UNAUTHORIZED') + } + + return next({ + context: { + ...context, + session: sessionData.session, + user: sessionData.user, + }, + }) +}) diff --git a/apps/server/src/server/api/middlewares/index.ts b/apps/server/src/server/api/middlewares/index.ts index 508e3be..2195c0a 100644 --- a/apps/server/src/server/api/middlewares/index.ts +++ b/apps/server/src/server/api/middlewares/index.ts @@ -1 +1,2 @@ +export * from './auth.middleware' export * from './db.middleware'