diff options
Diffstat (limited to 'order-service/app/api')
| -rw-r--r-- | order-service/app/api/deps.py | 10 | ||||
| -rw-r--r-- | order-service/app/api/v1/api.py | 5 | ||||
| -rw-r--r-- | order-service/app/api/v1/endpoints/orders.py | 48 |
3 files changed, 63 insertions, 0 deletions
diff --git a/order-service/app/api/deps.py b/order-service/app/api/deps.py new file mode 100644 index 0000000..d8dd349 --- /dev/null +++ b/order-service/app/api/deps.py @@ -0,0 +1,10 @@ +from typing import Generator +from app.core.database import SessionLocal + + +def get_db() -> Generator: + db = SessionLocal() + try: + yield db + finally: + db.close() diff --git a/order-service/app/api/v1/api.py b/order-service/app/api/v1/api.py new file mode 100644 index 0000000..a967cb4 --- /dev/null +++ b/order-service/app/api/v1/api.py @@ -0,0 +1,5 @@ +from fastapi import APIRouter +from app.api.v1.endpoints import orders + +api_router = APIRouter() +api_router.include_router(orders.router, prefix="/orders", tags=["orders"]) diff --git a/order-service/app/api/v1/endpoints/orders.py b/order-service/app/api/v1/endpoints/orders.py new file mode 100644 index 0000000..4530958 --- /dev/null +++ b/order-service/app/api/v1/endpoints/orders.py @@ -0,0 +1,48 @@ +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 + +router = APIRouter() + + [email protected]("/", 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) + + return db_order + + except Exception: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Could not initialize checkout process.", + ) |
