79 lines
3.4 KiB
Python
79 lines
3.4 KiB
Python
from pydantic import BaseModel, Field, field_validator
|
||
from router.common_model import BaseResponse
|
||
from typing import Optional, Dict, Any, Union
|
||
import json
|
||
|
||
|
||
class UserSettings(BaseModel):
|
||
"""用户设置模型"""
|
||
theme: str = Field(..., description="主题模式")
|
||
lightModeOpacity: float = Field(..., description="浅色模式透明度", ge=0.0, le=1.0)
|
||
lightModeBrightness: float = Field(..., description="浅色模式亮度", ge=0.0, le=1.0)
|
||
darkModeOpacity: float = Field(..., description="深色模式透明度", ge=0.0, le=1.0)
|
||
darkModeBrightness: float = Field(..., description="深色模式亮度", ge=0.0, le=1.0)
|
||
backgroundBlur: float = Field(..., description="背景模糊强度", ge=0.0, le=1.0)
|
||
|
||
@field_validator('theme')
|
||
def validate_theme(cls, v):
|
||
"""验证主题值"""
|
||
valid_themes = ['light', 'dark', 'system', 'ThemeMode.light', 'ThemeMode.dark', 'ThemeMode.system']
|
||
if v not in valid_themes:
|
||
raise ValueError(f"无效的主题值: {v},有效值: {valid_themes}")
|
||
return v
|
||
|
||
|
||
class UserProfileData(BaseModel):
|
||
"""用户资料数据模型"""
|
||
userid: str = Field(..., description="用户ID")
|
||
avatar: Optional[str] = Field(None, description="用户头像base64数据")
|
||
background: Optional[str] = Field(None, description="用户背景base64数据")
|
||
nickname: Optional[str] = Field(None, description="用户昵称")
|
||
settings: Optional[UserSettings] = Field(None, description="用户设置对象")
|
||
|
||
|
||
class GetUserProfileRequest(BaseModel):
|
||
"""获取用户资料请求模型"""
|
||
token: str = Field(..., description="用户认证token")
|
||
|
||
|
||
class UpdateUserProfileRequest(BaseModel):
|
||
"""更新用户资料请求模型"""
|
||
token: str = Field(..., description="用户认证token")
|
||
avatar: Optional[str] = Field(None, description="用户头像base64编码数据")
|
||
background: Optional[str] = Field(None, description="用户背景base64编码数据")
|
||
nickname: Optional[str] = Field(None, description="用户昵称")
|
||
settings: Optional[Union[UserSettings, str]] = Field(None, description="用户设置对象或JSON字符串")
|
||
|
||
@field_validator('settings')
|
||
def parse_settings(cls, v):
|
||
"""解析settings字段,支持字符串和对象两种格式"""
|
||
if v is None:
|
||
return v
|
||
|
||
# 如果已经是UserSettings对象,直接返回
|
||
if isinstance(v, UserSettings):
|
||
return v
|
||
|
||
# 如果是字符串,尝试解析为JSON然后创建UserSettings对象
|
||
if isinstance(v, str):
|
||
try:
|
||
settings_dict = json.loads(v)
|
||
return UserSettings(**settings_dict)
|
||
except json.JSONDecodeError as e:
|
||
raise ValueError(f"settings字段JSON格式错误: {str(e)}")
|
||
except Exception as e:
|
||
raise ValueError(f"settings字段验证失败: {str(e)}")
|
||
|
||
# 如果是字典,直接创建UserSettings对象
|
||
if isinstance(v, dict):
|
||
try:
|
||
return UserSettings(**v)
|
||
except Exception as e:
|
||
raise ValueError(f"settings字段验证失败: {str(e)}")
|
||
|
||
raise ValueError("settings字段必须是JSON字符串、字典或UserSettings对象")
|
||
|
||
|
||
class UserProfileResponse(BaseResponse[UserProfileData]):
|
||
"""用户资料响应模型"""
|
||
pass |