e4e995854d
- 新增忘记密码页面与重置密码确认流程(前端+后端) - 修复注册验证码页登录跳转路由 - 新增用户搜索API(按邮箱查询) - 简化infra脚本,统一为app.sh - 补充密码重置与用户API测试覆盖 - 更新runtime文档与AGENTS配置
55 lines
1.4 KiB
Python
55 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import ClassVar
|
|
|
|
from pydantic import (
|
|
AnyHttpUrl,
|
|
BaseModel,
|
|
ConfigDict,
|
|
Field,
|
|
field_validator,
|
|
model_validator,
|
|
)
|
|
|
|
|
|
class UserResponse(BaseModel):
|
|
id: str
|
|
username: str
|
|
avatar_url: str | None = None
|
|
bio: str | None = None
|
|
|
|
|
|
class UserSearchRequest(BaseModel):
|
|
query: str = Field(min_length=1, max_length=100)
|
|
|
|
|
|
class UserSearchResult(BaseModel):
|
|
id: str
|
|
username: str
|
|
avatar_url: str | None = None
|
|
bio: str | None = None
|
|
|
|
|
|
class UserUpdateRequest(BaseModel):
|
|
model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid")
|
|
|
|
username: str | None = Field(default=None, min_length=3, max_length=30)
|
|
avatar_url: str | None = Field(default=None)
|
|
bio: str | None = Field(default=None, max_length=200)
|
|
|
|
@field_validator("avatar_url", mode="before")
|
|
@classmethod
|
|
def validate_avatar_url(cls, v: str | None) -> str | None:
|
|
if v is None:
|
|
return None
|
|
parsed = AnyHttpUrl(v)
|
|
if parsed.scheme not in ("http", "https"):
|
|
raise ValueError("avatar_url must use http or https scheme")
|
|
return str(parsed)
|
|
|
|
@model_validator(mode="after")
|
|
def require_one_field(self) -> "UserUpdateRequest":
|
|
if self.username is None and self.avatar_url is None and self.bio is None:
|
|
raise ValueError("At least one field must be provided")
|
|
return self
|