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""