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}