// This file is auto-generated by oagen. Do not edit.
use crate::client::Client;
#[allow(unused_imports)]
use crate::enums::*;
use crate::error::Error;
#[allow(unused_imports)]
use crate::models::*;
#[allow(unused_imports)]
use serde::Serialize;
pub struct CustomersApi<'a> {
pub(crate) client: &'a Client,
}
#[derive(Debug, Clone, Serialize)]
pub struct ListParams {
/// Number of items to return per page.
///
/// Defaults to `15`.
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i64>,
/// Page number to return.
///
/// Defaults to `1`.
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
/// Set to false to return at most 100 matching customers without pagination metadata.
///
/// Defaults to `true`.
#[serde(skip_serializing_if = "Option::is_none")]
pub pagination: Option<bool>,
/// Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "X-STORE")]
pub x_store: Option<String>,
}
impl Default for ListParams {
#[allow(deprecated)]
fn default() -> Self {
Self {
limit: Some(15),
page: Some(1),
pagination: Some(true),
x_store: Default::default(),
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct CreateCustomerParams {
/// Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "X-STORE")]
pub x_store: Option<String>,
/// Request body sent with this call.
///
/// Required.
#[serde(skip)]
pub body: SdkCreateCustomerRequestApplicationJson,
}
impl CreateCustomerParams {
/// Construct a new `CreateCustomerParams` with the required fields set.
#[allow(deprecated)]
pub fn new(body: SdkCreateCustomerRequestApplicationJson) -> Self {
Self {
x_store: Default::default(),
body,
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct SearchParams {
/// Number of items to return per page.
///
/// Defaults to `15`.
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i64>,
/// Page number to return.
///
/// Defaults to `1`.
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
/// Set to false to return at most 100 matching customers without pagination metadata.
///
/// Defaults to `true`.
#[serde(skip_serializing_if = "Option::is_none")]
pub pagination: Option<bool>,
/// Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "X-STORE")]
pub x_store: Option<String>,
/// Request body sent with this call.
///
/// Required.
#[serde(skip)]
pub body: SdkSearchCustomersRequestApplicationJson,
}
impl SearchParams {
/// Construct a new `SearchParams` with the required fields set.
#[allow(deprecated)]
pub fn new(body: SdkSearchCustomersRequestApplicationJson) -> Self {
Self {
limit: Some(15),
page: Some(1),
pagination: Some(true),
x_store: Default::default(),
body,
}
}
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct GetParams {
/// Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "X-STORE")]
pub x_store: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct UpdateCustomerParams {
/// Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "X-STORE")]
pub x_store: Option<String>,
/// Request body sent with this call.
///
/// Required.
#[serde(skip)]
pub body: SdkUpdateCustomerRequestApplicationJson,
}
impl UpdateCustomerParams {
/// Construct a new `UpdateCustomerParams` with the required fields set.
#[allow(deprecated)]
pub fn new(body: SdkUpdateCustomerRequestApplicationJson) -> Self {
Self {
x_store: Default::default(),
body,
}
}
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct GetCustomerByExternalIdParams {
/// Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "X-STORE")]
pub x_store: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct UpsertByExternalIdParams {
/// Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "X-STORE")]
pub x_store: Option<String>,
/// Request body sent with this call.
///
/// Required.
#[serde(skip)]
pub body: SdkUpsertCustomerRequestApplicationJson,
}
impl UpsertByExternalIdParams {
/// Construct a new `UpsertByExternalIdParams` with the required fields set.
#[allow(deprecated)]
pub fn new(body: SdkUpsertCustomerRequestApplicationJson) -> Self {
Self {
x_store: Default::default(),
body,
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct UpdateCustomerByExternalIdParams {
/// Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "X-STORE")]
pub x_store: Option<String>,
/// Request body sent with this call.
///
/// Required.
#[serde(skip)]
pub body: SdkUpdateCustomerRequestApplicationJson,
}
impl UpdateCustomerByExternalIdParams {
/// Construct a new `UpdateCustomerByExternalIdParams` with the required fields set.
#[allow(deprecated)]
pub fn new(body: SdkUpdateCustomerRequestApplicationJson) -> Self {
Self {
x_store: Default::default(),
body,
}
}
}
impl<'a> CustomersApi<'a> {
/// List customers
///
/// List customer profiles for the authenticated store. Requires the `invoice` Sanctum ability and matching store permission. Responses deliberately redact checkout IP, billing, location, and community identity data. OAuth callers use the admin grant and select a store with X-STORE. Current membership and role permissions apply to every request.
pub async fn list(
&self,
params: ListParams,
) -> Result<SdkListCustomersResponseValue200ApplicationJson, Error> {
self.list_with_options(params, None).await
}
/// Variant of [`Self::list`] that accepts per-request [`crate::RequestOptions`].
pub async fn list_with_options(
&self,
params: ListParams,
options: Option<&crate::RequestOptions>,
) -> Result<SdkListCustomersResponseValue200ApplicationJson, Error> {
self.list_raw(params, options)
.await
.map(|response| response.data)
}
/// Returns the typed result together with status, headers, and request ID.
pub async fn list_raw(
&self,
params: ListParams,
options: Option<&crate::RequestOptions>,
) -> Result<crate::RawResponse<SdkListCustomersResponseValue200ApplicationJson>, Error> {
let path = "/v2/customers".to_string();
let method = http::Method::GET;
let mut merged = options.cloned().unwrap_or_default();
merged.idempotency_supported = false;
merged.operation_id = Some("listCustomers".to_string());
let options = Some(&merged);
self.client
.request_with_query_schema_opts_raw(
method,
&path,
¶ms,
options,
"GET /v2/customers",
)
.await
}
/// Create a customer
///
/// Create a customer with normalized unique email and immutable-per-store external_id. OAuth callers use the admin grant and select a store with X-STORE. Current membership and role permissions apply to every request.
pub async fn create_customer(
&self,
params: CreateCustomerParams,
) -> Result<SdkCreateCustomerResponseValue201ApplicationJson, Error> {
self.create_customer_with_options(params, None).await
}
/// Variant of [`Self::create_customer`] that accepts per-request [`crate::RequestOptions`].
pub async fn create_customer_with_options(
&self,
params: CreateCustomerParams,
options: Option<&crate::RequestOptions>,
) -> Result<SdkCreateCustomerResponseValue201ApplicationJson, Error> {
self.create_customer_raw(params, options)
.await
.map(|response| response.data)
}
/// Returns the typed result together with status, headers, and request ID.
pub async fn create_customer_raw(
&self,
params: CreateCustomerParams,
options: Option<&crate::RequestOptions>,
) -> Result<crate::RawResponse<SdkCreateCustomerResponseValue201ApplicationJson>, Error> {
let path = "/v2/customers".to_string();
let method = http::Method::POST;
let mut merged = options.cloned().unwrap_or_default();
merged.idempotency_supported = true;
merged.operation_id = Some("createCustomer".to_string());
let options = Some(&merged);
self.client
.request_with_body_schema_opts_raw(
method,
&path,
¶ms,
Some(¶ms.body),
options,
"POST /v2/customers",
)
.await
}
/// Search customers
///
/// Search customer email identities and compose supported ID or email filters and deterministic sorts. Requires the `invoice` Sanctum ability and matching store permission. OAuth callers use the admin grant and select a store with X-STORE. Current membership and role permissions apply to every request.
pub async fn search(
&self,
params: SearchParams,
) -> Result<SdkSearchCustomersResponseValue200ApplicationJson, Error> {
self.search_with_options(params, None).await
}
/// Variant of [`Self::search`] that accepts per-request [`crate::RequestOptions`].
pub async fn search_with_options(
&self,
params: SearchParams,
options: Option<&crate::RequestOptions>,
) -> Result<SdkSearchCustomersResponseValue200ApplicationJson, Error> {
self.search_raw(params, options)
.await
.map(|response| response.data)
}
/// Returns the typed result together with status, headers, and request ID.
pub async fn search_raw(
&self,
params: SearchParams,
options: Option<&crate::RequestOptions>,
) -> Result<crate::RawResponse<SdkSearchCustomersResponseValue200ApplicationJson>, Error> {
let path = "/v2/customers/search".to_string();
let method = http::Method::POST;
let mut merged = options.cloned().unwrap_or_default();
merged.idempotency_supported = false;
merged.operation_id = Some("searchCustomers".to_string());
let options = Some(&merged);
self.client
.request_with_body_schema_opts_raw(
method,
&path,
¶ms,
Some(¶ms.body),
options,
"POST /v2/customers/search",
)
.await
}
/// Retrieve a customer
///
/// Retrieve a store-scoped customer profile and concise order, line-item, subscription, and revenue insights. Wallet insights are included only when the token and staff role also have wallet or store management permission. Requires the `invoice` Sanctum ability and matching store permission. OAuth callers use the admin grant and select a store with X-STORE. Current membership and role permissions apply to every request.
pub async fn get(
&self,
customer: &str,
params: GetParams,
) -> Result<SdkGetCustomerResponseValue200ApplicationJson, Error> {
self.get_with_options(customer, params, None).await
}
/// Variant of [`Self::get`] that accepts per-request [`crate::RequestOptions`].
pub async fn get_with_options(
&self,
customer: &str,
params: GetParams,
options: Option<&crate::RequestOptions>,
) -> Result<SdkGetCustomerResponseValue200ApplicationJson, Error> {
self.get_raw(customer, params, options)
.await
.map(|response| response.data)
}
/// Returns the typed result together with status, headers, and request ID.
pub async fn get_raw(
&self,
customer: &str,
params: GetParams,
options: Option<&crate::RequestOptions>,
) -> Result<crate::RawResponse<SdkGetCustomerResponseValue200ApplicationJson>, Error> {
let customer = crate::client::path_segment(customer);
let path = format!("/v2/customers/{customer}");
let method = http::Method::GET;
let mut merged = options.cloned().unwrap_or_default();
merged.idempotency_supported = false;
merged.operation_id = Some("getCustomer".to_string());
let options = Some(&merged);
self.client
.request_with_query_schema_opts_raw(
method,
&path,
¶ms,
options,
"GET /v2/customers/{customer}",
)
.await
}
/// Update a customer
///
/// Update name, BCP 47 locale, normalized email, or constrained scalar metadata. Assign external_id when it is unset; changing an existing external_id returns 409. OAuth callers use the admin grant and select a store with X-STORE. Current membership and role permissions apply to every request.
pub async fn update_customer(
&self,
customer: &str,
params: UpdateCustomerParams,
) -> Result<SdkUpdateCustomerResponseValue200ApplicationJson, Error> {
self.update_customer_with_options(customer, params, None)
.await
}
/// Variant of [`Self::update_customer`] that accepts per-request [`crate::RequestOptions`].
pub async fn update_customer_with_options(
&self,
customer: &str,
params: UpdateCustomerParams,
options: Option<&crate::RequestOptions>,
) -> Result<SdkUpdateCustomerResponseValue200ApplicationJson, Error> {
self.update_customer_raw(customer, params, options)
.await
.map(|response| response.data)
}
/// Returns the typed result together with status, headers, and request ID.
pub async fn update_customer_raw(
&self,
customer: &str,
params: UpdateCustomerParams,
options: Option<&crate::RequestOptions>,
) -> Result<crate::RawResponse<SdkUpdateCustomerResponseValue200ApplicationJson>, Error> {
let customer = crate::client::path_segment(customer);
let path = format!("/v2/customers/{customer}");
let method = http::Method::PATCH;
let mut merged = options.cloned().unwrap_or_default();
merged.idempotency_supported = true;
merged.operation_id = Some("updateCustomer".to_string());
let options = Some(&merged);
self.client
.request_with_body_schema_opts_raw(
method,
&path,
¶ms,
Some(¶ms.body),
options,
"PATCH /v2/customers/{customer}",
)
.await
}
/// Retrieve a customer by external ID
///
/// Resolve by immutable store-local external ID. OAuth callers use the admin grant and select a store with X-STORE. Current membership and role permissions apply to every request.
pub async fn get_customer_by_external_id(
&self,
external_id: &str,
params: GetCustomerByExternalIdParams,
) -> Result<SdkGetCustomerResponseValue200ApplicationJson, Error> {
self.get_customer_by_external_id_with_options(external_id, params, None)
.await
}
/// Variant of [`Self::get_customer_by_external_id`] that accepts per-request [`crate::RequestOptions`].
pub async fn get_customer_by_external_id_with_options(
&self,
external_id: &str,
params: GetCustomerByExternalIdParams,
options: Option<&crate::RequestOptions>,
) -> Result<SdkGetCustomerResponseValue200ApplicationJson, Error> {
self.get_customer_by_external_id_raw(external_id, params, options)
.await
.map(|response| response.data)
}
/// Returns the typed result together with status, headers, and request ID.
pub async fn get_customer_by_external_id_raw(
&self,
external_id: &str,
params: GetCustomerByExternalIdParams,
options: Option<&crate::RequestOptions>,
) -> Result<crate::RawResponse<SdkGetCustomerResponseValue200ApplicationJson>, Error> {
let external_id = crate::client::path_segment(external_id);
let path = format!("/v2/customers/external/{external_id}");
let method = http::Method::GET;
let mut merged = options.cloned().unwrap_or_default();
merged.idempotency_supported = false;
merged.operation_id = Some("getCustomerByExternalId".to_string());
let options = Some(&merged);
self.client
.request_with_query_schema_opts_raw(
method,
&path,
¶ms,
options,
"GET /v2/customers/external/{externalId}",
)
.await
}
/// Create or update a customer by external ID
///
/// Create a customer when the store-local external ID is new, or update the same customer when it already exists. Requires the invoice API-key ability and store invoice permission. Send email on every call; omitted name, locale, and metadata remain unchanged. Metadata replaces the complete metadata object when supplied. The external ID comes from the URL and cannot be changed in the body. An email already used by another customer returns 422; a concurrent email or external-ID collision returns 409. Retrieve the customer and check its identity before retrying. Accounts are never merged. Returns 201 on creation and 200 on update. Reusing the external ID preserves customer identity. Use the same optional Idempotency-Key and body to replay an identical response. OAuth callers use the admin grant and select a store with X-STORE. Current membership and role permissions apply to every request.
pub async fn upsert_by_external_id(
&self,
external_id: &str,
params: UpsertByExternalIdParams,
) -> Result<SdkUpsertCustomerResponseValue200ApplicationJson, Error> {
self.upsert_by_external_id_with_options(external_id, params, None)
.await
}
/// Variant of [`Self::upsert_by_external_id`] that accepts per-request [`crate::RequestOptions`].
pub async fn upsert_by_external_id_with_options(
&self,
external_id: &str,
params: UpsertByExternalIdParams,
options: Option<&crate::RequestOptions>,
) -> Result<SdkUpsertCustomerResponseValue200ApplicationJson, Error> {
self.upsert_by_external_id_raw(external_id, params, options)
.await
.map(|response| response.data)
}
/// Returns the typed result together with status, headers, and request ID.
pub async fn upsert_by_external_id_raw(
&self,
external_id: &str,
params: UpsertByExternalIdParams,
options: Option<&crate::RequestOptions>,
) -> Result<crate::RawResponse<SdkUpsertCustomerResponseValue200ApplicationJson>, Error> {
let external_id = crate::client::path_segment(external_id);
let path = format!("/v2/customers/external/{external_id}");
let method = http::Method::PUT;
let mut merged = options.cloned().unwrap_or_default();
merged.idempotency_supported = true;
merged.operation_id = Some("upsertCustomerByExternalId".to_string());
let options = Some(&merged);
self.client
.request_with_body_schema_opts_raw(
method,
&path,
¶ms,
Some(¶ms.body),
options,
"PUT /v2/customers/external/{externalId}",
)
.await
}
/// Update a customer by external ID
///
/// Update the customer resolved by immutable external ID. OAuth callers use the admin grant and select a store with X-STORE. Current membership and role permissions apply to every request.
pub async fn update_customer_by_external_id(
&self,
external_id: &str,
params: UpdateCustomerByExternalIdParams,
) -> Result<SdkUpdateCustomerResponseValue200ApplicationJson, Error> {
self.update_customer_by_external_id_with_options(external_id, params, None)
.await
}
/// Variant of [`Self::update_customer_by_external_id`] that accepts per-request [`crate::RequestOptions`].
pub async fn update_customer_by_external_id_with_options(
&self,
external_id: &str,
params: UpdateCustomerByExternalIdParams,
options: Option<&crate::RequestOptions>,
) -> Result<SdkUpdateCustomerResponseValue200ApplicationJson, Error> {
self.update_customer_by_external_id_raw(external_id, params, options)
.await
.map(|response| response.data)
}
/// Returns the typed result together with status, headers, and request ID.
pub async fn update_customer_by_external_id_raw(
&self,
external_id: &str,
params: UpdateCustomerByExternalIdParams,
options: Option<&crate::RequestOptions>,
) -> Result<crate::RawResponse<SdkUpdateCustomerResponseValue200ApplicationJson>, Error> {
let external_id = crate::client::path_segment(external_id);
let path = format!("/v2/customers/external/{external_id}");
let method = http::Method::PATCH;
let mut merged = options.cloned().unwrap_or_default();
merged.idempotency_supported = true;
merged.operation_id = Some("updateCustomerByExternalId".to_string());
let options = Some(&merged);
self.client
.request_with_body_schema_opts_raw(
method,
&path,
¶ms,
Some(¶ms.body),
options,
"PATCH /v2/customers/external/{externalId}",
)
.await
}
}