PMFlow/backend/app/schemas/auth.py

109 lines
2.5 KiB
Python

"""认证与用户相关 Pydantic 模型"""
from typing import List, Optional, Union
from pydantic import BaseModel
# 从 models 导入枚举以保持一致性
from ..models import UserRole, UserStatus
class UserLoginResponse(BaseModel):
"""登录响应"""
access_token: str
token_type: str
user: dict
class UserRegisterRequest(BaseModel):
"""自注册请求:创建账号和个人空间。"""
username: str
password: str
name: str
email: str
class PhoneCodeSendRequest(BaseModel):
"""手机号验证码发送请求。"""
phone_country_code: str = "+86"
phone_number: str
purpose: str = "login"
class PhoneCodeVerifyRequest(BaseModel):
"""手机号验证码登录/注册/邀请绑定请求。"""
phone_country_code: str = "+86"
phone_number: str
code: str
purpose: str = "login"
invite_token: Optional[str] = None
name: Optional[str] = None
class UserCreate(BaseModel):
"""创建用户请求"""
username: str
password: str
name: str
email: Optional[str] = None
phone_country_code: Optional[str] = None
phone_number: Optional[str] = None
role: Union[UserRole, List[UserRole], str]
assigned_domains: Optional[List[str]] = []
project_ids: Optional[List[int]] = []
class UserUpdate(BaseModel):
"""更新用户请求"""
name: Optional[str] = None
email: Optional[str] = None
phone_country_code: Optional[str] = None
phone_number: Optional[str] = None
role: Optional[Union[UserRole, List[UserRole], str]] = None
assigned_domains: Optional[List[str]] = None
workload: Optional[int] = None
status: Optional[UserStatus] = None
is_active: Optional[bool] = None
project_ids: Optional[List[int]] = None
class UserResetPasswordRequest(BaseModel):
"""重置密码请求"""
new_password: str
class UserStatusPatchRequest(BaseModel):
"""启用/禁用状态切换请求"""
is_active: bool
class UserResponse(BaseModel):
"""用户响应"""
id: str
username: str
name: str
email: Optional[str] = None
phone_country_code: Optional[str] = None
phone_number: Optional[str] = None
phone_e164: Optional[str] = None
phone_verified_at: Optional[str] = None
role: str
assigned_domains: List[str]
workload: int
status: str
is_active: bool = True
workload_ratio: Optional[float] = None
top_skills: List[str] = []
project_ids: List[int] = []
platform_context: Optional[dict] = None
created_at: str
updated_at: str