Skip to main content

systemprompt_logging/repository/
ownership.rs

1//! [`OwnerReassignment`] for the logging tables: moves every log line and
2//! analytics event from one user to another in a single transaction.
3//!
4//! Copyright (c) systemprompt.io — Business Source License 1.1.
5//! See <https://systemprompt.io> for licensing details.
6
7use 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}