# app/services/cart_service.py """ Shopping cart service. This module provides: - Session-based cart management - Cart item operations (add, update, remove) - Cart total calculations """ import logging from typing import Dict, List, Optional from datetime import datetime, timezone from sqlalchemy.orm import Session from sqlalchemy import and_ from models.database.product import Product from models.database.vendor import Vendor from app.exceptions import ( ProductNotFoundException, ValidationException, InsufficientInventoryException ) logger = logging.getLogger(__name__) class CartService: """Service for managing shopping carts.""" def get_cart( self, db: Session, vendor_id: int, session_id: str ) -> Dict: """ Get cart contents for a session. Note: This is a simple in-memory implementation. In production, you'd store carts in Redis or database. """ # For now, return empty cart structure # TODO: Implement persistent cart storage return { "vendor_id": vendor_id, "session_id": session_id, "items": [], "subtotal": 0.0, "total": 0.0 } def add_to_cart( self, db: Session, vendor_id: int, session_id: str, product_id: int, quantity: int = 1 ) -> Dict: """ Add product to cart. Args: db: Database session vendor_id: Vendor ID session_id: Session ID product_id: Product ID quantity: Quantity to add Returns: Updated cart Raises: ProductNotFoundException: If product not found InsufficientInventoryException: If not enough inventory """ # Verify product exists and belongs to vendor product = db.query(Product).filter( and_( Product.id == product_id, Product.vendor_id == vendor_id, Product.is_active == True ) ).first() if not product: raise ProductNotFoundException(str(product_id)) # Check inventory if product.available_inventory < quantity: raise InsufficientInventoryException( product_id=product_id, requested=quantity, available=product.available_inventory ) # TODO: Add to persistent cart storage # For now, return success response logger.info( f"Added product {product_id} (qty: {quantity}) to cart " f"for session {session_id}" ) return { "message": "Product added to cart", "product_id": product_id, "quantity": quantity } def update_cart_item( self, db: Session, vendor_id: int, session_id: str, product_id: int, quantity: int ) -> Dict: """Update quantity of item in cart.""" if quantity < 1: raise ValidationException("Quantity must be at least 1") # Verify product product = db.query(Product).filter( and_( Product.id == product_id, Product.vendor_id == vendor_id ) ).first() if not product: raise ProductNotFoundException(str(product_id)) # Check inventory if product.available_inventory < quantity: raise InsufficientInventoryException( product_id=product_id, requested=quantity, available=product.available_inventory ) # TODO: Update persistent cart logger.info(f"Updated cart item {product_id} quantity to {quantity}") return { "message": "Cart updated", "product_id": product_id, "quantity": quantity } def remove_from_cart( self, db: Session, vendor_id: int, session_id: str, product_id: int ) -> Dict: """Remove item from cart.""" # TODO: Remove from persistent cart logger.info(f"Removed product {product_id} from cart {session_id}") return { "message": "Item removed from cart", "product_id": product_id } def clear_cart( self, db: Session, vendor_id: int, session_id: str ) -> Dict: """Clear all items from cart.""" # TODO: Clear persistent cart logger.info(f"Cleared cart for session {session_id}") return { "message": "Cart cleared" } # Create service instance cart_service = CartService()