from __future__ import annotations
from typing import (
TYPE_CHECKING,
Any,
Coroutine,
Dict,
Generic,
List,
Literal,
Optional,
TypeVar,
Union,
overload,
)
from .models.customers import Customer
from .models.meta import Empty
from .models.response import (
BillingPortalResponse,
ListCustomerResponse,
PricingTableResponse,
)
from .utils import _build_payload
if TYPE_CHECKING:
from .aio.http import AsyncHTTPClient
from .http import HTTPClient
T_HttpClient = TypeVar("T_HttpClient", "AsyncHTTPClient", "HTTPClient")
__all__ = ("Customers",)
[docs]
class Customers(Generic[T_HttpClient]):
"""An interface to Autumn's customer API.
.. warning::
This class is not intended for public use. It is used internally by the :class:`autumn.Client` class.
Do not initialize this class directly.
"""
def __init__(self, http: T_HttpClient):
self._http = http
@overload
def get(
self: "Customers[HTTPClient]",
customer_id: str,
expand: Optional[
List[
Literal[
"invoices",
"rewards",
"trials_used",
"entities",
"referrals",
"payment_method",
]
]
] = None,
) -> Customer: ...
@overload
def get(
self: "Customers[AsyncHTTPClient]",
customer_id: str,
expand: Optional[
List[
Literal[
"invoices",
"rewards",
"trials_used",
"entities",
"referrals",
"payment_method",
]
]
] = None,
) -> Coroutine[Any, Any, Customer]: ...
[docs]
def get(
self,
customer_id: str,
expand: Optional[
List[
Literal[
"invoices",
"rewards",
"trials_used",
"entities",
"referrals",
"payment_method",
]
]
] = None,
) -> Union[Customer, Coroutine[Any, Any, Customer]]:
"""Get a customer by their ID.
|maybecoro|
Parameters
----------
customer_id: str
The ID of the customer to get.
expand: Optional[List[Literal["invoices", "rewards", "trials_used", "entities", "referrals", "payment_method"]]]
Additional fields to expand in the response.
Returns
-------
:class:`~autumn.models.customers.Customer`
The customer.
"""
params = {}
if expand is not None:
params["expand"] = expand
return self._http.request(
"GET", f"/customers/{customer_id}", Customer, params=params
)
@overload
def list(
self: "Customers[HTTPClient]", *, limit: int = 10, offset: int = 0
) -> ListCustomerResponse: ...
@overload
def list(
self: "Customers[AsyncHTTPClient]", *, limit: int = 10, offset: int = 0
) -> Coroutine[Any, Any, ListCustomerResponse]: ...
[docs]
def list(
self, *, limit: int = 10, offset: int = 0
) -> Union[
ListCustomerResponse, Coroutine[Any, Any, ListCustomerResponse]
]:
params = {"limit": limit, "offset": offset}
return self._http.request(
"GET", "/customers", ListCustomerResponse, params=params
)
@overload
def create(
self: "Customers[HTTPClient]",
id: str,
*,
email: Optional[str] = None,
name: Optional[str] = None,
stripe_id: Optional[str] = None,
metadata: Optional[Dict[str, Any]] = None,
) -> Customer: ...
@overload
def create(
self: "Customers[AsyncHTTPClient]",
id: str,
*,
email: Optional[str] = None,
name: Optional[str] = None,
stripe_id: Optional[str] = None,
metadata: Optional[Dict[str, Any]] = None,
) -> Coroutine[Any, Any, Customer]: ...
[docs]
def create(
self,
id: str,
*,
email: Optional[str] = None,
name: Optional[str] = None,
stripe_id: Optional[str] = None,
metadata: Optional[Dict[str, Any]] = None,
) -> Union[Customer, Coroutine[Any, Any, Customer]]:
"""Create a new customer.
|maybecoro|
Parameters
----------
id: str
The ID of the customer to create.
email: Optional[str]
The customer's email address.
name: Optional[str]
The customer's name.
stripe_id: Optional[str]
The customer's Stripe ID. This can be a new or existing ID.
metadata: Optional[Dict[str, Any]]
Additional metadata to attach to the customer.
Returns
-------
:class:`~autumn.models.customers.Customer`
The created customer.
"""
payload = _build_payload(locals(), Customers.create)
return self._http.request("POST", "/customers", Customer, json=payload)
@overload
def update(
self: "Customers[HTTPClient]",
customer_id: str,
*,
name: Optional[str] = None,
email: Optional[str] = None,
fingerprint: Optional[str] = None,
) -> Customer: ...
@overload
def update(
self: "Customers[AsyncHTTPClient]",
customer_id: str,
*,
name: Optional[str] = None,
email: Optional[str] = None,
fingerprint: Optional[str] = None,
) -> Coroutine[Any, Any, Customer]: ...
[docs]
def update(
self,
customer_id: str,
*,
name: Optional[str] = None,
email: Optional[str] = None,
fingerprint: Optional[str] = None,
) -> Union[Customer, Coroutine[Any, Any, Customer]]:
"""Update a customer.
|maybecoro|
Parameters
----------
customer_id: str
The ID of the customer to update.
name: Optional[str]
The customer's new name.
email: Optional[str]
The customer's new email address.
fingerprint: Optional[str]
The customer's new fingerprint.
Returns
-------
:class:`~autumn.models.customers.Customer`
The updated customer.
"""
payload = _build_payload(
locals(), Customers.update, ignore={"customer_id"}
)
return self._http.request(
"POST", f"/customers/{customer_id}", Customer, json=payload
)
@overload
def delete(self: "Customers[HTTPClient]", customer_id: str) -> Empty: ...
@overload
def delete(
self: "Customers[AsyncHTTPClient]", customer_id: str
) -> Coroutine[Any, Any, Empty]: ...
[docs]
def delete(
self, customer_id: str
) -> Union[Empty, Coroutine[Any, Any, Empty]]:
"""Delete a customer.
Parameters
----------
customer_id: str
The ID of the customer to delete.
Returns
-------
:class:`~autumn.models.customers.Empty`
An empty response.
|maybecoro|
"""
return self._http.request("DELETE", f"/customers/{customer_id}", Empty)
@overload
def get_billing_portal(
self: "Customers[HTTPClient]",
customer_id: str,
*,
return_url: Optional[str] = None,
) -> BillingPortalResponse: ...
@overload
def get_billing_portal(
self: "Customers[AsyncHTTPClient]",
customer_id: str,
*,
return_url: Optional[str] = None,
) -> Coroutine[Any, Any, BillingPortalResponse]: ...
[docs]
def get_billing_portal(
self,
customer_id: str,
*,
return_url: Optional[str] = None,
) -> Union[
BillingPortalResponse, Coroutine[Any, Any, BillingPortalResponse]
]:
"""Get a billing portal URL for a customer.
|maybecoro|
Parameters
----------
customer_id: str
The ID of the customer to get a billing portal URL for.
return_url: Optional[str]
The URL to return to after the customer has completed the billing portal.
Returns
-------
:class:`~autumn.models.response.BillingPortalResponse`
The billing portal URL.
"""
payload = _build_payload(
locals(),
Customers.get_billing_portal,
ignore={"customer_id"},
)
return self._http.request(
"POST",
f"/customers/{customer_id}/billing_portal",
BillingPortalResponse,
json=payload,
)
@overload
def pricing_table(
self: "Customers[HTTPClient]", customer_id: str
) -> PricingTableResponse: ...
@overload
def pricing_table(
self: "Customers[AsyncHTTPClient]", customer_id: str
) -> Coroutine[Any, Any, PricingTableResponse]: ...
[docs]
def pricing_table(
self, customer_id: str
) -> Union[
PricingTableResponse, Coroutine[Any, Any, PricingTableResponse]
]:
"""Get a pricing table for a customer.
|maybecoro|
Parameters
----------
customer_id: str
The ID of the customer to get a pricing table for.
Returns
-------
:class:`~autumn.models.response.PricingTableResponse`
The pricing table.
"""
params = {"customer_id": customer_id}
return self._http.request(
"GET",
"/components/pricing_table",
PricingTableResponse,
params=params,
)