bmc_hub/app/modules/fedex/backend/router.py
Christian bd44771738 feat: Update sag links to include versioning in URLs across multiple templates and services
- Updated links in index_old.html, varekob_salg.html, log.html, opportunities.html, detail.html, and various frontend files to point to the new versioned sag URLs.
- Modified reminder_notification_service.py to reflect the new sag URL structure in notifications.
- Added FedEx shipment management functionality, including API client, service layer, and router for handling FedEx bookings, tracking, and cancellations.
- Created database migration for FedEx shipments, including tables for shipments, packages, and tracking events.
2026-04-30 23:06:00 +02:00

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))