collab: Avoid creating duplicate Stripe customers (#29566)
Marshall Bowers
created 7 months ago
This PR makes it so we check for an existing Stripe customer by email
address before attempting to create a new one.
This should avoid the case where we end up creating multiple Stripe
customers for the same user.
Release Notes:
- N/A
Change summary
crates/collab/src/api/billing.rs | 37 +++++++++++++++++++++++++--------
1 file changed, 28 insertions(+), 9 deletions(-)
Detailed changes
@@ -322,16 +322,35 @@ async fn create_billing_subscription(
CustomerId::from_str(&existing_customer.stripe_customer_id)
.context("failed to parse customer ID")?
} else {
- let customer = Customer::create(
- &stripe_client,
- CreateCustomer {
- email: user.email_address.as_deref(),
- ..Default::default()
- },
- )
- .await?;
+ let existing_customer = if let Some(email) = user.email_address.as_deref() {
+ let customers = Customer::list(
+ &stripe_client,
+ &stripe::ListCustomers {
+ email: Some(email),
+ ..Default::default()
+ },
+ )
+ .await?;
- customer.id
+ customers.data.first().cloned()
+ } else {
+ None
+ };
+
+ if let Some(existing_customer) = existing_customer {
+ existing_customer.id
+ } else {
+ let customer = Customer::create(
+ &stripe_client,
+ CreateCustomer {
+ email: user.email_address.as_deref(),
+ ..Default::default()
+ },
+ )
+ .await?;
+
+ customer.id
+ }
};
let success_url = format!(