lago_client/queries/
coupon.rs1use 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#[derive(Serialize)]
19struct UpdateCouponBody {
20 coupon: lago_types::requests::coupon::UpdateCouponInput,
21}
22
23impl LagoClient {
24 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 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 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 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 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}