systemprompt_logging/repository/
ownership.rs1use async_trait::async_trait;
8use sqlx::PgPool;
9use std::sync::Arc;
10use systemprompt_database::DbPool;
11use systemprompt_identifiers::UserId;
12use systemprompt_traits::{OwnerReassignment, ReassignedRows, RepositoryError};
13
14#[derive(Debug, Clone)]
15pub struct LoggingOwnerReassignment {
16 write_pool: Arc<PgPool>,
17}
18
19impl LoggingOwnerReassignment {
20 pub fn new(db: &DbPool) -> Self {
21 let write_pool = db.write_pool();
22 Self { write_pool }
23 }
24}
25
26#[async_trait]
27impl OwnerReassignment for LoggingOwnerReassignment {
28 fn domain(&self) -> &'static str {
29 "logging"
30 }
31
32 async fn reassign_owner(
33 &self,
34 from: &UserId,
35 to: &UserId,
36 ) -> Result<ReassignedRows, RepositoryError> {
37 let mut tx = self
38 .write_pool
39 .begin()
40 .await
41 .map_err(RepositoryError::database)?;
42
43 let logs = sqlx::query!(
44 "UPDATE logs SET user_id = $2 WHERE user_id = $1",
45 from.as_str(),
46 to.as_str()
47 )
48 .execute(&mut *tx)
49 .await
50 .map_err(RepositoryError::database)?
51 .rows_affected();
52
53 let events = sqlx::query!(
54 "UPDATE analytics_events SET user_id = $2 WHERE user_id = $1",
55 from.as_str(),
56 to.as_str()
57 )
58 .execute(&mut *tx)
59 .await
60 .map_err(RepositoryError::database)?
61 .rows_affected();
62
63 tx.commit().await.map_err(RepositoryError::database)?;
64
65 Ok(ReassignedRows {
66 tables: vec![("logs", logs), ("analytics_events", events)],
67 })
68 }
69}