major refactoring adding vendor and customer features
This commit is contained in:
184
app/services/cart_service.py
Normal file
184
app/services/cart_service.py
Normal file
@@ -0,0 +1,184 @@
|
||||
# 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()
|
||||
Reference in New Issue
Block a user