from decimal import Decimal from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from app.api import deps from app.models.order import Order, OrderItem from app.schemas.order import OrderCreate, OrderOut from app.kafka_producer import send_order_created_event router = APIRouter() @router.post("/", response_model=OrderOut, status_code=status.HTTP_202_ACCEPTED) def create_order(order_in: OrderCreate, db: Session = Depends(deps.get_db)): """ Submit a new customer order. Returns status code 202 (Accepted) as the order is pending verification. """ try: total = Decimal("0.00") for item in order_in.items: total += item.price * item.quantity db_order = Order( customer_id=order_in.customer_id, status="PENDING", total_price=total ) db.add(db_order) db.flush() for item in order_in.items: db_item = OrderItem( order_id=db_order.id, product_id=item.product_id, quantity=item.quantity, price=item.price, ) db.add(db_item) db.commit() db.refresh(db_order) event_payload = {"order_id": db_order.id, "customer_id": order_in.customer_id} send_order_created_event(event_payload) return db_order except Exception as e: db.rollback() print(e) raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Could not initialize checkout process.", )