From f73c8e5841537442b56c7db38fd819a5b867d531 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Mon, 19 May 2025 20:18:45 -0400 Subject: [PATCH] collab: Don't create a Zed Free subscription if one already exists in Stripe (#30983) This PR adds a check for if a Zed Free subscription already exists in Stripe before we try to create one. Release Notes: - N/A --- crates/collab/src/stripe_billing.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/crates/collab/src/stripe_billing.rs b/crates/collab/src/stripe_billing.rs index a538adf40175997fee56852910fd13a5ca2a6745..20803fa446f76366222617f25d9c957ba2abca81 100644 --- a/crates/collab/src/stripe_billing.rs +++ b/crates/collab/src/stripe_billing.rs @@ -310,6 +310,32 @@ impl StripeBilling { ) -> Result { let zed_free_price_id = self.zed_free_price_id().await?; + let existing_subscriptions = stripe::Subscription::list( + &self.client, + &stripe::ListSubscriptions { + customer: Some(customer_id.clone()), + status: None, + ..Default::default() + }, + ) + .await?; + + let existing_zed_free_subscription = + existing_subscriptions + .data + .into_iter() + .find(|subscription| { + subscription.status == SubscriptionStatus::Active + && subscription.items.data.iter().any(|item| { + item.price + .as_ref() + .map_or(false, |price| price.id == zed_free_price_id) + }) + }); + if let Some(subscription) = existing_zed_free_subscription { + return Ok(subscription); + } + let mut params = stripe::CreateSubscription::new(customer_id); params.items = Some(vec![stripe::CreateSubscriptionItems { price: Some(zed_free_price_id.to_string()),