stripe_client.rs

  1#[cfg(test)]
  2mod fake_stripe_client;
  3mod real_stripe_client;
  4
  5use std::collections::HashMap;
  6use std::sync::Arc;
  7
  8use anyhow::Result;
  9use async_trait::async_trait;
 10
 11#[cfg(test)]
 12pub use fake_stripe_client::*;
 13pub use real_stripe_client::*;
 14use serde::{Deserialize, Serialize};
 15
 16#[derive(Debug, PartialEq, Eq, Hash, Clone, derive_more::Display, Serialize)]
 17pub struct StripeCustomerId(pub Arc<str>);
 18
 19#[derive(Debug, Clone)]
 20pub struct StripeCustomer {
 21    pub id: StripeCustomerId,
 22    pub email: Option<String>,
 23}
 24
 25#[derive(Debug)]
 26pub struct CreateCustomerParams<'a> {
 27    pub email: Option<&'a str>,
 28}
 29
 30#[derive(Debug, PartialEq, Eq, Hash, Clone, derive_more::Display)]
 31pub struct StripeSubscriptionId(pub Arc<str>);
 32
 33#[derive(Debug, Clone)]
 34pub struct StripeSubscription {
 35    pub id: StripeSubscriptionId,
 36    pub items: Vec<StripeSubscriptionItem>,
 37}
 38
 39#[derive(Debug, PartialEq, Eq, Hash, Clone, derive_more::Display)]
 40pub struct StripeSubscriptionItemId(pub Arc<str>);
 41
 42#[derive(Debug, Clone)]
 43pub struct StripeSubscriptionItem {
 44    pub id: StripeSubscriptionItemId,
 45    pub price: Option<StripePrice>,
 46}
 47
 48#[derive(Debug, Clone)]
 49pub struct UpdateSubscriptionParams {
 50    pub items: Option<Vec<UpdateSubscriptionItems>>,
 51    pub trial_settings: Option<StripeSubscriptionTrialSettings>,
 52}
 53
 54#[derive(Debug, PartialEq, Clone)]
 55pub struct UpdateSubscriptionItems {
 56    pub price: Option<StripePriceId>,
 57}
 58
 59#[derive(Debug, PartialEq, Clone)]
 60pub struct StripeSubscriptionTrialSettings {
 61    pub end_behavior: StripeSubscriptionTrialSettingsEndBehavior,
 62}
 63
 64#[derive(Debug, PartialEq, Clone)]
 65pub struct StripeSubscriptionTrialSettingsEndBehavior {
 66    pub missing_payment_method: StripeSubscriptionTrialSettingsEndBehaviorMissingPaymentMethod,
 67}
 68
 69#[derive(Debug, PartialEq, Eq, Clone, Copy)]
 70pub enum StripeSubscriptionTrialSettingsEndBehaviorMissingPaymentMethod {
 71    Cancel,
 72    CreateInvoice,
 73    Pause,
 74}
 75
 76#[derive(Debug, PartialEq, Eq, Hash, Clone, derive_more::Display)]
 77pub struct StripePriceId(pub Arc<str>);
 78
 79#[derive(Debug, Clone)]
 80pub struct StripePrice {
 81    pub id: StripePriceId,
 82    pub unit_amount: Option<i64>,
 83    pub lookup_key: Option<String>,
 84    pub recurring: Option<StripePriceRecurring>,
 85}
 86
 87#[derive(Debug, Clone)]
 88pub struct StripePriceRecurring {
 89    pub meter: Option<String>,
 90}
 91
 92#[derive(Debug, PartialEq, Eq, Hash, Clone, derive_more::Display, Deserialize)]
 93pub struct StripeMeterId(pub Arc<str>);
 94
 95#[derive(Debug, Clone, Deserialize)]
 96pub struct StripeMeter {
 97    pub id: StripeMeterId,
 98    pub event_name: String,
 99}
100
101#[derive(Debug, Serialize)]
102pub struct StripeCreateMeterEventParams<'a> {
103    pub identifier: &'a str,
104    pub event_name: &'a str,
105    pub payload: StripeCreateMeterEventPayload<'a>,
106    pub timestamp: Option<i64>,
107}
108
109#[derive(Debug, Serialize)]
110pub struct StripeCreateMeterEventPayload<'a> {
111    pub value: u64,
112    pub stripe_customer_id: &'a StripeCustomerId,
113}
114
115#[derive(Debug, Default)]
116pub struct StripeCreateCheckoutSessionParams<'a> {
117    pub customer: Option<&'a StripeCustomerId>,
118    pub client_reference_id: Option<&'a str>,
119    pub mode: Option<StripeCheckoutSessionMode>,
120    pub line_items: Option<Vec<StripeCreateCheckoutSessionLineItems>>,
121    pub payment_method_collection: Option<StripeCheckoutSessionPaymentMethodCollection>,
122    pub subscription_data: Option<StripeCreateCheckoutSessionSubscriptionData>,
123    pub success_url: Option<&'a str>,
124}
125
126#[derive(Debug, PartialEq, Eq, Clone, Copy)]
127pub enum StripeCheckoutSessionMode {
128    Payment,
129    Setup,
130    Subscription,
131}
132
133#[derive(Debug, PartialEq, Clone)]
134pub struct StripeCreateCheckoutSessionLineItems {
135    pub price: Option<String>,
136    pub quantity: Option<u64>,
137}
138
139#[derive(Debug, PartialEq, Eq, Clone, Copy)]
140pub enum StripeCheckoutSessionPaymentMethodCollection {
141    Always,
142    IfRequired,
143}
144
145#[derive(Debug, PartialEq, Clone)]
146pub struct StripeCreateCheckoutSessionSubscriptionData {
147    pub metadata: Option<HashMap<String, String>>,
148    pub trial_period_days: Option<u32>,
149    pub trial_settings: Option<StripeSubscriptionTrialSettings>,
150}
151
152#[derive(Debug)]
153pub struct StripeCheckoutSession {
154    pub url: Option<String>,
155}
156
157#[async_trait]
158pub trait StripeClient: Send + Sync {
159    async fn list_customers_by_email(&self, email: &str) -> Result<Vec<StripeCustomer>>;
160
161    async fn create_customer(&self, params: CreateCustomerParams<'_>) -> Result<StripeCustomer>;
162
163    async fn get_subscription(
164        &self,
165        subscription_id: &StripeSubscriptionId,
166    ) -> Result<StripeSubscription>;
167
168    async fn update_subscription(
169        &self,
170        subscription_id: &StripeSubscriptionId,
171        params: UpdateSubscriptionParams,
172    ) -> Result<()>;
173
174    async fn list_prices(&self) -> Result<Vec<StripePrice>>;
175
176    async fn list_meters(&self) -> Result<Vec<StripeMeter>>;
177
178    async fn create_meter_event(&self, params: StripeCreateMeterEventParams<'_>) -> Result<()>;
179
180    async fn create_checkout_session(
181        &self,
182        params: StripeCreateCheckoutSessionParams<'_>,
183    ) -> Result<StripeCheckoutSession>;
184}