diff --git a/imphnen-iam/src/v1/auth/auth_repository.rs b/imphnen-iam/src/v1/auth/auth_repository.rs index 671e740..a3ae0ab 100644 --- a/imphnen-iam/src/v1/auth/auth_repository.rs +++ b/imphnen-iam/src/v1/auth/auth_repository.rs @@ -27,7 +27,7 @@ impl<'a> AuthRepository<'a> { let table = ResourceEnum::UsersCache.to_string(); let user_id = user.email.clone(); let permissions: Vec = - user.role.permissions.into_iter().map(|p| p.name).collect(); + user.role.permissions.as_ref().unwrap_or(&vec![]).iter().map(|p| p.name.clone()).collect(); let user_cache = UserCacheSchema { email: user_id.clone(), permissions, @@ -85,7 +85,7 @@ impl<'a> AuthRepository<'a> { let role_detail_query_dto = RolesDetailQueryDto { id: Thing::from(("app_roles".to_string(), surrealdb::sql::Id::rand())), name: "CachedRole".to_string(), - permissions: permissions_query_dto, + permissions: Some(permissions_query_dto), is_deleted: false, created_at: None, updated_at: None, diff --git a/imphnen-iam/src/v1/permissions/permissions_enum.rs b/imphnen-iam/src/v1/permissions/permissions_enum.rs index 291fffb..80ccf73 100644 --- a/imphnen-iam/src/v1/permissions/permissions_enum.rs +++ b/imphnen-iam/src/v1/permissions/permissions_enum.rs @@ -37,6 +37,7 @@ pub enum PermissionsEnum { ManageAllTeams, ViewAllSensitiveData, AccessAdminDashboard, + Administrator, // Gacha permissions CreateGachaClaims, diff --git a/imphnen-iam/src/v1/permissions/permissions_guard.rs b/imphnen-iam/src/v1/permissions/permissions_guard.rs index 78df855..6ac7135 100644 --- a/imphnen-iam/src/v1/permissions/permissions_guard.rs +++ b/imphnen-iam/src/v1/permissions/permissions_guard.rs @@ -44,7 +44,7 @@ pub async fn permissions_guard( }; // Check permissions from database - let user_permissions: Vec = user.role.permissions.iter().map(|p| p.name.clone()).collect(); + let user_permissions: Vec = user.role.permissions.as_ref().unwrap_or(&vec![]).iter().map(|p| p.name.clone()).collect(); for required in &required_permissions { let required_str = required.to_string(); if !user_permissions.contains(&required_str) { diff --git a/imphnen-iam/src/v1/roles/roles_dto.rs b/imphnen-iam/src/v1/roles/roles_dto.rs index c26cc8f..1c2b307 100644 --- a/imphnen-iam/src/v1/roles/roles_dto.rs +++ b/imphnen-iam/src/v1/roles/roles_dto.rs @@ -46,6 +46,8 @@ impl RolesDetailItemDto { is_deleted: dto.is_deleted, permissions: dto .permissions + .as_ref() + .unwrap_or(&vec![]) .iter() .map(PermissionsItemDto::from) .collect(), @@ -59,7 +61,7 @@ impl RolesDetailItemDto { pub struct RolesDetailQueryDto { pub id: Thing, pub name: String, - pub permissions: Vec, + pub permissions: Option>, pub is_deleted: bool, pub created_at: Option, pub updated_at: Option, @@ -70,7 +72,7 @@ impl Default for RolesDetailQueryDto { Self { id: Thing::from(("".to_string(), surrealdb::sql::Id::Number(0))), name: String::new(), - permissions: Vec::new(), + permissions: None, is_deleted: false, created_at: None, updated_at: None, diff --git a/imphnen-iam/src/v1/roles/roles_schema.rs b/imphnen-iam/src/v1/roles/roles_schema.rs index dd20f10..b4a7c55 100644 --- a/imphnen-iam/src/v1/roles/roles_schema.rs +++ b/imphnen-iam/src/v1/roles/roles_schema.rs @@ -44,6 +44,8 @@ impl RolesSchema { name: dto.name, permissions: dto .permissions + .as_ref() + .unwrap_or(&vec![]) .into_iter() .map(|perm| { make_thing_from_enum(ResourceEnum::Permissions, &perm.id.id.to_raw()) diff --git a/imphnen-middleware/src/permissions_middleware/mod.rs b/imphnen-middleware/src/permissions_middleware/mod.rs index ce5257e..5efa41f 100644 --- a/imphnen-middleware/src/permissions_middleware/mod.rs +++ b/imphnen-middleware/src/permissions_middleware/mod.rs @@ -88,7 +88,7 @@ where } }; let user_permissions: Vec = - user.role.permissions.into_iter().map(|p| p.name).collect(); + user.role.permissions.as_ref().unwrap_or(&vec![]).iter().map(|p| p.name.clone()).collect(); // Check if user has Administrator permission - if yes, allow access to everything let has_administrator_permission = user_permissions.contains(&PermissionsEnum::Administrator.to_string()); diff --git a/tests/src/iam/auth/auth_repository_test.rs b/tests/src/iam/auth/auth_repository_test.rs index df697e5..0f318c3 100644 --- a/tests/src/iam/auth/auth_repository_test.rs +++ b/tests/src/iam/auth/auth_repository_test.rs @@ -112,7 +112,7 @@ mod auth_repository_test { role: RolesDetailQueryDto { id: make_thing("app_roles", &Uuid::new_v4().to_string()), name: "Dummy Role".into(), - permissions: vec![], + permissions: Some(vec![]), is_deleted: false, created_at: Some(get_iso_date()), updated_at: Some(get_iso_date()),