Files
nx9-auth/src/db/provider.rs
T
2026-07-22 19:36:22 +05:30

210 lines
6.4 KiB
Rust

#[cfg(feature = "postgres")]
use sqlx::PgPool;
#[cfg(feature = "sqlite")]
use sqlx::SqlitePool;
use crate::db::repository::traits::*;
#[async_trait::async_trait]
pub trait DatabaseProvider: Send + Sync {
fn users(&self) -> Box<dyn UsersRepository>;
fn applications(&self) -> Box<dyn ApplicationsRepository>;
fn audit(&self) -> Box<dyn AuditRepository>;
fn permissions(&self) -> Box<dyn PermissionsRepository>;
fn refresh_tokens(&self) -> Box<dyn RefreshTokensRepository>;
fn roles(&self) -> Box<dyn RolesRepository>;
fn service_accounts(&self) -> Box<dyn ServiceAccountsRepository>;
fn sessions(&self) -> Box<dyn SessionsRepository>;
fn tokens(&self) -> Box<dyn TokensRepository>;
fn tenants(&self) -> Box<dyn TenantsRepository>;
fn groups(&self) -> Box<dyn GroupsRepository>;
}
#[cfg(feature = "sqlite")]
pub struct SqliteProvider {
pub pool: SqlitePool,
}
#[cfg(feature = "sqlite")]
impl SqliteProvider {
pub fn new(pool: SqlitePool) -> Self {
Self { pool }
}
}
#[cfg(feature = "sqlite")]
#[async_trait::async_trait]
impl DatabaseProvider for SqliteProvider {
fn users(&self) -> Box<dyn UsersRepository> {
Box::new(
crate::db::repository::sqlite::users::SqliteUsersRepository {
pool: self.pool.clone(),
},
)
}
fn applications(&self) -> Box<dyn ApplicationsRepository> {
Box::new(
crate::db::repository::sqlite::applications::SqliteApplicationsRepository {
pool: self.pool.clone(),
},
)
}
fn audit(&self) -> Box<dyn AuditRepository> {
Box::new(
crate::db::repository::sqlite::audit::SqliteAuditRepository {
pool: self.pool.clone(),
},
)
}
fn permissions(&self) -> Box<dyn PermissionsRepository> {
Box::new(
crate::db::repository::sqlite::permissions::SqlitePermissionsRepository {
pool: self.pool.clone(),
},
)
}
fn refresh_tokens(&self) -> Box<dyn RefreshTokensRepository> {
Box::new(
crate::db::repository::sqlite::refresh_tokens::SqliteRefreshTokensRepository {
pool: self.pool.clone(),
},
)
}
fn roles(&self) -> Box<dyn RolesRepository> {
Box::new(
crate::db::repository::sqlite::roles::SqliteRolesRepository {
pool: self.pool.clone(),
},
)
}
fn service_accounts(&self) -> Box<dyn ServiceAccountsRepository> {
Box::new(
crate::db::repository::sqlite::service_accounts::SqliteServiceAccountsRepository {
pool: self.pool.clone(),
},
)
}
fn sessions(&self) -> Box<dyn SessionsRepository> {
Box::new(
crate::db::repository::sqlite::sessions::SqliteSessionsRepository {
pool: self.pool.clone(),
},
)
}
fn tokens(&self) -> Box<dyn TokensRepository> {
Box::new(
crate::db::repository::sqlite::tokens::SqliteTokensRepository {
pool: self.pool.clone(),
},
)
}
fn tenants(&self) -> Box<dyn TenantsRepository> {
Box::new(
crate::db::repository::sqlite::tenants::SqliteTenantsRepository {
pool: self.pool.clone(),
},
)
}
fn groups(&self) -> Box<dyn GroupsRepository> {
Box::new(
crate::db::repository::sqlite::groups::SqliteGroupsRepository {
pool: self.pool.clone(),
},
)
}
}
#[cfg(feature = "postgres")]
pub struct PostgresProvider {
pub pool: PgPool,
}
#[cfg(feature = "postgres")]
impl PostgresProvider {
pub fn new(pool: PgPool) -> Self {
Self { pool }
}
}
#[cfg(feature = "postgres")]
#[async_trait::async_trait]
impl DatabaseProvider for PostgresProvider {
fn users(&self) -> Box<dyn UsersRepository> {
Box::new(
crate::db::repository::postgres::users::PostgresUsersRepository {
pool: self.pool.clone(),
},
)
}
fn applications(&self) -> Box<dyn ApplicationsRepository> {
Box::new(
crate::db::repository::postgres::applications::PostgresApplicationsRepository {
pool: self.pool.clone(),
},
)
}
fn audit(&self) -> Box<dyn AuditRepository> {
Box::new(
crate::db::repository::postgres::audit::PostgresAuditRepository {
pool: self.pool.clone(),
},
)
}
fn permissions(&self) -> Box<dyn PermissionsRepository> {
Box::new(
crate::db::repository::postgres::permissions::PostgresPermissionsRepository {
pool: self.pool.clone(),
},
)
}
fn refresh_tokens(&self) -> Box<dyn RefreshTokensRepository> {
Box::new(
crate::db::repository::postgres::refresh_tokens::PostgresRefreshTokensRepository {
pool: self.pool.clone(),
},
)
}
fn roles(&self) -> Box<dyn RolesRepository> {
Box::new(
crate::db::repository::postgres::roles::PostgresRolesRepository {
pool: self.pool.clone(),
},
)
}
fn service_accounts(&self) -> Box<dyn ServiceAccountsRepository> {
Box::new(
crate::db::repository::postgres::service_accounts::PostgresServiceAccountsRepository {
pool: self.pool.clone(),
},
)
}
fn sessions(&self) -> Box<dyn SessionsRepository> {
Box::new(
crate::db::repository::postgres::sessions::PostgresSessionsRepository {
pool: self.pool.clone(),
},
)
}
fn tokens(&self) -> Box<dyn TokensRepository> {
Box::new(
crate::db::repository::postgres::tokens::PostgresTokensRepository {
pool: self.pool.clone(),
},
)
}
fn tenants(&self) -> Box<dyn TenantsRepository> {
Box::new(
crate::db::repository::postgres::tenants::PostgresTenantsRepository {
pool: self.pool.clone(),
},
)
}
fn groups(&self) -> Box<dyn GroupsRepository> {
Box::new(
crate::db::repository::postgres::groups::PostgresGroupsRepository {
pool: self.pool.clone(),
},
)
}
}