use serde::{Deserialize, Serialize};
use crate::filters::common::ListFilters;
use crate::filters::subscription::SubscriptionFilters;
use crate::models::{PaginationParams, SubscriptionActivationRuleType, SubscriptionBillingTime};
#[derive(Debug, Clone)]
pub struct ListSubscriptionsRequest {
pub pagination: PaginationParams,
pub filters: SubscriptionFilters,
}
impl ListSubscriptionsRequest {
pub fn new() -> Self {
Self {
pagination: PaginationParams::default(),
filters: SubscriptionFilters::default(),
}
}
pub fn with_pagination(mut self, pagination: PaginationParams) -> Self {
self.pagination = pagination;
self
}
pub fn with_filters(mut self, filters: SubscriptionFilters) -> 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 ListSubscriptionsRequest {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone)]
pub struct GetSubscriptionRequest {
pub external_id: String,
}
impl GetSubscriptionRequest {
pub fn new(external_id: String) -> Self {
Self { external_id }
}
}
#[derive(Debug, Clone)]
pub struct ListCustomerSubscriptionsRequest {
pub external_customer_id: String,
pub pagination: PaginationParams,
pub filters: SubscriptionFilters,
}
impl ListCustomerSubscriptionsRequest {
pub fn new(external_customer_id: String) -> Self {
Self {
external_customer_id,
pagination: PaginationParams::default(),
filters: SubscriptionFilters::default(),
}
}
pub fn with_pagination(mut self, pagination: PaginationParams) -> Self {
self.pagination = pagination;
self
}
pub fn with_filters(mut self, filters: SubscriptionFilters) -> 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
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateSubscriptionInput {
pub external_customer_id: String,
pub plan_code: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub external_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub billing_time: Option<SubscriptionBillingTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ending_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub plan_overrides: Option<SubscriptionPlanOverrides>,
#[serde(skip_serializing_if = "Option::is_none")]
pub activation_rules: Option<Vec<SubscriptionActivationRuleInput>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub purchase_order_number: Option<String>,
}
impl CreateSubscriptionInput {
pub fn new(external_customer_id: String, plan_code: String) -> Self {
Self {
external_customer_id,
plan_code,
name: None,
external_id: None,
billing_time: None,
subscription_at: None,
ending_at: None,
plan_overrides: None,
activation_rules: None,
purchase_order_number: None,
}
}
pub fn with_name(mut self, name: String) -> Self {
self.name = Some(name);
self
}
pub fn with_external_id(mut self, external_id: String) -> Self {
self.external_id = Some(external_id);
self
}
pub fn with_billing_time(mut self, billing_time: SubscriptionBillingTime) -> Self {
self.billing_time = Some(billing_time);
self
}
pub fn with_subscription_at(mut self, subscription_at: String) -> Self {
self.subscription_at = Some(subscription_at);
self
}
pub fn with_ending_at(mut self, ending_at: String) -> Self {
self.ending_at = Some(ending_at);
self
}
pub fn with_plan_overrides(mut self, plan_overrides: SubscriptionPlanOverrides) -> Self {
self.plan_overrides = Some(plan_overrides);
self
}
pub fn with_activation_rules(
mut self,
activation_rules: Vec<SubscriptionActivationRuleInput>,
) -> Self {
self.activation_rules = Some(activation_rules);
self
}
pub fn with_purchase_order_number(mut self, purchase_order_number: String) -> Self {
self.purchase_order_number = Some(purchase_order_number);
self
}
}
#[derive(Debug, Clone, Serialize)]
pub struct CreateSubscriptionRequest {
pub subscription: CreateSubscriptionInput,
}
impl CreateSubscriptionRequest {
pub fn new(input: CreateSubscriptionInput) -> Self {
Self {
subscription: input,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateSubscriptionInput {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ending_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub plan_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub plan_overrides: Option<SubscriptionPlanOverrides>,
#[serde(skip_serializing_if = "Option::is_none")]
pub activation_rules: Option<Vec<SubscriptionActivationRuleInput>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub purchase_order_number: Option<String>,
}
impl UpdateSubscriptionInput {
pub fn new() -> Self {
Self {
name: None,
ending_at: None,
plan_code: None,
subscription_at: None,
plan_overrides: None,
activation_rules: None,
purchase_order_number: None,
}
}
pub fn with_name(mut self, name: String) -> Self {
self.name = Some(name);
self
}
pub fn with_ending_at(mut self, ending_at: String) -> Self {
self.ending_at = Some(ending_at);
self
}
pub fn with_plan_code(mut self, plan_code: String) -> Self {
self.plan_code = Some(plan_code);
self
}
pub fn with_subscription_at(mut self, subscription_at: String) -> Self {
self.subscription_at = Some(subscription_at);
self
}
pub fn with_plan_overrides(mut self, plan_overrides: SubscriptionPlanOverrides) -> Self {
self.plan_overrides = Some(plan_overrides);
self
}
pub fn with_activation_rules(
mut self,
activation_rules: Vec<SubscriptionActivationRuleInput>,
) -> Self {
self.activation_rules = Some(activation_rules);
self
}
pub fn with_purchase_order_number(mut self, purchase_order_number: String) -> Self {
self.purchase_order_number = Some(purchase_order_number);
self
}
}
impl Default for UpdateSubscriptionInput {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone, Serialize)]
pub struct UpdateSubscriptionRequest {
#[serde(skip)]
pub external_id: String,
pub subscription: UpdateSubscriptionInput,
}
impl UpdateSubscriptionRequest {
pub fn new(external_id: String, input: UpdateSubscriptionInput) -> Self {
Self {
external_id,
subscription: input,
}
}
}
#[derive(Debug, Clone)]
pub struct DeleteSubscriptionRequest {
pub external_id: String,
pub status: Option<String>,
}
impl DeleteSubscriptionRequest {
pub fn new(external_id: String) -> Self {
Self {
external_id,
status: None,
}
}
pub fn with_status(mut self, status: String) -> Self {
self.status = Some(status);
self
}
pub fn to_query_params(&self) -> Vec<(&str, String)> {
let mut params = Vec::new();
if let Some(status) = &self.status {
params.push(("status", status.clone()));
}
params
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SubscriptionPlanOverrides {
#[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 description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_codes: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trial_period: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub minimum_commitment: Option<SubscriptionMinimumCommitmentOverride>,
#[serde(skip_serializing_if = "Option::is_none")]
pub charges: Option<Vec<SubscriptionChargeOverride>>,
}
impl SubscriptionPlanOverrides {
pub fn new() -> Self {
Self::default()
}
pub fn with_amount_cents(mut self, amount_cents: i64) -> Self {
self.amount_cents = Some(amount_cents);
self
}
pub fn with_amount_currency(mut self, currency: String) -> Self {
self.amount_currency = Some(currency);
self
}
pub fn with_description(mut self, description: String) -> Self {
self.description = Some(description);
self
}
pub fn with_invoice_display_name(mut self, name: String) -> Self {
self.invoice_display_name = Some(name);
self
}
pub fn with_name(mut self, name: String) -> Self {
self.name = Some(name);
self
}
pub fn with_trial_period(mut self, days: f64) -> Self {
self.trial_period = Some(days);
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SubscriptionMinimumCommitmentOverride {
#[serde(skip_serializing_if = "Option::is_none")]
pub amount_cents: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_codes: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SubscriptionChargeOverride {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub billable_metric_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_amount_cents: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_codes: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub properties: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SubscriptionActivationRuleInput {
#[serde(rename = "type")]
pub rule_type: SubscriptionActivationRuleType,
#[serde(skip_serializing_if = "Option::is_none")]
pub timeout_hours: Option<i64>,
}
impl SubscriptionActivationRuleInput {
pub fn new(rule_type: SubscriptionActivationRuleType) -> Self {
Self {
rule_type,
timeout_hours: None,
}
}
pub fn with_timeout_hours(mut self, timeout_hours: i64) -> Self {
self.timeout_hours = Some(timeout_hours);
self
}
}