app/auth/ is now an independent package, import nothing from app/

This commit is contained in:
2026-05-19 22:29:21 +08:00
parent fe1fde778f
commit 623fac8749
2 changed files with 39 additions and 22 deletions
+18 -18
View File
@@ -1,6 +1,5 @@
import os import os
from fastapi import APIRouter, Depends, HTTPException, Request from fastapi import APIRouter, Depends, HTTPException, Request
from app.utils.format import get_image_url
from .deps import get_current_user from .deps import get_current_user
from .jwt import create_jwt_token, create_refresh_token, verify_access_token, decode_token from .jwt import create_jwt_token, create_refresh_token, verify_access_token, decode_token
@@ -12,24 +11,24 @@ router = APIRouter(tags=["Authentication"])
# 挂载第三方 OAuth 的路由器 # 挂载第三方 OAuth 的路由器
router.include_router(oauth_router) router.include_router(oauth_router)
@router.get("/me") # 定义一个动态获取当前完整用户对象的依赖项
def me(user_id = Depends(get_current_user)): # 这样 auth 包不需要知道 User 模型长什么样
# 注意:根据上一轮修改,get_current_user 现在直接返回 user_id # 也不需要知道 SessionLocal 是什么
from app.db import SessionLocal # 全部由外部动态提供
from app.models import User 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.")
db = SessionLocal() @router.get("/me")
try: def me(current_user = Depends(get_user_by_id)):
user = db.query(User).filter(User.id == user_id).first() """
if not user: current_user 是由外部解析并传进来的完整用户对象(或者是字典)
raise HTTPException(status_code=404, detail="User not found") """
return { return current_user
"email": user.email,
"name": user.name,
"avatar": get_image_url(user.avatar),
}
finally:
db.close()
@router.post("/refresh") @router.post("/refresh")
def refresh_token(refresh_token: str): def refresh_token(refresh_token: str):
@@ -48,6 +47,7 @@ def logout():
__all__ = [ __all__ = [
"router", "router",
"get_current_user", "get_current_user",
"get_user_by_id",
"create_jwt_token", "create_jwt_token",
"create_refresh_token", "create_refresh_token",
"verify_access_token", "verify_access_token",
+21 -4
View File
@@ -1,10 +1,11 @@
from fastapi import FastAPI from fastapi import FastAPI, Depends, HTTPException
from strawberry import Schema from strawberry import Schema
from strawberry.fastapi import GraphQLRouter from strawberry.fastapi import GraphQLRouter
from app.auth import router as auth_router from app.auth import router as auth_router, get_user_by_id, get_current_user
from app.db import engine from app.db import engine, SessionLocal
from app.models import Base from app.models import Base, User
from app.utils.format import get_image_url
# 导入 GraphQL 组件 # 导入 GraphQL 组件
from app.graphql.queries import Query 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(auth_router) # 保留现有的 auth 路由供 Google OAuth 回调使用
app.include_router(graphql_router, prefix="/graphql") # 挂载 GraphQL 终点,前端以后只需要请求 /graphql 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 # test code
for route in app.routes: for route in app.routes:
methods = getattr(route, "methods", "N/A") methods = getattr(route, "methods", "N/A")