use serde::{Deserialize, Serialize};
use crate::filters::{applied_coupon::AppliedCouponFilter, common::ListFilters};
use crate::models::{AppliedCouponFrequency, PaginationParams};
#[derive(Debug, Clone)]
pub struct ListAppliedCouponsRequest {
pub pagination: PaginationParams,
pub filters: AppliedCouponFilter,
}
impl ListAppliedCouponsRequest {
pub fn new() -> Self {
Self {
pagination: PaginationParams::default(),
filters: AppliedCouponFilter::default(),
}
}
pub fn with_pagination(mut self, pagination: PaginationParams) -> Self {
self.pagination = pagination;
self
}
pub fn with_filters(mut self, filters: AppliedCouponFilter) -> Self {
self.filters = filters;
self
}
pub fn to_query_params(&self) -> Vec<(&str, String)> {
let mut params = self.pagination.to_query_params();
params.extend(self.filters.to_query_params());
params
}
}
impl Default for ListAppliedCouponsRequest {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApplyCouponInput {
pub external_customer_id: String,
pub coupon_code: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub frequency: Option<AppliedCouponFrequency>,
#[serde(skip_serializing_if = "Option::is_none")]
pub frequency_duration: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub amount_cents: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub amount_currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub percentage_rate: Option<String>,
}
impl ApplyCouponInput {
pub fn new(external_customer_id: String, coupon_code: String) -> Self {
Self {
external_customer_id,
coupon_code,
frequency: None,
frequency_duration: None,
amount_cents: None,
amount_currency: None,
percentage_rate: None,
}
}
pub fn with_frequency(mut self, frequency: AppliedCouponFrequency) -> Self {
self.frequency = Some(frequency);
self
}
pub fn with_frequency_duration(mut self, duration: i32) -> Self {
self.frequency_duration = Some(duration);
self
}
pub fn with_fixed_amount(mut self, amount_cents: i64, currency: String) -> Self {
self.amount_cents = Some(amount_cents);
self.amount_currency = Some(currency);
self
}
pub fn with_percentage_rate(mut self, percentage_rate: String) -> Self {
self.percentage_rate = Some(percentage_rate);
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApplyCouponRequest {
pub applied_coupon: ApplyCouponInput,
}
impl ApplyCouponRequest {
pub fn new(input: ApplyCouponInput) -> Self {
Self {
applied_coupon: input,
}
}
}