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