From 5fd68ce6bdb2ea55f24b221b888fe89166589a46 Mon Sep 17 00:00:00 2001 From: Samir Boulahtit Date: Sun, 23 Nov 2025 20:38:27 +0100 Subject: [PATCH] fix: resolve cart functionality issues with product name and frontend integration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed two critical issues preventing cart from working: 1. Product Name Attribute Error: - Product model doesn't have 'name' attribute directly - Product name comes from marketplace_product.title relationship - Updated all references in cart_service.py: * get_cart() - product display in cart * add_to_cart() - logging and exception messages * update_cart_item() - exception messages - Also updated image_url to use marketplace_product.image_link 2. Products Page Not Calling API: - products.html had stub addToCart() with TODO comment - Implemented actual API call: * POST to /api/v1/shop/cart/{sessionId}/items * Sends product_id and quantity * Updates cartCount on success * Shows error toast on failure * Proper error handling with try/catch Testing Results: - API endpoint now works correctly (tested with curl) - Cart items are properly saved to database - Product names display correctly from marketplace_product relationship - Frontend can successfully add items to cart Related Models: - Product has relationship to MarketplaceProduct - Product.marketplace_product.title contains the product name - Product.marketplace_product.image_link contains the image URL 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- app/services/cart_service.py | 14 ++++++------- app/templates/shop/products.html | 34 +++++++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/app/services/cart_service.py b/app/services/cart_service.py index 18bef52e..d566b244 100644 --- a/app/services/cart_service.py +++ b/app/services/cart_service.py @@ -81,11 +81,11 @@ class CartService: items.append({ "product_id": product.id, - "product_name": product.name, + "product_name": product.marketplace_product.title, "quantity": cart_item.quantity, "price": cart_item.price_at_add, "line_total": line_total, - "image_url": product.image_link if hasattr(product, 'image_link') else None, + "image_url": product.marketplace_product.image_link if product.marketplace_product else None, }) subtotal += line_total @@ -157,10 +157,10 @@ class CartService: raise ProductNotFoundException(product_id=product_id, vendor_id=vendor_id) logger.info( - f"[CART_SERVICE] Product found: {product.name}", + f"[CART_SERVICE] Product found: {product.marketplace_product.title}", extra={ "product_id": product_id, - "product_name": product.name, + "product_name": product.marketplace_product.title, "available_inventory": product.available_inventory } ) @@ -195,7 +195,7 @@ class CartService: ) raise InsufficientInventoryForCartException( product_id=product_id, - product_name=product.name, + product_name=product.marketplace_product.title, requested=new_quantity, available=product.available_inventory ) @@ -230,7 +230,7 @@ class CartService: ) raise InsufficientInventoryForCartException( product_id=product_id, - product_name=product.name, + product_name=product.marketplace_product.title, requested=quantity, available=product.available_inventory ) @@ -319,7 +319,7 @@ class CartService: if product.available_inventory < quantity: raise InsufficientInventoryForCartException( product_id=product_id, - product_name=product.name, + product_name=product.marketplace_product.title, requested=quantity, available=product.available_inventory ) diff --git a/app/templates/shop/products.html b/app/templates/shop/products.html index dfd44ae9..43f3a6cb 100644 --- a/app/templates/shop/products.html +++ b/app/templates/shop/products.html @@ -201,10 +201,38 @@ document.addEventListener('alpine:init', () => { this.loadProducts(); }, - addToCart(product) { + async addToCart(product) { console.log('[SHOP] Adding to cart:', product); - this.showToast(`${product.marketplace_product.title} added to cart`, 'success'); - // TODO: Implement actual cart functionality + + try { + const url = `/api/v1/shop/cart/${this.sessionId}/items`; + const payload = { + product_id: product.id, + quantity: 1 + }; + + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(payload) + }); + + if (response.ok) { + const result = await response.json(); + console.log('[SHOP] Add to cart success:', result); + this.cartCount += 1; + this.showToast(`${product.marketplace_product.title} added to cart`, 'success'); + } else { + const error = await response.json(); + console.error('[SHOP] Add to cart error:', error); + this.showToast(error.message || 'Failed to add to cart', 'error'); + } + } catch (error) { + console.error('[SHOP] Add to cart exception:', error); + this.showToast('Failed to add to cart', 'error'); + } } })); });