diff --git a/crates/collab/src/api/billing.rs b/crates/collab/src/api/billing.rs index b8ac82a09b1123cddff05e06174cf50bdd2876b1..bbe3dde22545482ff7c229332cc3a0dbb754e960 100644 --- a/crates/collab/src/api/billing.rs +++ b/crates/collab/src/api/billing.rs @@ -1496,9 +1496,19 @@ async fn sync_model_request_usage_with_stripe( llm_db: &Arc, stripe_billing: &Arc, ) -> anyhow::Result<()> { + let staff_users = app.db.get_staff_users().await?; + let staff_user_ids = staff_users + .iter() + .map(|user| user.id) + .collect::>(); + let usage_meters = llm_db .get_current_subscription_usage_meters(Utc::now()) .await?; + let usage_meters = usage_meters + .into_iter() + .filter(|(_, usage)| !staff_user_ids.contains(&usage.user_id)) + .collect::>(); let user_ids = usage_meters .iter() .map(|(_, usage)| usage.user_id) diff --git a/crates/collab/src/db/queries/users.rs b/crates/collab/src/db/queries/users.rs index 6e333092e9089ddc38c564c9492d050182a01d5e..587054c2af0bcf367407deccce6603bf2ecd3159 100644 --- a/crates/collab/src/db/queries/users.rs +++ b/crates/collab/src/db/queries/users.rs @@ -65,6 +65,18 @@ impl Database { .await } + /// Returns all users flagged as staff. + pub async fn get_staff_users(&self) -> Result> { + self.transaction(|tx| async { + let tx = tx; + Ok(user::Entity::find() + .filter(user::Column::Admin.eq(true)) + .all(&*tx) + .await?) + }) + .await + } + /// Returns a user by email address. There are no access checks here, so this should only be used internally. pub async fn get_user_by_email(&self, email: &str) -> Result> { self.transaction(|tx| async move {