diff --git a/imphnen-iam/src/v1/auth/auth_repository.rs b/imphnen-iam/src/v1/auth/auth_repository.rs index a3ae0ab..d0b7a93 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.as_ref().unwrap_or(&vec![]).iter().map(|p| p.name.clone()).collect(); + user.role.permissions.as_ref().unwrap_or(&vec![]).iter().filter_map(|p| p.as_ref().and_then(|pp| pp.name.clone())).collect(); let user_cache = UserCacheSchema { email: user_id.clone(), permissions, @@ -72,11 +72,11 @@ impl<'a> AuthRepository<'a> { .permissions .into_iter() .map(|name| PermissionsQueryDto { - id: Thing::from(( + id: Some(Thing::from(( "app_permissions".to_string(), surrealdb::sql::Id::rand(), - )), - name, + ))), + name: Some(name), created_at: None, updated_at: None, }) @@ -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: Some(permissions_query_dto), + permissions: Some(permissions_query_dto.into_iter().map(Some).collect()), is_deleted: false, created_at: None, updated_at: None, diff --git a/imphnen-iam/src/v1/permissions/permissions_dto.rs b/imphnen-iam/src/v1/permissions/permissions_dto.rs index 84cae19..21ad42f 100644 --- a/imphnen-iam/src/v1/permissions/permissions_dto.rs +++ b/imphnen-iam/src/v1/permissions/permissions_dto.rs @@ -27,8 +27,8 @@ pub struct PermissionsItemDto { impl PermissionsItemDto { pub fn from(dto: &PermissionsQueryDto) -> Self { Self { - id: dto.id.id.to_raw(), - name: dto.name.clone(), + id: dto.id.as_ref().map(|id| id.id.to_raw()).unwrap_or_default(), + name: dto.name.clone().unwrap_or_default(), created_at: dto.created_at.clone(), updated_at: dto.updated_at.clone(), } @@ -37,8 +37,8 @@ impl PermissionsItemDto { #[derive(Clone, Debug, Serialize, Deserialize)] pub struct PermissionsQueryDto { - pub id: Thing, - pub name: String, + pub id: Option, + pub name: Option, pub created_at: Option, pub updated_at: Option, } diff --git a/imphnen-iam/src/v1/permissions/permissions_guard.rs b/imphnen-iam/src/v1/permissions/permissions_guard.rs index 6ac7135..8a1abbb 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.as_ref().unwrap_or(&vec![]).iter().map(|p| p.name.clone()).collect(); + let user_permissions: Vec = user.role.permissions.as_ref().unwrap_or(&vec![]).iter().filter_map(|p| p.as_ref().and_then(|pp| pp.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/permissions/permissions_schema.rs b/imphnen-iam/src/v1/permissions/permissions_schema.rs index 27a313d..b63f858 100644 --- a/imphnen-iam/src/v1/permissions/permissions_schema.rs +++ b/imphnen-iam/src/v1/permissions/permissions_schema.rs @@ -41,8 +41,8 @@ impl PermissionsSchema { pub fn from(dto: PermissionsQueryDto) -> Self { Self { - id: dto.id, - name: dto.name, + id: dto.id.unwrap_or_else(|| make_thing_from_enum(ResourceEnum::Permissions, "unknown")), + name: dto.name.unwrap_or_default(), is_deleted: false, created_at: dto.created_at, updated_at: dto.updated_at, diff --git a/imphnen-iam/src/v1/roles/roles_dto.rs b/imphnen-iam/src/v1/roles/roles_dto.rs index 1c2b307..e516c3f 100644 --- a/imphnen-iam/src/v1/roles/roles_dto.rs +++ b/imphnen-iam/src/v1/roles/roles_dto.rs @@ -49,6 +49,7 @@ impl RolesDetailItemDto { .as_ref() .unwrap_or(&vec![]) .iter() + .filter_map(|p| p.as_ref()) .map(PermissionsItemDto::from) .collect(), created_at: dto.created_at.clone(), @@ -61,7 +62,7 @@ impl RolesDetailItemDto { pub struct RolesDetailQueryDto { pub id: Thing, pub name: String, - pub permissions: Option>, + pub permissions: Option>>, pub is_deleted: bool, pub created_at: Option, pub updated_at: Option, diff --git a/imphnen-iam/src/v1/roles/roles_schema.rs b/imphnen-iam/src/v1/roles/roles_schema.rs index b4a7c55..89bdde1 100644 --- a/imphnen-iam/src/v1/roles/roles_schema.rs +++ b/imphnen-iam/src/v1/roles/roles_schema.rs @@ -47,8 +47,8 @@ impl RolesSchema { .as_ref() .unwrap_or(&vec![]) .into_iter() - .map(|perm| { - make_thing_from_enum(ResourceEnum::Permissions, &perm.id.id.to_raw()) + .filter_map(|perm| { + perm.as_ref().and_then(|p| p.id.as_ref().map(|id| make_thing_from_enum(ResourceEnum::Permissions, &id.id.to_raw()))) }) .collect(), is_deleted: dto.is_deleted, diff --git a/imphnen-middleware/src/permissions_middleware/mod.rs b/imphnen-middleware/src/permissions_middleware/mod.rs index 5efa41f..2426415 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.as_ref().unwrap_or(&vec![]).iter().map(|p| p.name.clone()).collect(); + user.role.permissions.as_ref().unwrap_or(&vec![]).iter().filter_map(|p| p.as_ref().and_then(|pp| pp.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());