collab: Return subscription period from `GET /billing/subscriptions` (#31987)

Marshall Bowers created

This PR updates the `GET /billing/subscriptions` endpoint to return the
subscription period on them.

Release Notes:

- N/A

Change summary

crates/collab/src/api/billing.rs | 16 ++++++++++++++++
1 file changed, 16 insertions(+)

Detailed changes

crates/collab/src/api/billing.rs 🔗

@@ -219,12 +219,19 @@ struct BillingSubscriptionJson {
     id: BillingSubscriptionId,
     name: String,
     status: StripeSubscriptionStatus,
+    period: Option<BillingSubscriptionPeriodJson>,
     trial_end_at: Option<String>,
     cancel_at: Option<String>,
     /// Whether this subscription can be canceled.
     is_cancelable: bool,
 }
 
+#[derive(Debug, Serialize)]
+struct BillingSubscriptionPeriodJson {
+    start_at: String,
+    end_at: String,
+}
+
 #[derive(Debug, Serialize)]
 struct ListBillingSubscriptionsResponse {
     subscriptions: Vec<BillingSubscriptionJson>,
@@ -254,6 +261,15 @@ async fn list_billing_subscriptions(
                     None => "Zed LLM Usage".to_string(),
                 },
                 status: subscription.stripe_subscription_status,
+                period: maybe!({
+                    let start_at = subscription.current_period_start_at()?;
+                    let end_at = subscription.current_period_end_at()?;
+
+                    Some(BillingSubscriptionPeriodJson {
+                        start_at: start_at.to_rfc3339_opts(SecondsFormat::Millis, true),
+                        end_at: end_at.to_rfc3339_opts(SecondsFormat::Millis, true),
+                    })
+                }),
                 trial_end_at: if subscription.kind == Some(SubscriptionKind::ZedProTrial) {
                     maybe!({
                         let end_at = subscription.stripe_current_period_end?;