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 fn load_from(db: &DbConn) -> Result<Self, DbErr> {
11        // ensure snapshot is consistent across all tables
12        let txn = &db.begin_with_config(
13            Some(IsolationLevel::ReadCommitted),
14            Some(AccessMode::ReadOnly),
15        )?;
16
17        let resources = Resource::find().all(txn)?;
18        let permissions = Permission::find().all(txn)?;
19        let roles = Role::find().all(txn)?;
20        let user_roles = UserRole::find().all(txn)?;
21        let role_permissions = RolePermission::find().all(txn)?;
22        let user_overrides = UserOverride::find().all(txn)?;
23        let role_hierarchy = RoleHierarchy::find().all(txn)?;
24
25        let snapshot = RbacSnapshot {
26            resources,
27            permissions,
28            roles,
29            user_roles,
30            role_permissions,
31            user_overrides,
32            role_hierarchy,
33        };
34
35        Ok(Self::from_snapshot(snapshot))
36    }
37}