ebay_client/ebay_client/inventory/client.py

286 lines
9.9 KiB
Python

from __future__ import annotations
from ebay_client.core.http.transport import ApiTransport
from ebay_client.generated.inventory.models import (
BaseResponse,
EbayOfferDetailsWithId,
EbayOfferDetailsWithKeys,
FeesSummaryResponse,
InventoryItem,
InventoryItemGroup,
InventoryLocation,
InventoryLocationFull,
InventoryLocationResponse,
InventoryItemWithSkuLocaleGroupid,
InventoryItems,
LocationResponse,
OfferKeysWithId,
OfferResponse,
OfferResponseWithListingId,
Offers,
PublishByInventoryItemGroupRequest,
PublishResponse,
WithdrawByInventoryItemGroupRequest,
WithdrawResponse,
)
INVENTORY_SCOPE = "https://api.ebay.com/oauth/api_scope/sell.inventory"
INVENTORY_READ_SCOPE = "https://api.ebay.com/oauth/api_scope/sell.inventory.readonly"
INVENTORY_READ_SCOPE_OPTIONS = [[INVENTORY_READ_SCOPE], [INVENTORY_SCOPE]]
class InventoryClient:
def __init__(self, transport: ApiTransport) -> None:
self.transport = transport
def _write_headers(self, *, content_language: str | None = None) -> dict[str, str]:
headers = {"Content-Type": "application/json"}
if content_language is not None:
headers["Content-Language"] = content_language
return headers
def get_inventory_item(self, sku: str) -> InventoryItemWithSkuLocaleGroupid:
return self.transport.request_model(
InventoryItemWithSkuLocaleGroupid,
"GET",
f"/sell/inventory/v1/inventory_item/{sku}",
scope_options=INVENTORY_READ_SCOPE_OPTIONS,
)
def create_or_replace_inventory_item(
self,
sku: str,
payload: InventoryItem,
*,
content_language: str,
) -> BaseResponse:
return self.transport.request_model(
BaseResponse,
"PUT",
f"/sell/inventory/v1/inventory_item/{sku}",
scopes=[INVENTORY_SCOPE],
headers=self._write_headers(content_language=content_language),
json_body=payload.model_dump(by_alias=True, exclude_none=True),
)
def delete_inventory_item(self, sku: str) -> None:
self.transport.request_json(
"DELETE",
f"/sell/inventory/v1/inventory_item/{sku}",
scopes=[INVENTORY_SCOPE],
)
def get_inventory_items(self, *, limit: int | None = None, offset: int | None = None) -> InventoryItems:
return self.transport.request_model(
InventoryItems,
"GET",
"/sell/inventory/v1/inventory_item",
scope_options=INVENTORY_READ_SCOPE_OPTIONS,
params={"limit": limit, "offset": offset},
)
def get_inventory_item_group(self, inventory_item_group_key: str) -> InventoryItemGroup:
return self.transport.request_model(
InventoryItemGroup,
"GET",
f"/sell/inventory/v1/inventory_item_group/{inventory_item_group_key}",
scope_options=INVENTORY_READ_SCOPE_OPTIONS,
)
def create_or_replace_inventory_item_group(
self,
inventory_item_group_key: str,
payload: InventoryItemGroup,
*,
content_language: str,
) -> BaseResponse:
return self.transport.request_model(
BaseResponse,
"PUT",
f"/sell/inventory/v1/inventory_item_group/{inventory_item_group_key}",
scopes=[INVENTORY_SCOPE],
headers=self._write_headers(content_language=content_language),
json_body=payload.model_dump(by_alias=True, exclude_none=True),
)
def delete_inventory_item_group(self, inventory_item_group_key: str) -> None:
self.transport.request_json(
"DELETE",
f"/sell/inventory/v1/inventory_item_group/{inventory_item_group_key}",
scopes=[INVENTORY_SCOPE],
)
def get_offer(self, offer_id: str) -> OfferResponseWithListingId:
return self.transport.request_model(
OfferResponseWithListingId,
"GET",
f"/sell/inventory/v1/offer/{offer_id}",
scope_options=INVENTORY_READ_SCOPE_OPTIONS,
)
def create_offer(
self,
payload: EbayOfferDetailsWithKeys,
*,
content_language: str,
) -> OfferResponse:
return self.transport.request_model(
OfferResponse,
"POST",
"/sell/inventory/v1/offer",
scopes=[INVENTORY_SCOPE],
headers=self._write_headers(content_language=content_language),
json_body=payload.model_dump(by_alias=True, exclude_none=True),
)
def update_offer(
self,
offer_id: str,
payload: EbayOfferDetailsWithId,
*,
content_language: str,
) -> OfferResponse:
return self.transport.request_model(
OfferResponse,
"PUT",
f"/sell/inventory/v1/offer/{offer_id}",
scopes=[INVENTORY_SCOPE],
headers=self._write_headers(content_language=content_language),
json_body=payload.model_dump(by_alias=True, exclude_none=True),
)
def delete_offer(self, offer_id: str) -> None:
self.transport.request_json(
"DELETE",
f"/sell/inventory/v1/offer/{offer_id}",
scopes=[INVENTORY_SCOPE],
)
def get_offers(self, *, limit: int | None = None, offset: int | None = None, sku: str | None = None) -> Offers:
return self.transport.request_model(
Offers,
"GET",
"/sell/inventory/v1/offer",
scope_options=INVENTORY_READ_SCOPE_OPTIONS,
params={"limit": limit, "offset": offset, "sku": sku},
)
def get_listing_fees(self, payload: OfferKeysWithId | None = None) -> FeesSummaryResponse:
return self.transport.request_model(
FeesSummaryResponse,
"POST",
"/sell/inventory/v1/offer/get_listing_fees",
scope_options=INVENTORY_READ_SCOPE_OPTIONS,
headers={"Content-Type": "application/json"},
json_body=None if payload is None else payload.model_dump(by_alias=True, exclude_none=True),
)
def publish_offer(self, offer_id: str) -> PublishResponse:
return self.transport.request_model(
PublishResponse,
"POST",
f"/sell/inventory/v1/offer/{offer_id}/publish",
scopes=[INVENTORY_SCOPE],
)
def publish_offer_by_inventory_item_group(
self,
payload: PublishByInventoryItemGroupRequest,
) -> PublishResponse:
return self.transport.request_model(
PublishResponse,
"POST",
"/sell/inventory/v1/offer/publish_by_inventory_item_group",
scopes=[INVENTORY_SCOPE],
headers={"Content-Type": "application/json"},
json_body=payload.model_dump(by_alias=True, exclude_none=True),
)
def withdraw_offer(self, offer_id: str) -> WithdrawResponse:
return self.transport.request_model(
WithdrawResponse,
"POST",
f"/sell/inventory/v1/offer/{offer_id}/withdraw",
scopes=[INVENTORY_SCOPE],
)
def withdraw_offer_by_inventory_item_group(
self,
payload: WithdrawByInventoryItemGroupRequest,
) -> None:
self.transport.request_json(
"POST",
"/sell/inventory/v1/offer/withdraw_by_inventory_item_group",
scopes=[INVENTORY_SCOPE],
headers={"Content-Type": "application/json"},
json_body=payload.model_dump(by_alias=True, exclude_none=True),
)
def get_inventory_location(self, merchant_location_key: str) -> InventoryLocationResponse:
return self.transport.request_model(
InventoryLocationResponse,
"GET",
f"/sell/inventory/v1/location/{merchant_location_key}",
scope_options=INVENTORY_READ_SCOPE_OPTIONS,
)
def create_inventory_location(
self,
merchant_location_key: str,
payload: InventoryLocationFull,
) -> None:
self.transport.request_json(
"POST",
f"/sell/inventory/v1/location/{merchant_location_key}",
scopes=[INVENTORY_SCOPE],
headers={"Content-Type": "application/json"},
json_body=payload.model_dump(by_alias=True, exclude_none=True),
)
def delete_inventory_location(self, merchant_location_key: str) -> None:
self.transport.request_json(
"DELETE",
f"/sell/inventory/v1/location/{merchant_location_key}",
scopes=[INVENTORY_SCOPE],
)
def disable_inventory_location(self, merchant_location_key: str) -> None:
self.transport.request_json(
"POST",
f"/sell/inventory/v1/location/{merchant_location_key}/disable",
scopes=[INVENTORY_SCOPE],
)
def enable_inventory_location(self, merchant_location_key: str) -> None:
self.transport.request_json(
"POST",
f"/sell/inventory/v1/location/{merchant_location_key}/enable",
scopes=[INVENTORY_SCOPE],
)
def get_inventory_locations(
self,
*,
limit: int | None = None,
offset: int | None = None,
) -> LocationResponse:
return self.transport.request_model(
LocationResponse,
"GET",
"/sell/inventory/v1/location",
scope_options=INVENTORY_READ_SCOPE_OPTIONS,
params={"limit": limit, "offset": offset},
)
def update_inventory_location(
self,
merchant_location_key: str,
payload: InventoryLocation,
) -> None:
self.transport.request_json(
"POST",
f"/sell/inventory/v1/location/{merchant_location_key}/update_location_details",
scopes=[INVENTORY_SCOPE],
headers={"Content-Type": "application/json"},
json_body=payload.model_dump(by_alias=True, exclude_none=True),
)