billing_preferences.rs

 1use super::*;
 2
 3#[derive(Debug)]
 4pub struct CreateBillingPreferencesParams {
 5    pub max_monthly_llm_usage_spending_in_cents: i32,
 6    pub model_request_overages_enabled: bool,
 7    pub model_request_overages_spend_limit_in_cents: i32,
 8}
 9
10#[derive(Debug, Default)]
11pub struct UpdateBillingPreferencesParams {
12    pub max_monthly_llm_usage_spending_in_cents: ActiveValue<i32>,
13    pub model_request_overages_enabled: ActiveValue<bool>,
14    pub model_request_overages_spend_limit_in_cents: ActiveValue<i32>,
15}
16
17impl Database {
18    /// Returns the billing preferences for the given user, if they exist.
19    pub async fn get_billing_preferences(
20        &self,
21        user_id: UserId,
22    ) -> Result<Option<billing_preference::Model>> {
23        self.transaction(|tx| async move {
24            Ok(billing_preference::Entity::find()
25                .filter(billing_preference::Column::UserId.eq(user_id))
26                .one(&*tx)
27                .await?)
28        })
29        .await
30    }
31
32    /// Creates new billing preferences for the given user.
33    pub async fn create_billing_preferences(
34        &self,
35        user_id: UserId,
36        params: &CreateBillingPreferencesParams,
37    ) -> Result<billing_preference::Model> {
38        self.transaction(|tx| async move {
39            let preferences = billing_preference::Entity::insert(billing_preference::ActiveModel {
40                user_id: ActiveValue::set(user_id),
41                max_monthly_llm_usage_spending_in_cents: ActiveValue::set(
42                    params.max_monthly_llm_usage_spending_in_cents,
43                ),
44                model_request_overages_enabled: ActiveValue::set(
45                    params.model_request_overages_enabled,
46                ),
47                model_request_overages_spend_limit_in_cents: ActiveValue::set(
48                    params.model_request_overages_spend_limit_in_cents,
49                ),
50                ..Default::default()
51            })
52            .exec_with_returning(&*tx)
53            .await?;
54
55            Ok(preferences)
56        })
57        .await
58    }
59
60    /// Updates the billing preferences for the given user.
61    pub async fn update_billing_preferences(
62        &self,
63        user_id: UserId,
64        params: &UpdateBillingPreferencesParams,
65    ) -> Result<billing_preference::Model> {
66        self.transaction(|tx| async move {
67            let preferences = billing_preference::Entity::update_many()
68                .set(billing_preference::ActiveModel {
69                    max_monthly_llm_usage_spending_in_cents: params
70                        .max_monthly_llm_usage_spending_in_cents
71                        .clone(),
72                    model_request_overages_enabled: params.model_request_overages_enabled.clone(),
73                    model_request_overages_spend_limit_in_cents: params
74                        .model_request_overages_spend_limit_in_cents
75                        .clone(),
76                    ..Default::default()
77                })
78                .filter(billing_preference::Column::UserId.eq(user_id))
79                .exec_with_returning(&*tx)
80                .await?;
81
82            Ok(preferences
83                .into_iter()
84                .next()
85                .ok_or_else(|| anyhow!("billing preferences not found"))?)
86        })
87        .await
88    }
89}