from decimal import Decimal from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from typing import List 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.", ) @router.get("/{order_id}", response_model=OrderOut) def read_order(order_id: int, db: Session = Depends(deps.get_db)): """ Submit a new customer order. Returns status code 202 (Accepted) as the order is pending verification. """ try: order = db.query(Order).filter(Order.id == order_id).first() if not order: raise HTTPException(status_code=404, detail="Order not found") return order except Exception as e: db.rollback() print(e) raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Could not read the order.", ) @router.get("/", response_model=List[OrderOut]) def list_orders(skip: int = 0, limit: int = 100, db: Session = Depends(deps.get_db)): try: orders = db.query(Order).offset(skip).limit(limit).all() return orders except Exception as e: db.rollback() print(e) raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Could not read the order.", )