refactor: Update permissions handling to filter out None values and ensure safe access

This commit is contained in:
MythEclipse
2025-09-26 01:08:18 +07:00
parent 1b7368a4b7
commit 17cc4ccdba
7 changed files with 17 additions and 16 deletions
+5 -5
View File
@@ -27,7 +27,7 @@ impl<'a> AuthRepository<'a> {
let table = ResourceEnum::UsersCache.to_string();
let user_id = user.email.clone();
let permissions: Vec<String> =
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,
@@ -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<Thing>,
pub name: Option<String>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
}
@@ -44,7 +44,7 @@ pub async fn permissions_guard(
};
// Check permissions from database
let user_permissions: Vec<String> = user.role.permissions.as_ref().unwrap_or(&vec![]).iter().map(|p| p.name.clone()).collect();
let user_permissions: Vec<String> = 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) {
@@ -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,
+2 -1
View File
@@ -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<Vec<PermissionsQueryDto>>,
pub permissions: Option<Vec<Option<PermissionsQueryDto>>>,
pub is_deleted: bool,
pub created_at: Option<String>,
pub updated_at: Option<String>,
+2 -2
View File
@@ -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,
@@ -88,7 +88,7 @@ where
}
};
let user_permissions: Vec<String> =
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());