67 lines
2.2 KiB
Python
67 lines
2.2 KiB
Python
|
|
from typing import Optional
|
||
|
|
|
||
|
|
from fastapi import APIRouter, Query, Request
|
||
|
|
|
||
|
|
from app.modules.fedex.backend.service import fedex_service
|
||
|
|
from app.modules.fedex.models.schemas import (
|
||
|
|
FedExBookingCreate,
|
||
|
|
FedExBookingListResponse,
|
||
|
|
FedExBookingResponse,
|
||
|
|
FedExBookingSubmitResponse,
|
||
|
|
FedExCancelRequest,
|
||
|
|
FedExCancelResponse,
|
||
|
|
FedExTrackingResponse,
|
||
|
|
)
|
||
|
|
|
||
|
|
router = APIRouter()
|
||
|
|
|
||
|
|
|
||
|
|
def _user_id_from_request(request: Request) -> Optional[int]:
|
||
|
|
raw_user_id = getattr(request.state, "user_id", None)
|
||
|
|
if raw_user_id is None:
|
||
|
|
return None
|
||
|
|
try:
|
||
|
|
return int(raw_user_id)
|
||
|
|
except (TypeError, ValueError):
|
||
|
|
return None
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/fedex/config")
|
||
|
|
async def fedex_config() -> dict:
|
||
|
|
return {
|
||
|
|
"enabled": fedex_service.enabled,
|
||
|
|
"read_only": fedex_service.read_only,
|
||
|
|
"dry_run": fedex_service.dry_run,
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
@router.post("/fedex/bookings", response_model=FedExBookingResponse)
|
||
|
|
async def create_booking(payload: FedExBookingCreate, request: Request):
|
||
|
|
booking = fedex_service.create_booking_draft(payload, _user_id_from_request(request))
|
||
|
|
return booking
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/fedex/bookings", response_model=FedExBookingListResponse)
|
||
|
|
async def list_bookings(case_id: Optional[int] = Query(default=None, gt=0)):
|
||
|
|
return {"items": fedex_service.list_bookings(case_id=case_id)}
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/fedex/bookings/{booking_ref}", response_model=FedExBookingResponse)
|
||
|
|
async def get_booking(booking_ref: str):
|
||
|
|
return fedex_service.get_booking(booking_ref)
|
||
|
|
|
||
|
|
|
||
|
|
@router.post("/fedex/bookings/{booking_ref}/submit", response_model=FedExBookingSubmitResponse)
|
||
|
|
async def submit_booking(booking_ref: str, request: Request):
|
||
|
|
return await fedex_service.submit_booking(booking_ref, _user_id_from_request(request))
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/fedex/bookings/{booking_ref}/tracking", response_model=FedExTrackingResponse)
|
||
|
|
async def get_tracking(booking_ref: str):
|
||
|
|
return await fedex_service.get_tracking(booking_ref)
|
||
|
|
|
||
|
|
|
||
|
|
@router.post("/fedex/bookings/{booking_ref}/cancel", response_model=FedExCancelResponse)
|
||
|
|
async def cancel_booking(booking_ref: str, payload: FedExCancelRequest, request: Request):
|
||
|
|
return await fedex_service.cancel_booking(booking_ref, payload.reason, _user_id_from_request(request))
|