collab: Don't create a Zed Free subscription if one already exists in Stripe (#30983)

Marshall Bowers created

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

Change summary

crates/collab/src/stripe_billing.rs | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)

Detailed changes

crates/collab/src/stripe_billing.rs 🔗

@@ -310,6 +310,32 @@ impl StripeBilling {
     ) -> Result<stripe::Subscription> {
         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()),