"""Outlet resource: ``/outlets`` + related location / tag / disclaimer endpoints."""
from __future__ import annotations
from typing import Any
from pypresscart.models._common import Paginated, Tag, serialize_filters
from pypresscart.models.outlets import (
CitiesResponse,
CountriesResponse,
DisclaimerRecord,
Outlet,
OutletListing,
StatesResponse,
)
from pypresscart.resources._base import ResourceBase
[docs]
class OutletsResource(ResourceBase):
"""Endpoints for browsing outlets and their metadata."""
[docs]
def list(
self,
*,
limit: int = 25,
page: int = 1,
sort_by: str | None = None,
order_by: str | None = None,
filters: dict[str, Any] | None = None,
as_json: bool | None = None,
) -> Paginated[OutletListing] | dict[str, Any]:
"""List outlets. Required scope: ``outlets.lists``."""
params: dict[str, Any] = {
"limit": limit,
"page": page,
"sort_by": sort_by,
"order_by": order_by,
}
params.update(serialize_filters("filters", filters))
payload = self._client._request("GET", "/outlets", params=params)
return self._parse_paginated(payload, OutletListing, as_json)
[docs]
def get(
self,
outlet_id: str,
*,
as_json: bool | None = None,
) -> Outlet | dict[str, Any]:
"""Get a single outlet by id. Required scope: ``outlets.read``."""
payload = self._client._request("GET", f"/outlets/{outlet_id}")
return self._parse(payload, Outlet, as_json)
[docs]
def list_products(
self,
outlet_id: str,
*,
limit: int = 25,
page: int = 1,
sort_by: str | None = None,
order_by: str | None = None,
filters: dict[str, Any] | None = None,
as_json: bool | None = None,
) -> Paginated[OutletListing] | dict[str, Any]:
"""List products for one outlet. Required scope: ``outlets.read``."""
params: dict[str, Any] = {
"limit": limit,
"page": page,
"sort_by": sort_by,
"order_by": order_by,
}
params.update(serialize_filters("filters", filters))
payload = self._client._request("GET", f"/outlets/{outlet_id}/products", params=params)
return self._parse_paginated(payload, OutletListing, as_json)
[docs]
def list_countries(
self,
*,
country: str | None = None,
as_json: bool | None = None,
) -> CountriesResponse | dict[str, Any]:
"""List available outlet countries. Required scope: ``outlets.read``."""
payload = self._client._request(
"GET", "/outlets/locations/countries", params={"country": country}
)
return self._parse(payload, CountriesResponse, as_json)
[docs]
def list_states(
self,
*,
country: str | None = None,
as_json: bool | None = None,
) -> StatesResponse | dict[str, Any]:
"""List available outlet states (optionally filtered by country). Scope: ``outlets.read``."""
payload = self._client._request(
"GET", "/outlets/locations/states", params={"country": country}
)
return self._parse(payload, StatesResponse, as_json)
[docs]
def list_cities(
self,
*,
country: str | None = None,
state: str | None = None,
as_json: bool | None = None,
) -> CitiesResponse | dict[str, Any]:
"""List available outlet cities. Required scope: ``outlets.read``."""
payload = self._client._request(
"GET",
"/outlets/locations/cities",
params={"country": country, "state": state},
)
return self._parse(payload, CitiesResponse, as_json)
[docs]
def list_disclaimers(
self,
*,
limit: int = 25,
page: int = 1,
filters: dict[str, Any] | None = None,
as_json: bool | None = None,
) -> Paginated[DisclaimerRecord] | dict[str, Any]:
"""List outlet disclaimers. Required scope: ``outlet_disclaimers.lists``."""
params: dict[str, Any] = {"limit": limit, "page": page}
params.update(serialize_filters("filters", filters))
payload = self._client._request("GET", "/outlet-disclaimers", params=params)
return self._parse_paginated(payload, DisclaimerRecord, as_json)