Skip to main content

lago_client/queries/
coupon.rs

1use lago_types::{
2    error::{LagoError, Result},
3    requests::coupon::{
4        CreateCouponRequest, DeleteCouponRequest, GetCouponRequest, ListCouponsRequest,
5        UpdateCouponRequest,
6    },
7    responses::coupon::{
8        CreateCouponResponse, DeleteCouponResponse, GetCouponResponse, ListCouponsResponse,
9        UpdateCouponResponse,
10    },
11};
12use serde::Serialize;
13use url::Url;
14
15use crate::client::LagoClient;
16
17/// Internal struct for serializing update request body (without the code field)
18#[derive(Serialize)]
19struct UpdateCouponBody {
20    coupon: lago_types::requests::coupon::UpdateCouponInput,
21}
22
23impl LagoClient {
24    /// Retrieves a list of coupons with optional filtering parameters
25    ///
26    /// # Arguments
27    /// * `request` - Optional filtering parameters for the coupon list
28    ///
29    /// # Returns
30    /// A `Result` containing the list of coupons or an error
31    pub async fn list_coupons(
32        &self,
33        request: Option<ListCouponsRequest>,
34    ) -> Result<ListCouponsResponse> {
35        let request = request.unwrap_or_default();
36        let region = self.config.region()?;
37        let mut url = Url::parse(&format!("{}/coupons", region.endpoint()))
38            .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
39
40        let query_params = request.to_query_params();
41
42        if !query_params.is_empty() {
43            let query_string = query_params
44                .iter()
45                .map(|(k, v)| format!("{k}={v}"))
46                .collect::<Vec<_>>()
47                .join("&");
48            url.set_query(Some(&query_string));
49        }
50
51        self.make_request("GET", url.as_str(), None::<&()>).await
52    }
53
54    /// Retrieves a coupon by its code
55    ///
56    /// # Arguments
57    /// * `request` - The request containing the coupon code to retrieve
58    ///
59    /// # Returns
60    /// A `Result` containing the coupon data or an error
61    pub async fn get_coupon(&self, request: GetCouponRequest) -> Result<GetCouponResponse> {
62        let region = self.config.region()?;
63        let url = format!("{}/coupons/{}", region.endpoint(), request.code);
64
65        self.make_request("GET", &url, None::<&()>).await
66    }
67
68    /// Creates a new coupon
69    ///
70    /// # Arguments
71    /// * `request` - The request containing the coupon data to create
72    ///
73    /// # Returns
74    /// A `Result` containing the created coupon data or an error
75    pub async fn create_coupon(
76        &self,
77        request: CreateCouponRequest,
78    ) -> Result<CreateCouponResponse> {
79        let region = self.config.region()?;
80        let url = format!("{}/coupons", region.endpoint());
81
82        self.make_request("POST", &url, Some(&request)).await
83    }
84
85    /// Updates an existing coupon
86    ///
87    /// # Arguments
88    /// * `request` - The request containing the coupon code and update data
89    ///
90    /// # Returns
91    /// A `Result` containing the updated coupon data or an error
92    pub async fn update_coupon(
93        &self,
94        request: UpdateCouponRequest,
95    ) -> Result<UpdateCouponResponse> {
96        let region = self.config.region()?;
97        let url = format!("{}/coupons/{}", region.endpoint(), request.code);
98
99        let body = UpdateCouponBody {
100            coupon: request.coupon,
101        };
102
103        self.make_request("PUT", &url, Some(&body)).await
104    }
105
106    /// Deletes a coupon by its code
107    ///
108    /// # Arguments
109    /// * `request` - The request containing the coupon code to delete
110    ///
111    /// # Returns
112    /// A `Result` containing the deleted coupon data or an error
113    pub async fn delete_coupon(
114        &self,
115        request: DeleteCouponRequest,
116    ) -> Result<DeleteCouponResponse> {
117        let region = self.config.region()?;
118        let url = format!("{}/coupons/{}", region.endpoint(), request.code);
119
120        self.make_request("DELETE", &url, None::<&()>).await
121    }
122}