from datetime import datetime from sqlalchemy import DateTime, ForeignKey, Integer, UniqueConstraint, func from sqlalchemy.orm import Mapped, mapped_column, relationship from core.db import Base class Cart(Base): __tablename__ = "carts" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) user_id: Mapped[int] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"), unique=True) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) items: Mapped[list["CartItem"]] = relationship( "CartItem", back_populates="cart", cascade="all, delete-orphan", lazy="joined" ) class CartItem(Base): __tablename__ = "cart_items" __table_args__ = (UniqueConstraint("cart_id", "product_id", name="uq_cart_product"),) id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) cart_id: Mapped[int] = mapped_column(ForeignKey("carts.id", ondelete="CASCADE")) product_id: Mapped[int] = mapped_column(ForeignKey("products.id", ondelete="CASCADE")) qty: Mapped[int] = mapped_column(Integer, default=1) cart: Mapped["Cart"] = relationship("Cart", back_populates="items")