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