Skip to main content

lago_client/queries/
customer.rs

1use lago_types::{
2    error::{LagoError, Result},
3    requests::customer::{CreateCustomerRequest, GetCustomerRequest, ListCustomersRequest},
4    responses::customer::{CreateCustomerResponse, GetCustomerResponse, ListCustomersResponse},
5};
6use url::Url;
7
8use crate::client::LagoClient;
9
10impl LagoClient {
11    /// Retrieves a list of customers with optional filtering parameters
12    ///
13    /// # Arguments
14    /// * `request` - Optional filtering parameters for the customer list
15    ///
16    /// # Returns
17    /// A `Result` containing the list of customers or an error
18    pub async fn list_customers(
19        &self,
20        request: Option<ListCustomersRequest>,
21    ) -> Result<ListCustomersResponse> {
22        let request = request.unwrap_or_default();
23        let region = self.config.region()?;
24        let mut url = Url::parse(&format!("{}/customers", region.endpoint()))
25            .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
26
27        let query_params = request.to_query_params();
28
29        if !query_params.is_empty() {
30            let query_string = query_params
31                .iter()
32                .map(|(k, v)| format!("{k}={v}"))
33                .collect::<Vec<_>>()
34                .join("&");
35            url.set_query(Some(&query_string));
36        }
37
38        self.make_request("GET", url.as_str(), None::<&()>).await
39    }
40
41    /// Retrieves a specific customer by their external ID
42    ///
43    /// # Arguments
44    /// * `request` - The request containing the customer external ID to retrieve
45    ///
46    /// # Returns
47    /// A `Result` containing the customer data or an error
48    pub async fn get_customer(&self, request: GetCustomerRequest) -> Result<GetCustomerResponse> {
49        let region = self.config.region()?;
50        let url = format!("{}/customers/{}", region.endpoint(), request.external_id);
51
52        self.make_request("GET", &url, None::<&()>).await
53    }
54
55    /// Creates a new customer
56    ///
57    /// # Arguments
58    /// * `request` - The request containing the customer data to create
59    ///
60    /// # Returns
61    /// A `Result` containing the created customer data or an error
62    pub async fn create_customer(
63        &self,
64        request: CreateCustomerRequest,
65    ) -> Result<CreateCustomerResponse> {
66        let region = self.config.region()?;
67        let url = format!("{}/customers", region.endpoint());
68
69        self.make_request("POST", &url, Some(&request)).await
70    }
71}