89 lines
2.3 KiB
Python

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