from typing import List, Optional from sqlalchemy.orm import Session from app.crud.base import CRUDBase from app.models.cart import CartItem from app.schemas.cart import CartItemCreate, CartItemUpdate class CRUDCartItem(CRUDBase[CartItem, CartItemCreate, CartItemUpdate]): def get_by_user_and_product( self, db: Session, *, user_id: int, product_id: int ) -> Optional[CartItem]: """ Get a cart item by user ID and product ID. Args: db: Database session user_id: User ID product_id: Product ID Returns: The cart item or None if not found """ return ( db.query(self.model) .filter(self.model.user_id == user_id, self.model.product_id == product_id) .first() ) def get_user_cart(self, db: Session, *, user_id: int) -> List[CartItem]: """ Get all cart items for a user. Args: db: Database session user_id: User ID Returns: List of cart items """ return db.query(self.model).filter(self.model.user_id == user_id).all() def create_or_update( self, db: Session, *, user_id: int, obj_in: CartItemCreate ) -> CartItem: """ Create a new cart item or update the quantity if it already exists. Args: db: Database session user_id: User ID obj_in: Cart item data Returns: The created or updated cart item """ cart_item = self.get_by_user_and_product( db, user_id=user_id, product_id=obj_in.product_id ) if cart_item: # Update existing cart item cart_item.quantity += obj_in.quantity db.add(cart_item) db.commit() db.refresh(cart_item) return cart_item else: # Create new cart item db_obj = CartItem( user_id=user_id, product_id=obj_in.product_id, quantity=obj_in.quantity ) db.add(db_obj) db.commit() db.refresh(db_obj) return db_obj def clear_cart(self, db: Session, *, user_id: int) -> None: """ Remove all cart items for a user. Args: db: Database session user_id: User ID """ db.query(self.model).filter(self.model.user_id == user_id).delete() db.commit() cart_item = CRUDCartItem(CartItem)