fullfill graphql usertype; change db session to dep injection
This commit is contained in:
@@ -21,6 +21,19 @@ if not DATABASE_URL:
|
|||||||
engine = create_engine(
|
engine = create_engine(
|
||||||
DATABASE_URL,
|
DATABASE_URL,
|
||||||
pool_recycle=3600,
|
pool_recycle=3600,
|
||||||
pool_pre_ping=True
|
pool_pre_ping=True,
|
||||||
|
connect_args={
|
||||||
|
"keepalives": 1,
|
||||||
|
"keepalives_idle": 30,
|
||||||
|
"keepalives_interval": 10,
|
||||||
|
"keepalives_count": 5
|
||||||
|
}
|
||||||
)
|
)
|
||||||
SessionLocal = sessionmaker(bind=engine)
|
SessionLocal = sessionmaker(bind=engine)
|
||||||
|
|
||||||
|
def get_db():
|
||||||
|
db = SessionLocal()
|
||||||
|
try:
|
||||||
|
yield db
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
@@ -11,7 +11,7 @@ class Query:
|
|||||||
@strawberry.field
|
@strawberry.field
|
||||||
async def me(self, info: Info[CustomContext, None]) -> Optional[UserType]:
|
async def me(self, info: Info[CustomContext, None]) -> Optional[UserType]:
|
||||||
# 从 context 获取当前登录用户
|
# 从 context 获取当前登录用户
|
||||||
user = await info.context.get_current_user()
|
user = await info.context. xzz()
|
||||||
# Strawberry 会自动将 SQLAlchemy 实例映射为 UserType
|
# Strawberry 会自动将 SQLAlchemy 实例映射为 UserType
|
||||||
return user
|
return user
|
||||||
|
|
||||||
|
|||||||
+22
-4
@@ -4,17 +4,35 @@ from datetime import datetime
|
|||||||
from strawberry.types import Info
|
from strawberry.types import Info
|
||||||
|
|
||||||
from app.utils.format import get_image_url
|
from app.utils.format import get_image_url
|
||||||
from app.graphql.context import CustomContext
|
|
||||||
|
|
||||||
@strawberry.type
|
@strawberry.type
|
||||||
class UserType:
|
class UserType:
|
||||||
id: strawberry.ID
|
id: str
|
||||||
email: str
|
email: str
|
||||||
name: Optional[str]
|
name: str
|
||||||
|
avatar: str
|
||||||
handle: Optional[str]
|
handle: Optional[str]
|
||||||
avatar: Optional[str]
|
|
||||||
|
# 互动统计字段
|
||||||
following_count: int
|
following_count: int
|
||||||
follower_count: int
|
follower_count: int
|
||||||
|
|
||||||
|
# 统计汇总字段
|
||||||
|
owner_project_count: int
|
||||||
|
owner_likes_count: int
|
||||||
|
owner_favorites_count: int
|
||||||
|
owner_shares_count: int
|
||||||
|
|
||||||
|
admin_project_count: int
|
||||||
|
admin_likes_count: int
|
||||||
|
admin_favorites_count: int
|
||||||
|
admin_shares_count: int
|
||||||
|
|
||||||
|
user_project_count: int
|
||||||
|
user_likes_count: int
|
||||||
|
user_favorites_count: int
|
||||||
|
user_shares_count: int
|
||||||
|
|
||||||
created_at: datetime
|
created_at: datetime
|
||||||
|
|
||||||
# 动态解析字段:例如自动处理头像的绝对路径
|
# 动态解析字段:例如自动处理头像的绝对路径
|
||||||
|
|||||||
@@ -8,8 +8,9 @@ import secrets
|
|||||||
import json
|
import json
|
||||||
from urllib.parse import quote
|
from urllib.parse import quote
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
|
from sqlalchemy.orm import Session
|
||||||
|
|
||||||
from app.db import SessionLocal
|
from app.db import SessionLocal, get_db
|
||||||
from app.models import User
|
from app.models import User
|
||||||
from auth.tokens import create_jwt_token, create_refresh_token, decode_token
|
from auth.tokens import create_jwt_token, create_refresh_token, decode_token
|
||||||
from app.utils.format import get_image_url
|
from app.utils.format import get_image_url
|
||||||
@@ -94,7 +95,13 @@ def login_google():
|
|||||||
return response
|
return response
|
||||||
|
|
||||||
@router.get("/auth/callback")
|
@router.get("/auth/callback")
|
||||||
async def auth_callback(request: Request, code: str, state: str, background_tasks: BackgroundTasks):
|
async def auth_callback(
|
||||||
|
request: Request,
|
||||||
|
code: str,
|
||||||
|
state: str,
|
||||||
|
background_tasks: BackgroundTasks,
|
||||||
|
db: Session = Depends(get_db)
|
||||||
|
):
|
||||||
cookie_state = request.cookies.get("oauth_state")
|
cookie_state = request.cookies.get("oauth_state")
|
||||||
|
|
||||||
if not cookie_state or cookie_state != state:
|
if not cookie_state or cookie_state != state:
|
||||||
@@ -122,9 +129,6 @@ async def auth_callback(request: Request, code: str, state: str, background_task
|
|||||||
|
|
||||||
user_info = user_res.json()
|
user_info = user_res.json()
|
||||||
|
|
||||||
db = SessionLocal()
|
|
||||||
|
|
||||||
try:
|
|
||||||
user = db.query(User).filter(User.email == user_info["email"]).first()
|
user = db.query(User).filter(User.email == user_info["email"]).first()
|
||||||
|
|
||||||
if not user:
|
if not user:
|
||||||
@@ -166,8 +170,6 @@ async def auth_callback(request: Request, code: str, state: str, background_task
|
|||||||
|
|
||||||
# 这里不需要再次 refresh,除非后面还要用到更新后的 user 对象
|
# 这里不需要再次 refresh,除非后面还要用到更新后的 user 对象
|
||||||
# db.refresh(user)
|
# db.refresh(user)
|
||||||
finally:
|
|
||||||
db.close()
|
|
||||||
|
|
||||||
jwt_token = create_jwt_token({
|
jwt_token = create_jwt_token({
|
||||||
"sub": user.id,
|
"sub": user.id,
|
||||||
|
|||||||
Reference in New Issue
Block a user