
- Setup project structure and FastAPI application - Create SQLAlchemy models for users, products, carts, and orders - Implement Alembic migrations - Add CRUD operations and endpoints for all resources - Setup authentication with JWT - Add role-based access control - Update documentation
92 lines
2.5 KiB
Python
92 lines
2.5 KiB
Python
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)
|