"""Commodities API endpoints (5 routes)."""
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from ab.api.models.commodities import (
Commodity,
CommodityCreateRequest,
CommoditySearchRequest,
CommoditySuggestionRequest,
CommodityUpdateRequest,
)
from ab.api.base import BaseEndpoint
from ab.api.route import Route
_GET = Route("GET", "/commodity/{id}", response_model="Commodity")
_UPDATE = Route("PUT", "/commodity/{id}", request_model="CommodityUpdateRequest", response_model="Commodity")
_CREATE = Route("POST", "/commodity", request_model="CommodityCreateRequest", response_model="Commodity")
_SEARCH = Route("POST", "/commodity/search", request_model="CommoditySearchRequest", response_model="List[Commodity]")
_SUGGESTIONS = Route(
"POST", "/commodity/suggestions",
request_model="CommoditySuggestionRequest", response_model="List[Commodity]",
)
[docs]
class CommoditiesEndpoint(BaseEndpoint):
"""Commodity operations (ACPortal API)."""
[docs]
def get(self, commodity_id: str) -> Commodity:
"""GET /commodity/{id}
Docs: https://ab-sdk.readthedocs.io/en/latest/api/commodities/get.html
Response model: Commodity
"""
return self._request(_GET.bind(id=commodity_id))
[docs]
def update(self, commodity_id: str, *, data: CommodityUpdateRequest | dict) -> Commodity:
"""PUT /commodity/{id}.
Args:
commodity_id: Commodity identifier.
data: Commodity update payload with description, freight_class, nmfc_code.
Accepts a :class:`CommodityUpdateRequest` instance or a dict.
Request model: :class:`CommodityUpdateRequest`
Docs: https://ab-sdk.readthedocs.io/en/latest/api/commodities/update.html
Request model: CommodityUpdateRequest
Response model: Commodity
"""
return self._request(_UPDATE.bind(id=commodity_id), json=data)
[docs]
def create(self, *, data: CommodityCreateRequest | dict) -> Commodity:
"""POST /commodity.
Args:
data: Commodity creation payload with description, freight_class,
nmfc_code, weight_min, weight_max.
Accepts a :class:`CommodityCreateRequest` instance or a dict.
Request model: :class:`CommodityCreateRequest`
Docs: https://ab-sdk.readthedocs.io/en/latest/api/commodities/create.html
Request model: CommodityCreateRequest
Response model: Commodity
"""
return self._request(_CREATE, json=data)
[docs]
def search(self, *, data: CommoditySearchRequest | dict) -> list[Commodity]:
"""POST /commodity/search.
Args:
data: Search payload with search_text, page, page_size.
Accepts a :class:`CommoditySearchRequest` instance or a dict.
Request model: :class:`CommoditySearchRequest`
Docs: https://ab-sdk.readthedocs.io/en/latest/api/commodities/search.html
Request model: CommoditySearchRequest
Response model: List[Commodity]
"""
return self._request(_SEARCH, json=data)
[docs]
def suggestions(self, *, data: CommoditySuggestionRequest | dict) -> list[Commodity]:
"""POST /commodity/suggestions.
Args:
data: Suggestion request payload with search_text.
Accepts a :class:`CommoditySuggestionRequest` instance or a dict.
Request model: :class:`CommoditySuggestionRequest`
Docs: https://ab-sdk.readthedocs.io/en/latest/api/commodities/suggestions.html
Request model: CommoditySuggestionRequest
Response model: List[Commodity]
"""
return self._request(_SUGGESTIONS, json=data)