systemprompt_users/repository/user/
bulk.rs1use 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}