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