56 lines
2.1 KiB
Python
56 lines
2.1 KiB
Python
import enum
|
|
from uuid import uuid4
|
|
|
|
from sqlalchemy import Boolean, Column, DateTime, Enum, String, Text
|
|
from sqlalchemy.orm import relationship
|
|
from sqlalchemy.sql import func
|
|
|
|
from app.core.database import Base
|
|
|
|
|
|
class UserRole(enum.Enum):
|
|
CUSTOMER = "customer"
|
|
SELLER = "seller"
|
|
ADMIN = "admin"
|
|
|
|
class User(Base):
|
|
__tablename__ = "users"
|
|
|
|
id = Column(String(36), primary_key=True, default=lambda: str(uuid4()))
|
|
email = Column(String(255), unique=True, index=True, nullable=False)
|
|
hashed_password = Column(String(255), nullable=False)
|
|
first_name = Column(String(100), nullable=True)
|
|
last_name = Column(String(100), nullable=True)
|
|
is_active = Column(Boolean, default=True)
|
|
role = Column(Enum(UserRole), default=UserRole.CUSTOMER)
|
|
phone_number = Column(String(20), nullable=True)
|
|
profile_image = Column(String(255), nullable=True)
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
|
|
|
# Relationships
|
|
orders = relationship("Order", back_populates="user")
|
|
reviews = relationship("Review", back_populates="user")
|
|
cart_items = relationship("CartItem", back_populates="user")
|
|
|
|
# For sellers: products they are selling
|
|
products = relationship("Product", back_populates="seller")
|
|
|
|
# Address information (simplified - in a real app you'd likely have a separate table)
|
|
address_line1 = Column(String(255), nullable=True)
|
|
address_line2 = Column(String(255), nullable=True)
|
|
city = Column(String(100), nullable=True)
|
|
state = Column(String(100), nullable=True)
|
|
postal_code = Column(String(20), nullable=True)
|
|
country = Column(String(100), nullable=True)
|
|
|
|
# Additional fields
|
|
email_verified = Column(Boolean, default=False)
|
|
verification_token = Column(String(255), nullable=True)
|
|
reset_password_token = Column(String(255), nullable=True)
|
|
reset_token_expires_at = Column(DateTime(timezone=True), nullable=True)
|
|
bio = Column(Text, nullable=True)
|
|
|
|
def __repr__(self):
|
|
return f"<User {self.email}>"
|