From 623fac8749d7ada053b8a4637c680a62d803f221 Mon Sep 17 00:00:00 2001 From: Zayden Jung Date: Tue, 19 May 2026 22:29:21 +0800 Subject: [PATCH] app/auth/ is now an independent package, import nothing from app/ --- app/auth/__init__.py | 36 ++++++++++++++++++------------------ app/main.py | 25 +++++++++++++++++++++---- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/app/auth/__init__.py b/app/auth/__init__.py index 70b3434..0cd7461 100644 --- a/app/auth/__init__.py +++ b/app/auth/__init__.py @@ -1,6 +1,5 @@ import os from fastapi import APIRouter, Depends, HTTPException, Request -from app.utils.format import get_image_url from .deps import get_current_user from .jwt import create_jwt_token, create_refresh_token, verify_access_token, decode_token @@ -12,24 +11,24 @@ router = APIRouter(tags=["Authentication"]) # 挂载第三方 OAuth 的路由器 router.include_router(oauth_router) +# 定义一个动态获取当前完整用户对象的依赖项 +# 这样 auth 包不需要知道 User 模型长什么样 +# 也不需要知道 SessionLocal 是什么 +# 全部由外部动态提供 +def get_user_by_id(user_id: str = Depends(get_current_user)): + """ + 这是一个占位/契约函数。 + 我们在 main.py 中可以通过 app.dependency_overrides 或者直接在使用时, + 把具体的数据库查询逻辑绑定到这里。 + """ + raise NotImplementedError("Please override or inject the implementation of this function in the external `main.py` file.") + @router.get("/me") -def me(user_id = Depends(get_current_user)): - # 注意:根据上一轮修改,get_current_user 现在直接返回 user_id - from app.db import SessionLocal - from app.models import User - - db = SessionLocal() - try: - user = db.query(User).filter(User.id == user_id).first() - if not user: - raise HTTPException(status_code=404, detail="User not found") - return { - "email": user.email, - "name": user.name, - "avatar": get_image_url(user.avatar), - } - finally: - db.close() +def me(current_user = Depends(get_user_by_id)): + """ + current_user 是由外部解析并传进来的完整用户对象(或者是字典) + """ + return current_user @router.post("/refresh") def refresh_token(refresh_token: str): @@ -48,6 +47,7 @@ def logout(): __all__ = [ "router", "get_current_user", + "get_user_by_id", "create_jwt_token", "create_refresh_token", "verify_access_token", diff --git a/app/main.py b/app/main.py index 277edbe..925b648 100644 --- a/app/main.py +++ b/app/main.py @@ -1,10 +1,11 @@ -from fastapi import FastAPI +from fastapi import FastAPI, Depends, HTTPException from strawberry import Schema from strawberry.fastapi import GraphQLRouter -from app.auth import router as auth_router -from app.db import engine -from app.models import Base +from app.auth import router as auth_router, get_user_by_id, get_current_user +from app.db import engine, SessionLocal +from app.models import Base, User +from app.utils.format import get_image_url # 导入 GraphQL 组件 from app.graphql.queries import Query @@ -27,6 +28,22 @@ graphql_router = GraphQLRouter(schema, context_getter=get_context) app.include_router(auth_router) # 保留现有的 auth 路由供 Google OAuth 回调使用 app.include_router(graphql_router, prefix="/graphql") # 挂载 GraphQL 终点,前端以后只需要请求 /graphql +def override_get_user_by_id(user_id: str = Depends(get_current_user)): + db = SessionLocal() + try: + user = db.query(User).filter(User.id == user_id).first() + if not user: + raise HTTPException(status_code=404, detail="User not found") + return { + "email": user.email, + "name": user.name, + "avatar": get_image_url(user.avatar), + } + finally: + db.close() + +app.dependency_overrides[get_user_by_id] = override_get_user_by_id + # test code for route in app.routes: methods = getattr(route, "methods", "N/A")