feat: add ProfileUpdate pydantic model with email and phone validation

This commit is contained in:
Johan Lundberg 2026-02-20 15:21:28 +01:00
parent 428c17c4e3
commit 7c9e426bb8
No known key found for this signature in database
GPG key ID: A6C152738D03C7D1
4 changed files with 156 additions and 0 deletions

View file

@ -0,0 +1,42 @@
from typing import Annotated
from urllib.parse import urlparse
from pydantic import BaseModel, EmailStr, Field, field_validator
from pydantic_extra_types.phone_numbers import PhoneNumberValidator
E164Phone = Annotated[str, PhoneNumberValidator(number_format="E164")]
class ProfileUpdate(BaseModel):
given_name: str = Field(default="", max_length=255)
family_name: str = Field(default="", max_length=255)
preferred_username: str = Field(default="", max_length=255)
email: EmailStr | None = None
phone_number: E164Phone | None = None
picture: str | None = Field(default=None, max_length=2048)
locale: str = Field(default="", max_length=20)
@field_validator("email", mode="before")
@classmethod
def empty_email_to_none(cls, v: str) -> str | None:
if isinstance(v, str) and v.strip() == "":
return None
return v
@field_validator("phone_number", mode="before")
@classmethod
def empty_phone_to_none(cls, v: str) -> str | None:
if isinstance(v, str) and v.strip() == "":
return None
return v
@field_validator("picture", mode="before")
@classmethod
def validate_picture_url(cls, v: str) -> str | None:
if isinstance(v, str) and v.strip() == "":
return None
if isinstance(v, str):
parsed = urlparse(v)
if parsed.scheme not in ("http", "https") or not parsed.netloc:
raise ValueError("Picture URL must be a valid HTTP or HTTPS URL")
return v