185 lines
4.8 KiB
Python
185 lines
4.8 KiB
Python
# 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()
|