59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Annotated
|
|
|
|
from fastapi import APIRouter, Depends, status
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.api.dependencies import get_current_user
|
|
from app.db.session import get_db
|
|
from app.models.user import User
|
|
from app.schemas.order import OrderCreate, OrderResponse
|
|
from app.services.order_service import OrderService
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post(
|
|
"",
|
|
response_model=OrderResponse,
|
|
status_code=status.HTTP_201_CREATED,
|
|
summary="Create an order from cart items",
|
|
)
|
|
def create_order(
|
|
payload: OrderCreate,
|
|
db: Annotated[Session, Depends(get_db)],
|
|
current_user: Annotated[User, Depends(get_current_user)],
|
|
) -> OrderResponse:
|
|
order = OrderService(db).create_order(current_user, payload)
|
|
return OrderResponse.model_validate(order)
|
|
|
|
|
|
@router.get(
|
|
"",
|
|
response_model=list[OrderResponse],
|
|
status_code=status.HTTP_200_OK,
|
|
summary="View the authenticated user's orders",
|
|
)
|
|
def list_my_orders(
|
|
db: Annotated[Session, Depends(get_db)],
|
|
current_user: Annotated[User, Depends(get_current_user)],
|
|
) -> list[OrderResponse]:
|
|
orders = OrderService(db).get_orders_for_user(current_user)
|
|
return [OrderResponse.model_validate(order) for order in orders]
|
|
|
|
|
|
@router.get(
|
|
"/{order_id}",
|
|
response_model=OrderResponse,
|
|
status_code=status.HTTP_200_OK,
|
|
summary="View a specific order owned by the authenticated user",
|
|
)
|
|
def get_my_order(
|
|
order_id: int,
|
|
db: Annotated[Session, Depends(get_db)],
|
|
current_user: Annotated[User, Depends(get_current_user)],
|
|
) -> OrderResponse:
|
|
order = OrderService(db).get_order_for_user(order_id, current_user)
|
|
return OrderResponse.model_validate(order)
|