from datetime import datetime from enum import Enum as PyEnum from sqlalchemy import Column, DateTime, Enum, Float, ForeignKey, Integer, String from sqlalchemy.orm import relationship from app.db.base import Base class OrderStatus(str, PyEnum): PENDING = "pending" PAID = "paid" SHIPPED = "shipped" DELIVERED = "delivered" CANCELLED = "cancelled" class Order(Base): __tablename__ = "orders" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) status = Column(Enum(OrderStatus), default=OrderStatus.PENDING, nullable=False) total_amount = Column(Float, nullable=False) shipping_address = Column(String, nullable=False) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Relationships user = relationship("User", back_populates="orders") items = relationship( "OrderItem", back_populates="order", cascade="all, delete-orphan" ) class OrderItem(Base): __tablename__ = "order_items" id = Column(Integer, primary_key=True, index=True) order_id = Column(Integer, ForeignKey("orders.id"), nullable=False) product_id = Column(Integer, ForeignKey("products.id"), nullable=False) quantity = Column(Integer, nullable=False) unit_price = Column(Float, nullable=False) created_at = Column(DateTime, default=datetime.utcnow) # Relationships order = relationship("Order", back_populates="items") product = relationship("Product", back_populates="order_items")