feat: add ProfileUpdate pydantic model with email and phone validation
This commit is contained in:
parent
428c17c4e3
commit
7c9e426bb8
4 changed files with 156 additions and 0 deletions
42
src/porchlight/validation.py
Normal file
42
src/porchlight/validation.py
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue