89 lines
2.3 KiB
Python
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
|