lago_client/queries/
plan.rs

1use lago_types::{
2    error::{LagoError, Result},
3    requests::plan::{
4        CreatePlanRequest, DeletePlanRequest, GetPlanRequest, ListPlansRequest, UpdatePlanRequest,
5    },
6    responses::plan::{
7        CreatePlanResponse, DeletePlanResponse, GetPlanResponse, ListPlansResponse,
8        UpdatePlanResponse,
9    },
10};
11use url::Url;
12
13use crate::client::LagoClient;
14
15impl LagoClient {
16    /// Lists all plans with optional filters and pagination.
17    ///
18    /// # Arguments
19    /// * `request` - Optional request with pagination and filter parameters
20    ///
21    /// # Returns
22    /// A `Result` containing the list of plans or an error
23    pub async fn list_plans(&self, request: Option<ListPlansRequest>) -> Result<ListPlansResponse> {
24        let region = self.config.region()?;
25        let mut url = Url::parse(&format!("{}/plans", region.endpoint()))
26            .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
27
28        if let Some(req) = request {
29            let query_params = req.to_query_params();
30
31            if !query_params.is_empty() {
32                let query_string = query_params
33                    .iter()
34                    .map(|(k, v)| format!("{k}={v}"))
35                    .collect::<Vec<_>>()
36                    .join("&");
37                url.set_query(Some(&query_string));
38            }
39        }
40
41        self.make_request("GET", url.as_str(), None::<&()>).await
42    }
43
44    /// Retrieves a specific plan by its code.
45    ///
46    /// # Arguments
47    /// * `request` - The request containing the plan's code
48    ///
49    /// # Returns
50    /// A `Result` containing the plan or an error
51    pub async fn get_plan(&self, request: GetPlanRequest) -> Result<GetPlanResponse> {
52        let region = self.config.region()?;
53        let url = Url::parse(&format!("{}/plans/{}", region.endpoint(), request.code))
54            .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
55
56        self.make_request("GET", url.as_str(), None::<&()>).await
57    }
58
59    /// Creates a new plan.
60    ///
61    /// # Arguments
62    /// * `request` - The plan creation request with all plan details
63    ///
64    /// # Returns
65    /// A `Result` containing the created plan or an error
66    pub async fn create_plan(&self, request: CreatePlanRequest) -> Result<CreatePlanResponse> {
67        let region = self.config.region()?;
68        let url = Url::parse(&format!("{}/plans", region.endpoint()))
69            .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
70
71        self.make_request("POST", url.as_str(), Some(&request))
72            .await
73    }
74
75    /// Updates an existing plan.
76    ///
77    /// # Arguments
78    /// * `request` - The plan update request with the code and update data
79    ///
80    /// # Returns
81    /// A `Result` containing the updated plan or an error
82    pub async fn update_plan(&self, request: UpdatePlanRequest) -> Result<UpdatePlanResponse> {
83        let region = self.config.region()?;
84        let url = Url::parse(&format!("{}/plans/{}", region.endpoint(), request.code))
85            .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
86
87        self.make_request("PUT", url.as_str(), Some(&request)).await
88    }
89
90    /// Deletes a plan.
91    ///
92    /// # Arguments
93    /// * `request` - The delete request containing the plan's code
94    ///
95    /// # Returns
96    /// A `Result` containing the deleted plan or an error
97    pub async fn delete_plan(&self, request: DeletePlanRequest) -> Result<DeletePlanResponse> {
98        let region = self.config.region()?;
99        let url = Url::parse(&format!("{}/plans/{}", region.endpoint(), request.code))
100            .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
101
102        self.make_request("DELETE", url.as_str(), None::<&()>).await
103    }
104}