diff --git a/crates/collab/src/api/billing.rs b/crates/collab/src/api/billing.rs index 09f307c6727b9b23c800aae684e3f813d92375ad..9aa6578b2a54cb8806d819c32e0112dd397bdd23 100644 --- a/crates/collab/src/api/billing.rs +++ b/crates/collab/src/api/billing.rs @@ -1,12 +1,10 @@ use anyhow::{Context as _, bail}; -use axum::routing::put; use axum::{Extension, Json, Router, extract, routing::post}; -use chrono::{DateTime, SecondsFormat, Utc}; +use chrono::{DateTime, Utc}; use collections::{HashMap, HashSet}; use reqwest::StatusCode; use sea_orm::ActiveValue; use serde::{Deserialize, Serialize}; -use serde_json::json; use std::{str::FromStr, sync::Arc, time::Duration}; use stripe::{ BillingPortalSession, CancellationDetailsReason, CreateBillingPortalSession, @@ -20,7 +18,6 @@ use stripe::{ use util::{ResultExt, maybe}; use zed_llm_client::LanguageModelProvider; -use crate::api::events::SnowflakeRow; use crate::db::billing_subscription::{ StripeCancellationReason, StripeSubscriptionStatus, SubscriptionKind, }; @@ -36,14 +33,13 @@ use crate::{ db::{ BillingSubscriptionId, CreateBillingCustomerParams, CreateBillingSubscriptionParams, CreateProcessedStripeEventParams, UpdateBillingCustomerParams, - UpdateBillingPreferencesParams, UpdateBillingSubscriptionParams, billing_customer, + UpdateBillingSubscriptionParams, billing_customer, }, stripe_billing::StripeBilling, }; pub fn router() -> Router { Router::new() - .route("/billing/preferences", put(update_billing_preferences)) .route("/billing/subscriptions", post(create_billing_subscription)) .route( "/billing/subscriptions/manage", @@ -55,108 +51,6 @@ pub fn router() -> Router { ) } -#[derive(Debug, Serialize)] -struct BillingPreferencesResponse { - trial_started_at: Option, - max_monthly_llm_usage_spending_in_cents: i32, - model_request_overages_enabled: bool, - model_request_overages_spend_limit_in_cents: i32, -} - -#[derive(Debug, Deserialize)] -struct UpdateBillingPreferencesBody { - github_user_id: i32, - #[serde(default)] - max_monthly_llm_usage_spending_in_cents: i32, - #[serde(default)] - model_request_overages_enabled: bool, - #[serde(default)] - model_request_overages_spend_limit_in_cents: i32, -} - -async fn update_billing_preferences( - Extension(app): Extension>, - Extension(rpc_server): Extension>, - extract::Json(body): extract::Json, -) -> Result> { - let user = app - .db - .get_user_by_github_user_id(body.github_user_id) - .await? - .context("user not found")?; - - let billing_customer = app.db.get_billing_customer_by_user_id(user.id).await?; - - let max_monthly_llm_usage_spending_in_cents = - body.max_monthly_llm_usage_spending_in_cents.max(0); - let model_request_overages_spend_limit_in_cents = - body.model_request_overages_spend_limit_in_cents.max(0); - - let billing_preferences = - if let Some(_billing_preferences) = app.db.get_billing_preferences(user.id).await? { - app.db - .update_billing_preferences( - user.id, - &UpdateBillingPreferencesParams { - max_monthly_llm_usage_spending_in_cents: ActiveValue::set( - max_monthly_llm_usage_spending_in_cents, - ), - model_request_overages_enabled: ActiveValue::set( - body.model_request_overages_enabled, - ), - model_request_overages_spend_limit_in_cents: ActiveValue::set( - model_request_overages_spend_limit_in_cents, - ), - }, - ) - .await? - } else { - app.db - .create_billing_preferences( - user.id, - &crate::db::CreateBillingPreferencesParams { - max_monthly_llm_usage_spending_in_cents, - model_request_overages_enabled: body.model_request_overages_enabled, - model_request_overages_spend_limit_in_cents, - }, - ) - .await? - }; - - SnowflakeRow::new( - "Billing Preferences Updated", - Some(user.metrics_id), - user.admin, - None, - json!({ - "user_id": user.id, - "model_request_overages_enabled": billing_preferences.model_request_overages_enabled, - "model_request_overages_spend_limit_in_cents": billing_preferences.model_request_overages_spend_limit_in_cents, - "max_monthly_llm_usage_spending_in_cents": billing_preferences.max_monthly_llm_usage_spending_in_cents, - }), - ) - .write(&app.kinesis_client, &app.config.kinesis_stream) - .await - .log_err(); - - rpc_server.refresh_llm_tokens_for_user(user.id).await; - - Ok(Json(BillingPreferencesResponse { - trial_started_at: billing_customer - .and_then(|billing_customer| billing_customer.trial_started_at) - .map(|trial_started_at| { - trial_started_at - .and_utc() - .to_rfc3339_opts(SecondsFormat::Millis, true) - }), - max_monthly_llm_usage_spending_in_cents: billing_preferences - .max_monthly_llm_usage_spending_in_cents, - model_request_overages_enabled: billing_preferences.model_request_overages_enabled, - model_request_overages_spend_limit_in_cents: billing_preferences - .model_request_overages_spend_limit_in_cents, - })) -} - #[derive(Debug, PartialEq, Clone, Copy, Deserialize)] #[serde(rename_all = "snake_case")] enum ProductCode {