Skip to main content

systemprompt_users/repository/user/
merge.rs

1//! Anonymous-to-identified user merge operations.
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::repository::UserRepository;
10
11#[derive(Debug, Clone, Copy)]
12pub struct MergeResult {
13    pub sessions_transferred: u64,
14    pub tasks_transferred: u64,
15}
16
17impl UserRepository {
18    pub async fn merge_users(&self, source_id: &UserId, target_id: &UserId) -> Result<MergeResult> {
19        let sessions_result = sqlx::query!(
20            r#"
21            UPDATE user_sessions
22            SET user_id = $1
23            WHERE user_id = $2
24            "#,
25            target_id.as_str(),
26            source_id.as_str()
27        )
28        .execute(&*self.write_pool)
29        .await?;
30
31        let tasks_result = sqlx::query!(
32            r#"
33            UPDATE agent_tasks
34            SET user_id = $1
35            WHERE user_id = $2
36            "#,
37            target_id.as_str(),
38            source_id.as_str()
39        )
40        .execute(&*self.write_pool)
41        .await?;
42
43        sqlx::query!(r#"DELETE FROM users WHERE id = $1"#, source_id.as_str())
44            .execute(&*self.write_pool)
45            .await?;
46
47        Ok(MergeResult {
48            sessions_transferred: sessions_result.rows_affected(),
49            tasks_transferred: tasks_result.rows_affected(),
50        })
51    }
52}