use crate::TenantId;
use sqlx::{PgPool, Postgres, Transaction};
pub async fn set_tenant<'c>(
tx: &mut Transaction<'c, Postgres>,
tenant: TenantId,
) -> sqlx::Result<()> {
sqlx::query("SELECT set_config('app.tenant_id', $1, true)")
.bind(tenant.0.to_string())
.execute(&mut **tx)
.await?;
Ok(())
}
#[async_trait::async_trait]
pub trait PgPoolExt {
async fn begin_tenant(&self, tenant: TenantId) -> sqlx::Result<Transaction<'_, Postgres>>;
}
#[async_trait::async_trait]
impl PgPoolExt for PgPool {
async fn begin_tenant(&self, tenant: TenantId) -> sqlx::Result<Transaction<'_, Postgres>> {
let mut tx = self.begin().await?;
set_tenant(&mut tx, tenant).await?;
Ok(tx)
}
}