34 lines
1.1 KiB
Python
34 lines
1.1 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from pydantic import AnyHttpUrl, BaseModel, Field, field_validator, model_validator
|
||
|
|
|
||
|
|
|
||
|
|
class ProfileResponse(BaseModel):
|
||
|
|
id: str
|
||
|
|
username: str
|
||
|
|
display_name: str | None = None
|
||
|
|
avatar_url: str | None = None
|
||
|
|
bio: str | None = None
|
||
|
|
|
||
|
|
|
||
|
|
class ProfileUpdateRequest(BaseModel):
|
||
|
|
display_name: str | None = Field(default=None, max_length=50)
|
||
|
|
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.display_name is None and self.avatar_url is None and self.bio is None:
|
||
|
|
raise ValueError("At least one field must be provided")
|
||
|
|
return self
|