Skip to main content

systemprompt_users/repository/user/
bulk.rs

1//! Bulk user-record mutations.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use systemprompt_identifiers::UserId;
7
8use crate::error::Result;
9use crate::models::UserStatus;
10use crate::repository::UserRepository;
11
12impl UserRepository {
13    pub async fn bulk_update_status(
14        &self,
15        user_ids: &[UserId],
16        new_status: UserStatus,
17    ) -> Result<u64> {
18        let new_status = new_status.as_str();
19        let ids: Vec<String> = user_ids.iter().map(ToString::to_string).collect();
20        let result = sqlx::query!(
21            r#"
22            UPDATE users
23            SET status = $1, updated_at = NOW()
24            WHERE id = ANY($2)
25            "#,
26            new_status,
27            &ids[..]
28        )
29        .execute(&*self.write_pool)
30        .await?;
31        Ok(result.rows_affected())
32    }
33
34    pub async fn bulk_delete(&self, user_ids: &[UserId]) -> Result<u64> {
35        let deleted_status = UserStatus::Deleted.as_str();
36        let ids: Vec<String> = user_ids.iter().map(ToString::to_string).collect();
37        let mut tx = self.write_pool.begin().await?;
38        let result = sqlx::query!(
39            r#"
40            UPDATE users
41            SET status = $1, archived_at = COALESCE(archived_at, NOW()), updated_at = NOW()
42            WHERE id = ANY($2)
43            "#,
44            deleted_status,
45            &ids[..]
46        )
47        .execute(&mut *tx)
48        .await?;
49        sqlx::query!(
50            "UPDATE user_sessions SET revoked_at = NOW() WHERE user_id = ANY($1) AND revoked_at IS NULL",
51            &ids[..]
52        )
53        .execute(&mut *tx)
54        .await?;
55        sqlx::query!(
56            "UPDATE user_api_keys SET revoked_at = NOW() WHERE user_id = ANY($1) AND revoked_at IS NULL",
57            &ids[..]
58        )
59        .execute(&mut *tx)
60        .await?;
61        sqlx::query!(
62            "UPDATE user_device_certs SET revoked_at = NOW() WHERE user_id = ANY($1) AND revoked_at IS NULL",
63            &ids[..]
64        )
65        .execute(&mut *tx)
66        .await?;
67        tx.commit().await?;
68        Ok(result.rows_affected())
69    }
70}