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)