fix missing type annotations for graphql query field arguments
This commit is contained in:
@@ -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"
|
||||||
@@ -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 逻辑
|
||||||
|
|||||||
@@ -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
@@ -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
|
|
||||||
Reference in New Issue
Block a user