from __future__ import annotations from pydantic import ( AnyHttpUrl, BaseModel, ConfigDict, Field, field_validator, model_validator, ) class ProfileResponse(BaseModel): id: str username: str avatar_url: str | None = None bio: str | None = None class ProfileUpdateRequest(BaseModel): model_config = 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) -> "ProfileUpdateRequest": 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