lago_client/queries/
subscription.rs

1use lago_types::{
2    error::{LagoError, Result},
3    requests::subscription::{
4        CreateSubscriptionRequest, DeleteSubscriptionRequest, GetSubscriptionRequest,
5        ListCustomerSubscriptionsRequest, ListSubscriptionsRequest, UpdateSubscriptionRequest,
6    },
7    responses::subscription::{
8        CreateSubscriptionResponse, DeleteSubscriptionResponse, GetSubscriptionResponse,
9        ListSubscriptionsResponse, UpdateSubscriptionResponse,
10    },
11};
12use url::Url;
13
14use crate::client::LagoClient;
15
16impl LagoClient {
17    /// Lists all subscriptions with optional filters and pagination.
18    ///
19    /// # Arguments
20    /// * `request` - Optional request with pagination and filter parameters
21    ///
22    /// # Returns
23    /// A `Result` containing the list of subscriptions or an error
24    pub async fn list_subscriptions(
25        &self,
26        request: Option<ListSubscriptionsRequest>,
27    ) -> Result<ListSubscriptionsResponse> {
28        let region = self.config.region()?;
29        let mut url = Url::parse(&format!("{}/subscriptions", region.endpoint()))
30            .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
31
32        if let Some(req) = request {
33            let query_params = req.to_query_params();
34
35            if !query_params.is_empty() {
36                let query_string = query_params
37                    .iter()
38                    .map(|(k, v)| format!("{k}={v}"))
39                    .collect::<Vec<_>>()
40                    .join("&");
41                url.set_query(Some(&query_string));
42            }
43        }
44
45        self.make_request("GET", url.as_str(), None::<&()>).await
46    }
47
48    /// Retrieves a specific subscription by its external ID.
49    ///
50    /// # Arguments
51    /// * `request` - The request containing the subscription's external ID
52    ///
53    /// # Returns
54    /// A `Result` containing the subscription or an error
55    pub async fn get_subscription(
56        &self,
57        request: GetSubscriptionRequest,
58    ) -> Result<GetSubscriptionResponse> {
59        let region = self.config.region()?;
60        let url = Url::parse(&format!(
61            "{}/subscriptions/{}",
62            region.endpoint(),
63            request.external_id
64        ))
65        .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
66
67        self.make_request("GET", url.as_str(), None::<&()>).await
68    }
69
70    /// Lists all subscriptions for a specific customer.
71    ///
72    /// # Arguments
73    /// * `request` - The request containing the customer's external ID and optional filters
74    ///
75    /// # Returns
76    /// A `Result` containing the list of subscriptions or an error
77    pub async fn list_customer_subscriptions(
78        &self,
79        request: ListCustomerSubscriptionsRequest,
80    ) -> Result<ListSubscriptionsResponse> {
81        let region = self.config.region()?;
82        let mut url = Url::parse(&format!(
83            "{}/customers/{}/subscriptions",
84            region.endpoint(),
85            request.external_customer_id
86        ))
87        .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
88
89        let query_params = request.to_query_params();
90
91        if !query_params.is_empty() {
92            let query_string = query_params
93                .iter()
94                .map(|(k, v)| format!("{k}={v}"))
95                .collect::<Vec<_>>()
96                .join("&");
97            url.set_query(Some(&query_string));
98        }
99
100        self.make_request("GET", url.as_str(), None::<&()>).await
101    }
102
103    /// Creates a new subscription.
104    ///
105    /// # Arguments
106    /// * `request` - The subscription creation request with customer and plan details
107    ///
108    /// # Returns
109    /// A `Result` containing the created subscription or an error
110    pub async fn create_subscription(
111        &self,
112        request: CreateSubscriptionRequest,
113    ) -> Result<CreateSubscriptionResponse> {
114        let region = self.config.region()?;
115        let url = Url::parse(&format!("{}/subscriptions", region.endpoint()))
116            .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
117
118        self.make_request("POST", url.as_str(), Some(&request))
119            .await
120    }
121
122    /// Updates an existing subscription.
123    ///
124    /// # Arguments
125    /// * `request` - The subscription update request with the external ID and update data
126    ///
127    /// # Returns
128    /// A `Result` containing the updated subscription or an error
129    pub async fn update_subscription(
130        &self,
131        request: UpdateSubscriptionRequest,
132    ) -> Result<UpdateSubscriptionResponse> {
133        let region = self.config.region()?;
134        let url = Url::parse(&format!(
135            "{}/subscriptions/{}",
136            region.endpoint(),
137            request.external_id
138        ))
139        .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
140
141        self.make_request("PUT", url.as_str(), Some(&request)).await
142    }
143
144    /// Deletes (terminates) a subscription.
145    ///
146    /// # Arguments
147    /// * `request` - The delete request containing the subscription's external ID
148    ///
149    /// # Returns
150    /// A `Result` containing the terminated subscription or an error
151    pub async fn delete_subscription(
152        &self,
153        request: DeleteSubscriptionRequest,
154    ) -> Result<DeleteSubscriptionResponse> {
155        let region = self.config.region()?;
156        let mut url = Url::parse(&format!(
157            "{}/subscriptions/{}",
158            region.endpoint(),
159            request.external_id
160        ))
161        .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
162
163        let query_params = request.to_query_params();
164
165        if !query_params.is_empty() {
166            let query_string = query_params
167                .iter()
168                .map(|(k, v)| format!("{k}={v}"))
169                .collect::<Vec<_>>()
170                .join("&");
171            url.set_query(Some(&query_string));
172        }
173
174        self.make_request("DELETE", url.as_str(), None::<&()>).await
175    }
176}