import re import uuid from pydantic import BaseModel, EmailStr, Field, model_validator class UserRegister(BaseModel): username: str = Field(min_length=3, max_length=64) email: EmailStr = Field() phone_number: str = Field(min_length=2, max_length=16, pattern=r"^\+[1-9]\d{1,14}$") password: str = Field( min_length=8, max_length=128, examples=["Abc123#!"], description="Password must conform to this regex: \n```\n^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$ %^&*-]).{8,128}$\n```", ) @model_validator(mode="after") def validate_using_regex(self): self.__validate_password() return self def __validate_password(self): password_regex = r"^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\D*\d)(?=[^#?!@$ %^&*-]*[#?!@$ %^&*-]).{8,128}$" if not re.match(password_regex, self.password): raise ValueError("Password is too weak") class UserUpdate(BaseModel): email: EmailStr | None = Field() phone_number: str | None = Field(min_length=2, max_length=16, pattern=r"^\+[1-9]\d{1,14}$") username: str | None = Field(min_length=3, max_length=64) first_name: str | None = Field(None, max_length=64) last_name: str | None = Field(None, max_length=64) class UserPublic(BaseModel): uuid: uuid.UUID username: str email: str first_name: str | None last_name: str | None phone_number: str class Token(BaseModel): access_token: str token_type: str = "bearer" class TokenPayload(BaseModel): sub: str | None = None