54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
"""Orders API endpoints."""
|
|
|
|
from uuid import UUID
|
|
|
|
from fastapi import APIRouter, HTTPException, Depends, Query
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.database import get_db
|
|
from app.schemas.order import OrderResponse
|
|
from app.services.order_service import OrderService
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
def get_order_service(db: AsyncSession = Depends(get_db)) -> OrderService:
|
|
return OrderService(db)
|
|
|
|
|
|
@router.get("/{order_id}", response_model=OrderResponse)
|
|
async def get_order(
|
|
order_id: UUID,
|
|
email: str = Query(..., description="Email used for the order"),
|
|
service: OrderService = Depends(get_order_service),
|
|
):
|
|
"""Get order by ID (requires email verification)."""
|
|
order = await service.get_order_by_id_and_email(order_id, email)
|
|
if not order:
|
|
raise HTTPException(status_code=404, detail="Order not found")
|
|
return order
|
|
|
|
|
|
@router.get("/{order_id}/tracking")
|
|
async def get_order_tracking(
|
|
order_id: UUID,
|
|
email: str = Query(..., description="Email used for the order"),
|
|
service: OrderService = Depends(get_order_service),
|
|
):
|
|
"""Get tracking information for an order."""
|
|
order = await service.get_order_by_id_and_email(order_id, email)
|
|
if not order:
|
|
raise HTTPException(status_code=404, detail="Order not found")
|
|
|
|
tracking = []
|
|
for item in order.items:
|
|
if item.pod_tracking_number:
|
|
tracking.append({
|
|
"product": item.product_name,
|
|
"tracking_number": item.pod_tracking_number,
|
|
"tracking_url": item.pod_tracking_url,
|
|
"status": item.pod_status,
|
|
})
|
|
|
|
return {"order_id": order_id, "tracking": tracking}
|