Skip to main content

sea_orm/rbac/engine/
loader.rs

1use super::super::entity::{
2    permission::Entity as Permission, resource::Entity as Resource, role::Entity as Role,
3    role_hierarchy::Entity as RoleHierarchy, role_permission::Entity as RolePermission,
4    user_override::Entity as UserOverride, user_role::Entity as UserRole,
5};
6use super::{RbacEngine, RbacSnapshot};
7use crate::{AccessMode, DbConn, DbErr, EntityTrait, IsolationLevel, TransactionTrait};
8
9impl RbacEngine {
10    pub async fn load_from(db: &DbConn) -> Result<Self, DbErr> {
11        // ensure snapshot is consistent across all tables
12        let txn = &db
13            .begin_with_config(
14                Some(IsolationLevel::ReadCommitted),
15                Some(AccessMode::ReadOnly),
16            )
17            .await?;
18
19        let resources = Resource::find().all(txn).await?;
20        let permissions = Permission::find().all(txn).await?;
21        let roles = Role::find().all(txn).await?;
22        let user_roles = UserRole::find().all(txn).await?;
23        let role_permissions = RolePermission::find().all(txn).await?;
24        let user_overrides = UserOverride::find().all(txn).await?;
25        let role_hierarchy = RoleHierarchy::find().all(txn).await?;
26
27        let snapshot = RbacSnapshot {
28            resources,
29            permissions,
30            roles,
31            user_roles,
32            role_permissions,
33            user_overrides,
34            role_hierarchy,
35        };
36
37        Ok(Self::from_snapshot(snapshot))
38    }
39}