66 lines
2.1 KiB
Python
66 lines
2.1 KiB
Python
from typing import Optional
|
|
|
|
from sqlalchemy.orm import Session, joinedload
|
|
|
|
from app.crud.base import CRUDBase
|
|
from app.models.cart import Cart, CartItem
|
|
from app.schemas.cart import CartCreate, CartItemCreate, CartItemUpdate
|
|
|
|
|
|
class CRUDCart(CRUDBase[Cart, CartCreate, CartCreate]):
|
|
def get_by_user_id(self, db: Session, *, user_id: int) -> Optional[Cart]:
|
|
return db.query(Cart).filter(Cart.user_id == user_id).first()
|
|
|
|
def get_or_create_cart(self, db: Session, *, user_id: int) -> Cart:
|
|
cart = self.get_by_user_id(db, user_id=user_id)
|
|
if not cart:
|
|
cart = self.create(db, obj_in=CartCreate(user_id=user_id))
|
|
return cart
|
|
|
|
def get_cart_with_items(self, db: Session, *, user_id: int) -> Optional[Cart]:
|
|
return (
|
|
db.query(Cart)
|
|
.filter(Cart.user_id == user_id)
|
|
.options(joinedload(Cart.items).joinedload(CartItem.product))
|
|
.first()
|
|
)
|
|
|
|
|
|
class CRUDCartItem(CRUDBase[CartItem, CartItemCreate, CartItemUpdate]):
|
|
def create_or_update_cart_item(
|
|
self, db: Session, *, cart_id: int, product_id: int, quantity: int
|
|
) -> CartItem:
|
|
cart_item = (
|
|
db.query(CartItem)
|
|
.filter(CartItem.cart_id == cart_id, CartItem.product_id == product_id)
|
|
.first()
|
|
)
|
|
|
|
if cart_item:
|
|
cart_item.quantity = quantity
|
|
db.add(cart_item)
|
|
db.commit()
|
|
db.refresh(cart_item)
|
|
return cart_item
|
|
else:
|
|
return self.create(
|
|
db,
|
|
obj_in=CartItemCreate(cart_id=cart_id, product_id=product_id, quantity=quantity)
|
|
)
|
|
|
|
def remove_cart_item(
|
|
self, db: Session, *, cart_id: int, product_id: int
|
|
) -> None:
|
|
db.query(CartItem).filter(
|
|
CartItem.cart_id == cart_id, CartItem.product_id == product_id
|
|
).delete()
|
|
db.commit()
|
|
|
|
def clear_cart(self, db: Session, *, cart_id: int) -> None:
|
|
db.query(CartItem).filter(CartItem.cart_id == cart_id).delete()
|
|
db.commit()
|
|
|
|
|
|
cart = CRUDCart(Cart)
|
|
cart_item = CRUDCartItem(CartItem)
|