from datetime import datetime from pydantic import BaseModel, EmailStr, Field, validator from app.models.user import UserRole class UserBase(BaseModel): email: EmailStr first_name: str | None = None last_name: str | None = None phone_number: str | None = None class UserCreate(UserBase): password: str = Field(..., min_length=8, max_length=100) confirm_password: str @validator('confirm_password') def passwords_match(cls, v, values, **kwargs): if 'password' in values and v != values['password']: raise ValueError('Passwords do not match') return v class UserUpdate(BaseModel): first_name: str | None = None last_name: str | None = None phone_number: str | None = None email: EmailStr | None = None profile_image: str | None = None address_line1: str | None = None address_line2: str | None = None city: str | None = None state: str | None = None postal_code: str | None = None country: str | None = None bio: str | None = None class UserPasswordChange(BaseModel): current_password: str new_password: str = Field(..., min_length=8, max_length=100) confirm_password: str @validator('confirm_password') def passwords_match(cls, v, values, **kwargs): if 'new_password' in values and v != values['new_password']: raise ValueError('Passwords do not match') return v class UserInDBBase(UserBase): id: str is_active: bool role: UserRole created_at: datetime updated_at: datetime | None = None email_verified: bool profile_image: str | None = None class Config: orm_mode = True class User(UserInDBBase): """User model returned to clients""" pass class UserWithAddress(User): """User model with address information""" address_line1: str | None = None address_line2: str | None = None city: str | None = None state: str | None = None postal_code: str | None = None country: str | None = None bio: str | None = None class UserInDB(UserInDBBase): """User model stored in DB (includes hashed password)""" hashed_password: str class Token(BaseModel): access_token: str token_type: str class TokenPayload(BaseModel): sub: str exp: datetime