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(&self, user_ids: &[UserId], new_status: &str) -> Result<u64> {
14        let mut tx = self.write_pool.begin().await?;
15        sqlx::query!("SELECT public.begin_user_privacy() AS prepared")
16            .fetch_one(&mut *tx)
17            .await?;
18        let ids: Vec<String> = user_ids.iter().map(ToString::to_string).collect();
19        let result = sqlx::query!(
20            r#"
21            UPDATE users
22            SET status = $1, updated_at = NOW()
23            WHERE id = ANY($2)
24            "#,
25            new_status,
26            &ids[..]
27        )
28        .execute(&mut *tx)
29        .await?;
30
31        sqlx::query!("SELECT public.finish_user_privacy() AS finished")
32            .fetch_one(&mut *tx)
33            .await?;
34        tx.commit().await?;
35        Ok(result.rows_affected())
36    }
37
38    pub async fn bulk_delete(&self, user_ids: &[UserId]) -> Result<u64> {
39        let deleted_status = UserStatus::Deleted.as_str();
40        let mut tx = self.write_pool.begin().await?;
41        sqlx::query!("SELECT public.begin_user_privacy() AS prepared")
42            .fetch_one(&mut *tx)
43            .await?;
44        let ids: Vec<String> = user_ids.iter().map(ToString::to_string).collect();
45        let result = sqlx::query!(
46            r#"
47            UPDATE users
48            SET status = $1, updated_at = NOW()
49            WHERE id = ANY($2)
50            "#,
51            deleted_status,
52            &ids[..]
53        )
54        .execute(&mut *tx)
55        .await?;
56
57        sqlx::query!("SELECT public.finish_user_privacy() AS finished")
58            .fetch_one(&mut *tx)
59            .await?;
60        tx.commit().await?;
61        Ok(result.rows_affected())
62    }
63}