use lago_types::{
error::{LagoError, Result},
requests::coupon::{
CreateCouponRequest, DeleteCouponRequest, GetCouponRequest, ListCouponsRequest,
UpdateCouponRequest,
},
responses::coupon::{
CreateCouponResponse, DeleteCouponResponse, GetCouponResponse, ListCouponsResponse,
UpdateCouponResponse,
},
};
use serde::Serialize;
use url::Url;
use crate::client::LagoClient;
#[derive(Serialize)]
struct UpdateCouponBody {
coupon: lago_types::requests::coupon::UpdateCouponInput,
}
impl LagoClient {
pub async fn list_coupons(
&self,
request: Option<ListCouponsRequest>,
) -> Result<ListCouponsResponse> {
let request = request.unwrap_or_default();
let region = self.config.region()?;
let mut url = Url::parse(&format!("{}/coupons", region.endpoint()))
.map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
let query_params = request.to_query_params();
if !query_params.is_empty() {
let query_string = query_params
.iter()
.map(|(k, v)| format!("{k}={v}"))
.collect::<Vec<_>>()
.join("&");
url.set_query(Some(&query_string));
}
self.make_request("GET", url.as_str(), None::<&()>).await
}
pub async fn get_coupon(&self, request: GetCouponRequest) -> Result<GetCouponResponse> {
let region = self.config.region()?;
let url = format!("{}/coupons/{}", region.endpoint(), request.code);
self.make_request("GET", &url, None::<&()>).await
}
pub async fn create_coupon(
&self,
request: CreateCouponRequest,
) -> Result<CreateCouponResponse> {
let region = self.config.region()?;
let url = format!("{}/coupons", region.endpoint());
self.make_request("POST", &url, Some(&request)).await
}
pub async fn update_coupon(
&self,
request: UpdateCouponRequest,
) -> Result<UpdateCouponResponse> {
let region = self.config.region()?;
let url = format!("{}/coupons/{}", region.endpoint(), request.code);
let body = UpdateCouponBody {
coupon: request.coupon,
};
self.make_request("PUT", &url, Some(&body)).await
}
pub async fn delete_coupon(
&self,
request: DeleteCouponRequest,
) -> Result<DeleteCouponResponse> {
let region = self.config.region()?;
let url = format!("{}/coupons/{}", region.endpoint(), request.code);
self.make_request("DELETE", &url, None::<&()>).await
}
}