fix missing type annotations for graphql query field arguments

This commit is contained in:
2026-05-19 02:03:35 +08:00
parent b58f74d59b
commit 419af38684
4 changed files with 24 additions and 15 deletions
+4
View File
@@ -19,4 +19,8 @@ preset:
- "app/models/*" - "app/models/*"
- "app/db.py" - "app/db.py"
- "app/auth.py" - "app/auth.py"
- "app/main.py"
graphql:
- "app/graphql/*"
- "app/main.py" - "app/main.py"
+2 -1
View File
@@ -7,7 +7,6 @@ from typing import List
from collections import defaultdict from collections import defaultdict
from app.db import SessionLocal from app.db import SessionLocal
from app.models import WorkspaceMember from app.models import WorkspaceMember
from app.graphql.types import WorkspaceMemberType
from typing import AsyncGenerator from typing import AsyncGenerator
# 定义批量查询函数:接收一组 workspace ID 列表,返回相同长度的结果列表 # 定义批量查询函数:接收一组 workspace ID 列表,返回相同长度的结果列表
@@ -32,6 +31,8 @@ class CustomContext(BaseContext):
super().__init__(request) super().__init__(request)
self.db = SessionLocal() self.db = SessionLocal()
self.request = request self.request = request
self.members_loader = DataLoader(load_fn=load_members_by_workspace_ids)
async def get_current_user(self) -> User | None: async def get_current_user(self) -> User | None:
# 复用现有的 auth 逻辑 # 复用现有的 auth 逻辑
+5 -2
View File
@@ -1,18 +1,21 @@
import strawberry import strawberry
from typing import Optional from typing import Optional
from strawberry.types import Info
from app.graphql.types import UserType from app.graphql.types import UserType
from app.models import User from app.models import User
from app.graphql.context import CustomContext
@strawberry.type @strawberry.type
class Query: class Query:
@strawberry.field @strawberry.field
async def me(self, info) -> 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.get_current_user()
# Strawberry 会自动将 SQLAlchemy 实例映射为 UserType # Strawberry 会自动将 SQLAlchemy 实例映射为 UserType
return user return user
@strawberry.field @strawberry.field
def get_user_by_handle(self, info, handle: str) -> Optional[UserType]: def get_user_by_handle(self, info: Info[CustomContext, None], handle: str) -> Optional[UserType]:
db = info.context.db db = info.context.db
return db.query(User).filter(User.handle == handle).first() return db.query(User).filter(User.handle == handle).first()
+13 -12
View File
@@ -1,7 +1,10 @@
import strawberry import strawberry
from typing import List, Optional from typing import List, Optional
from datetime import datetime from datetime import datetime
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:
@@ -19,6 +22,14 @@ class UserType:
def avatar_url(self) -> Optional[str]: def avatar_url(self) -> Optional[str]:
return get_image_url(self.avatar) if self.avatar else None return get_image_url(self.avatar) if self.avatar else None
@strawberry.type
class WorkspaceMemberType:
id: strawberry.ID
workspace_id: str
user_id: Optional[str]
role: str
status: str
@strawberry.type @strawberry.type
class WorkspaceType: class WorkspaceType:
id: strawberry.ID id: strawberry.ID
@@ -30,15 +41,5 @@ class WorkspaceType:
# 支持前端按需加载关联的成员 # 支持前端按需加载关联的成员
@strawberry.field @strawberry.field
def members(self, info) -> List["WorkspaceMemberType"]: def members(self, info: Info) -> List[WorkspaceMemberType]:
from app.models import WorkspaceMember return info.context.members_loader.load(self.id)
db = info.context.db
return db.query(WorkspaceMember).filter(WorkspaceMember.workspace_id == self.id).all()
@strawberry.type
class WorkspaceMemberType:
id: strawberry.ID
workspace_id: str
user_id: Optional[str]
role: str
status: str