from __future__ import annotations from datetime import datetime from sqlalchemy import Integer, String, DateTime, ForeignKey, func, Index from sqlalchemy.orm import Mapped, mapped_column, relationship from db.base import Base # you already import Base in app.py # from .user import User # only if you normally import it here # from .coop import Product # if not already in this module from .market import Product from .user import User class CartItem(Base): __tablename__ = "cart_items" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) # Either a logged-in user OR an anonymous session user_id: Mapped[int | None] = mapped_column( ForeignKey("users.id", ondelete="CASCADE"), nullable=True, ) session_id: Mapped[str | None] = mapped_column( String(128), nullable=True, ) # IMPORTANT: link to product *id*, not slug product_id: Mapped[int] = mapped_column( ForeignKey("products.id", ondelete="CASCADE"), nullable=False, ) quantity: Mapped[int] = mapped_column( Integer, nullable=False, default=1, server_default="1", ) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, server_default=func.now(), ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, server_default=func.now(), ) deleted_at: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True, ) # Relationships product: Mapped["Product"] = relationship( "Product", back_populates="cart_items", ) user: Mapped["User | None"] = relationship("User", back_populates="cart_items") __table_args__ = ( Index("ix_cart_items_user_product", "user_id", "product_id"), Index("ix_cart_items_session_product", "session_id", "product_id"), )