#[cfg(test)] mod fake_stripe_client; mod real_stripe_client; use std::collections::HashMap; use std::sync::Arc; use anyhow::Result; use async_trait::async_trait; #[cfg(test)] pub use fake_stripe_client::*; pub use real_stripe_client::*; use serde::{Deserialize, Serialize}; #[derive(Debug, PartialEq, Eq, Hash, Clone, derive_more::Display, Serialize)] pub struct StripeCustomerId(pub Arc); #[derive(Debug, Clone)] pub struct StripeCustomer { pub id: StripeCustomerId, pub email: Option, } #[derive(Debug)] pub struct CreateCustomerParams<'a> { pub email: Option<&'a str>, } #[derive(Debug, PartialEq, Eq, Hash, Clone, derive_more::Display)] pub struct StripeSubscriptionId(pub Arc); #[derive(Debug, PartialEq, Clone)] pub struct StripeSubscription { pub id: StripeSubscriptionId, pub customer: StripeCustomerId, // TODO: Create our own version of this enum. pub status: stripe::SubscriptionStatus, pub current_period_end: i64, pub current_period_start: i64, pub items: Vec, pub cancel_at: Option, pub cancellation_details: Option, } #[derive(Debug, PartialEq, Eq, Hash, Clone, derive_more::Display)] pub struct StripeSubscriptionItemId(pub Arc); #[derive(Debug, PartialEq, Clone)] pub struct StripeSubscriptionItem { pub id: StripeSubscriptionItemId, pub price: Option, } #[derive(Debug, Clone, PartialEq)] pub struct StripeCancellationDetails { pub reason: Option, } #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum StripeCancellationDetailsReason { CancellationRequested, PaymentDisputed, PaymentFailed, } #[derive(Debug)] pub struct StripeCreateSubscriptionParams { pub customer: StripeCustomerId, pub items: Vec, } #[derive(Debug)] pub struct StripeCreateSubscriptionItems { pub price: Option, pub quantity: Option, } #[derive(Debug, Clone)] pub struct UpdateSubscriptionParams { pub items: Option>, pub trial_settings: Option, } #[derive(Debug, PartialEq, Clone)] pub struct UpdateSubscriptionItems { pub price: Option, } #[derive(Debug, PartialEq, Clone)] pub struct StripeSubscriptionTrialSettings { pub end_behavior: StripeSubscriptionTrialSettingsEndBehavior, } #[derive(Debug, PartialEq, Clone)] pub struct StripeSubscriptionTrialSettingsEndBehavior { pub missing_payment_method: StripeSubscriptionTrialSettingsEndBehaviorMissingPaymentMethod, } #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum StripeSubscriptionTrialSettingsEndBehaviorMissingPaymentMethod { Cancel, CreateInvoice, Pause, } #[derive(Debug, PartialEq, Eq, Hash, Clone, derive_more::Display)] pub struct StripePriceId(pub Arc); #[derive(Debug, PartialEq, Clone)] pub struct StripePrice { pub id: StripePriceId, pub unit_amount: Option, pub lookup_key: Option, pub recurring: Option, } #[derive(Debug, PartialEq, Clone)] pub struct StripePriceRecurring { pub meter: Option, } #[derive(Debug, PartialEq, Eq, Hash, Clone, derive_more::Display, Deserialize)] pub struct StripeMeterId(pub Arc); #[derive(Debug, Clone, Deserialize)] pub struct StripeMeter { pub id: StripeMeterId, pub event_name: String, } #[derive(Debug, Serialize)] pub struct StripeCreateMeterEventParams<'a> { pub identifier: &'a str, pub event_name: &'a str, pub payload: StripeCreateMeterEventPayload<'a>, pub timestamp: Option, } #[derive(Debug, Serialize)] pub struct StripeCreateMeterEventPayload<'a> { pub value: u64, pub stripe_customer_id: &'a StripeCustomerId, } #[derive(Debug, Default)] pub struct StripeCreateCheckoutSessionParams<'a> { pub customer: Option<&'a StripeCustomerId>, pub client_reference_id: Option<&'a str>, pub mode: Option, pub line_items: Option>, pub payment_method_collection: Option, pub subscription_data: Option, pub success_url: Option<&'a str>, } #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum StripeCheckoutSessionMode { Payment, Setup, Subscription, } #[derive(Debug, PartialEq, Clone)] pub struct StripeCreateCheckoutSessionLineItems { pub price: Option, pub quantity: Option, } #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum StripeCheckoutSessionPaymentMethodCollection { Always, IfRequired, } #[derive(Debug, PartialEq, Clone)] pub struct StripeCreateCheckoutSessionSubscriptionData { pub metadata: Option>, pub trial_period_days: Option, pub trial_settings: Option, } #[derive(Debug)] pub struct StripeCheckoutSession { pub url: Option, } #[async_trait] pub trait StripeClient: Send + Sync { async fn list_customers_by_email(&self, email: &str) -> Result>; async fn get_customer(&self, customer_id: &StripeCustomerId) -> Result; async fn create_customer(&self, params: CreateCustomerParams<'_>) -> Result; async fn list_subscriptions_for_customer( &self, customer_id: &StripeCustomerId, ) -> Result>; async fn get_subscription( &self, subscription_id: &StripeSubscriptionId, ) -> Result; async fn create_subscription( &self, params: StripeCreateSubscriptionParams, ) -> Result; async fn update_subscription( &self, subscription_id: &StripeSubscriptionId, params: UpdateSubscriptionParams, ) -> Result<()>; async fn cancel_subscription(&self, subscription_id: &StripeSubscriptionId) -> Result<()>; async fn list_prices(&self) -> Result>; async fn list_meters(&self) -> Result>; async fn create_meter_event(&self, params: StripeCreateMeterEventParams<'_>) -> Result<()>; async fn create_checkout_session( &self, params: StripeCreateCheckoutSessionParams<'_>, ) -> Result; }