collab: Create Zed Free subscription when issuing an LLM token (#30975)

This PR makes it so we create a Zed Free subscription when issuing an
LLM token, if one does not already exist.

Release Notes:

- N/A

---------

Co-authored-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
This commit is contained in:
Marshall Bowers 2025-05-19 18:45:22 -04:00 committed by GitHub
parent 83d513aef4
commit f7a0834f54
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 115 additions and 57 deletions

View file

@ -7,7 +7,7 @@ use anyhow::{Context as _, anyhow};
use chrono::Utc;
use collections::HashMap;
use serde::{Deserialize, Serialize};
use stripe::{PriceId, SubscriptionStatus};
use stripe::{CreateCustomer, Customer, CustomerId, PriceId, SubscriptionStatus};
use tokio::sync::RwLock;
use uuid::Uuid;
@ -122,6 +122,47 @@ impl StripeBilling {
})
}
/// Returns the Stripe customer associated with the provided email address, or creates a new customer, if one does
/// not already exist.
///
/// Always returns a new Stripe customer if the email address is `None`.
pub async fn find_or_create_customer_by_email(
&self,
email_address: Option<&str>,
) -> Result<CustomerId> {
let existing_customer = if let Some(email) = email_address {
let customers = Customer::list(
&self.client,
&stripe::ListCustomers {
email: Some(email),
..Default::default()
},
)
.await?;
customers.data.first().cloned()
} else {
None
};
let customer_id = if let Some(existing_customer) = existing_customer {
existing_customer.id
} else {
let customer = Customer::create(
&self.client,
CreateCustomer {
email: email_address,
..Default::default()
},
)
.await?;
customer.id
};
Ok(customer_id)
}
pub async fn subscribe_to_price(
&self,
subscription_id: &stripe::SubscriptionId,