Refactor API client methods to return specific model types instead of generic dictionaries

This commit is contained in:
claudi 2026-04-07 09:16:06 +02:00
parent aa4c067ea8
commit acdadad4b3
3 changed files with 58 additions and 32 deletions

View file

@ -1,8 +1,13 @@
from __future__ import annotations
from typing import Any
from ebay_client.core.http.transport import ApiTransport
from ebay_client.generated.account.models import (
FulfillmentPolicyResponse,
PaymentPolicyResponse,
Programs,
ReturnPolicyResponse,
SellingPrivileges,
)
ACCOUNT_SCOPE = "https://api.ebay.com/oauth/api_scope/sell.account"
ACCOUNT_READ_SCOPE = "https://api.ebay.com/oauth/api_scope/sell.account.readonly"
@ -12,39 +17,44 @@ class AccountClient:
def __init__(self, transport: ApiTransport) -> None:
self.transport = transport
def get_fulfillment_policies(self, *, marketplace_id: str) -> dict[str, Any]:
return self.transport.request_json(
def get_fulfillment_policies(self, *, marketplace_id: str) -> FulfillmentPolicyResponse:
return self.transport.request_model(
FulfillmentPolicyResponse,
"GET",
"/sell/account/v1/fulfillment_policy",
scopes=[ACCOUNT_READ_SCOPE],
params={"marketplace_id": marketplace_id},
)
def get_payment_policies(self, *, marketplace_id: str) -> dict[str, Any]:
return self.transport.request_json(
def get_payment_policies(self, *, marketplace_id: str) -> PaymentPolicyResponse:
return self.transport.request_model(
PaymentPolicyResponse,
"GET",
"/sell/account/v1/payment_policy",
scopes=[ACCOUNT_READ_SCOPE],
params={"marketplace_id": marketplace_id},
)
def get_return_policies(self, *, marketplace_id: str) -> dict[str, Any]:
return self.transport.request_json(
def get_return_policies(self, *, marketplace_id: str) -> ReturnPolicyResponse:
return self.transport.request_model(
ReturnPolicyResponse,
"GET",
"/sell/account/v1/return_policy",
scopes=[ACCOUNT_READ_SCOPE],
params={"marketplace_id": marketplace_id},
)
def get_privileges(self) -> dict[str, Any]:
return self.transport.request_json(
def get_privileges(self) -> SellingPrivileges:
return self.transport.request_model(
SellingPrivileges,
"GET",
"/sell/account/v1/privilege",
scopes=[ACCOUNT_SCOPE],
)
def get_opted_in_programs(self) -> dict[str, Any]:
return self.transport.request_json(
def get_opted_in_programs(self) -> Programs:
return self.transport.request_model(
Programs,
"GET",
"/sell/account/v1/program/get_opted_in_programs",
scopes=[ACCOUNT_READ_SCOPE],

View file

@ -1,8 +1,12 @@
from __future__ import annotations
from typing import Any
from ebay_client.core.http.transport import ApiTransport
from ebay_client.generated.feed.models import (
ScheduleTemplateCollection,
Task,
TaskCollection,
UserScheduleCollection,
)
FEED_INVENTORY_SCOPE = "https://api.ebay.com/oauth/api_scope/sell.inventory"
FEED_FULFILLMENT_SCOPE = "https://api.ebay.com/oauth/api_scope/sell.fulfillment"
@ -12,30 +16,34 @@ class FeedClient:
def __init__(self, transport: ApiTransport) -> None:
self.transport = transport
def get_tasks(self, *, feed_type: str | None = None) -> dict[str, Any]:
return self.transport.request_json(
def get_tasks(self, *, feed_type: str | None = None) -> TaskCollection:
return self.transport.request_model(
TaskCollection,
"GET",
"/sell/feed/v1/task",
scopes=[FEED_INVENTORY_SCOPE, FEED_FULFILLMENT_SCOPE],
params={"feed_type": feed_type},
)
def get_task(self, task_id: str) -> dict[str, Any]:
return self.transport.request_json(
def get_task(self, task_id: str) -> Task:
return self.transport.request_model(
Task,
"GET",
f"/sell/feed/v1/task/{task_id}",
scopes=[FEED_INVENTORY_SCOPE, FEED_FULFILLMENT_SCOPE],
)
def get_schedule_templates(self) -> dict[str, Any]:
return self.transport.request_json(
def get_schedule_templates(self) -> ScheduleTemplateCollection:
return self.transport.request_model(
ScheduleTemplateCollection,
"GET",
"/sell/feed/v1/schedule_template",
scopes=[FEED_INVENTORY_SCOPE, FEED_FULFILLMENT_SCOPE],
)
def get_schedules(self) -> dict[str, Any]:
return self.transport.request_json(
def get_schedules(self) -> UserScheduleCollection:
return self.transport.request_model(
UserScheduleCollection,
"GET",
"/sell/feed/v1/schedule",
scopes=[FEED_INVENTORY_SCOPE, FEED_FULFILLMENT_SCOPE],

View file

@ -1,8 +1,12 @@
from __future__ import annotations
from typing import Any
from ebay_client.core.http.transport import ApiTransport
from ebay_client.generated.fulfillment.models import (
Order,
OrderSearchPagedCollection,
ShippingFulfillment,
ShippingFulfillmentPagedCollection,
)
FULFILLMENT_READ_SCOPE = "https://api.ebay.com/oauth/api_scope/sell.fulfillment.readonly"
@ -11,30 +15,34 @@ class FulfillmentClient:
def __init__(self, transport: ApiTransport) -> None:
self.transport = transport
def get_order(self, order_id: str) -> dict[str, Any]:
return self.transport.request_json(
def get_order(self, order_id: str) -> Order:
return self.transport.request_model(
Order,
"GET",
f"/sell/fulfillment/v1/order/{order_id}",
scopes=[FULFILLMENT_READ_SCOPE],
)
def get_orders(self, *, limit: int | None = None, offset: int | None = None) -> dict[str, Any]:
return self.transport.request_json(
def get_orders(self, *, limit: int | None = None, offset: int | None = None) -> OrderSearchPagedCollection:
return self.transport.request_model(
OrderSearchPagedCollection,
"GET",
"/sell/fulfillment/v1/order",
scopes=[FULFILLMENT_READ_SCOPE],
params={"limit": limit, "offset": offset},
)
def get_shipping_fulfillments(self, order_id: str) -> dict[str, Any]:
return self.transport.request_json(
def get_shipping_fulfillments(self, order_id: str) -> ShippingFulfillmentPagedCollection:
return self.transport.request_model(
ShippingFulfillmentPagedCollection,
"GET",
f"/sell/fulfillment/v1/order/{order_id}/shipping_fulfillment",
scopes=[FULFILLMENT_READ_SCOPE],
)
def get_shipping_fulfillment(self, order_id: str, fulfillment_id: str) -> dict[str, Any]:
return self.transport.request_json(
def get_shipping_fulfillment(self, order_id: str, fulfillment_id: str) -> ShippingFulfillment:
return self.transport.request_model(
ShippingFulfillment,
"GET",
f"/sell/fulfillment/v1/order/{order_id}/shipping_fulfillment/{fulfillment_id}",
scopes=[FULFILLMENT_READ_SCOPE],