53 lines
1.5 KiB
Python
53 lines
1.5 KiB
Python
from typing import List
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.models.cart import CartItem
|
|
from app.models.order import Order, OrderItem
|
|
from app.schemas.order import OrderCreate, OrderUpdate
|
|
from app.services.base import CRUDBase
|
|
|
|
|
|
class OrderService(CRUDBase[Order, OrderCreate, OrderUpdate]):
|
|
def get_user_orders(
|
|
self, db: Session, *, user_id: int, skip: int = 0, limit: int = 100
|
|
) -> List[Order]:
|
|
return (
|
|
db.query(Order)
|
|
.filter(Order.user_id == user_id)
|
|
.offset(skip)
|
|
.limit(limit)
|
|
.all()
|
|
)
|
|
|
|
def create_from_cart(
|
|
self, db: Session, *, user_id: int, cart_items: List[CartItem], shipping_address: str
|
|
) -> Order:
|
|
# Calculate total amount
|
|
total_amount = sum(item.unit_price * item.quantity for item in cart_items)
|
|
|
|
# Create order
|
|
db_obj = Order(
|
|
user_id=user_id,
|
|
total_amount=total_amount,
|
|
shipping_address=shipping_address
|
|
)
|
|
db.add(db_obj)
|
|
db.flush() # Flush to get the order ID
|
|
|
|
# Create order items
|
|
for cart_item in cart_items:
|
|
order_item = OrderItem(
|
|
order_id=db_obj.id,
|
|
product_id=cart_item.product_id,
|
|
quantity=cart_item.quantity,
|
|
unit_price=cart_item.unit_price
|
|
)
|
|
db.add(order_item)
|
|
|
|
db.commit()
|
|
db.refresh(db_obj)
|
|
return db_obj
|
|
|
|
order_service = OrderService(Order)
|