Skip to main content

lago_client/queries/
payment.rs

1use lago_types::{
2    error::{LagoError, Result},
3    requests::payment::{
4        CreatePaymentRequest, GetPaymentRequest, ListCustomerPaymentsRequest, ListPaymentsRequest,
5    },
6    responses::payment::{CreatePaymentResponse, GetPaymentResponse, ListPaymentsResponse},
7};
8use url::Url;
9
10use crate::client::LagoClient;
11
12/// Payment-related operations for the Lago client
13impl LagoClient {
14    /// Retrieves a list of payments with optional filtering parameters
15    ///
16    /// # Arguments
17    /// * `request` - Optional filtering parameters for the payment list
18    ///
19    /// # Returns
20    /// A `Result` containing the list of payments or an error
21    pub async fn list_payments(
22        &self,
23        request: Option<ListPaymentsRequest>,
24    ) -> Result<ListPaymentsResponse> {
25        let request = request.unwrap_or_default();
26        let region = self.config.region()?;
27        let mut url = Url::parse(&format!("{}/payments", region.endpoint()))
28            .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
29
30        let query_params = request.to_query_params();
31
32        if !query_params.is_empty() {
33            let query_string = query_params
34                .iter()
35                .map(|(k, v)| format!("{k}={v}"))
36                .collect::<Vec<_>>()
37                .join("&");
38            url.set_query(Some(&query_string));
39        }
40
41        self.make_request("GET", url.as_str(), None::<&()>).await
42    }
43
44    /// Retrieves a specific payment by its Lago ID
45    ///
46    /// # Arguments
47    /// * `request` - The request containing the payment ID to retrieve
48    ///
49    /// # Returns
50    /// A `Result` containing the payment data or an error
51    pub async fn get_payment(&self, request: GetPaymentRequest) -> Result<GetPaymentResponse> {
52        let region = self.config.region()?;
53        let url = format!("{}/payments/{}", region.endpoint(), request.lago_id);
54        self.make_request("GET", &url, None::<&()>).await
55    }
56
57    /// Creates a manual payment for an invoice
58    ///
59    /// # Arguments
60    /// * `request` - The request containing the payment details
61    ///
62    /// # Returns
63    /// A `Result` containing the created payment or an error
64    pub async fn create_payment(
65        &self,
66        request: CreatePaymentRequest,
67    ) -> Result<CreatePaymentResponse> {
68        let region = self.config.region()?;
69        let url = format!("{}/payments", region.endpoint());
70        self.make_request("POST", &url, Some(&request)).await
71    }
72
73    /// Retrieves a list of payments for a specific customer
74    ///
75    /// # Arguments
76    /// * `request` - The request containing the customer ID and optional filters
77    ///
78    /// # Returns
79    /// A `Result` containing the list of payments or an error
80    pub async fn list_customer_payments(
81        &self,
82        request: ListCustomerPaymentsRequest,
83    ) -> Result<ListPaymentsResponse> {
84        let region = self.config.region()?;
85        let mut url = Url::parse(&format!(
86            "{}/customers/{}/payments",
87            region.endpoint(),
88            urlencoding::encode(&request.external_customer_id)
89        ))
90        .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
91
92        let query_params = request.to_query_params();
93
94        if !query_params.is_empty() {
95            let query_string = query_params
96                .iter()
97                .map(|(k, v)| format!("{k}={v}"))
98                .collect::<Vec<_>>()
99                .join("&");
100            url.set_query(Some(&query_string));
101        }
102
103        self.make_request("GET", url.as_str(), None::<&()>).await
104    }
105}