feat: Add Administrator permission and update permissions handling for roles and users

This commit is contained in:
MythEclipse
2025-09-26 00:45:57 +07:00
parent ff2e14d5f9
commit 1b7368a4b7
7 changed files with 12 additions and 7 deletions
+2 -2
View File
@@ -27,7 +27,7 @@ impl<'a> AuthRepository<'a> {
let table = ResourceEnum::UsersCache.to_string(); let table = ResourceEnum::UsersCache.to_string();
let user_id = user.email.clone(); let user_id = user.email.clone();
let permissions: Vec<String> = let permissions: Vec<String> =
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 { let user_cache = UserCacheSchema {
email: user_id.clone(), email: user_id.clone(),
permissions, permissions,
@@ -85,7 +85,7 @@ impl<'a> AuthRepository<'a> {
let role_detail_query_dto = RolesDetailQueryDto { let role_detail_query_dto = RolesDetailQueryDto {
id: Thing::from(("app_roles".to_string(), surrealdb::sql::Id::rand())), id: Thing::from(("app_roles".to_string(), surrealdb::sql::Id::rand())),
name: "CachedRole".to_string(), name: "CachedRole".to_string(),
permissions: permissions_query_dto, permissions: Some(permissions_query_dto),
is_deleted: false, is_deleted: false,
created_at: None, created_at: None,
updated_at: None, updated_at: None,
@@ -37,6 +37,7 @@ pub enum PermissionsEnum {
ManageAllTeams, ManageAllTeams,
ViewAllSensitiveData, ViewAllSensitiveData,
AccessAdminDashboard, AccessAdminDashboard,
Administrator,
// Gacha permissions // Gacha permissions
CreateGachaClaims, CreateGachaClaims,
@@ -44,7 +44,7 @@ pub async fn permissions_guard(
}; };
// Check permissions from database // Check permissions from database
let user_permissions: Vec<String> = user.role.permissions.iter().map(|p| p.name.clone()).collect(); let user_permissions: Vec<String> = user.role.permissions.as_ref().unwrap_or(&vec![]).iter().map(|p| p.name.clone()).collect();
for required in &required_permissions { for required in &required_permissions {
let required_str = required.to_string(); let required_str = required.to_string();
if !user_permissions.contains(&required_str) { if !user_permissions.contains(&required_str) {
+4 -2
View File
@@ -46,6 +46,8 @@ impl RolesDetailItemDto {
is_deleted: dto.is_deleted, is_deleted: dto.is_deleted,
permissions: dto permissions: dto
.permissions .permissions
.as_ref()
.unwrap_or(&vec![])
.iter() .iter()
.map(PermissionsItemDto::from) .map(PermissionsItemDto::from)
.collect(), .collect(),
@@ -59,7 +61,7 @@ impl RolesDetailItemDto {
pub struct RolesDetailQueryDto { pub struct RolesDetailQueryDto {
pub id: Thing, pub id: Thing,
pub name: String, pub name: String,
pub permissions: Vec<PermissionsQueryDto>, pub permissions: Option<Vec<PermissionsQueryDto>>,
pub is_deleted: bool, pub is_deleted: bool,
pub created_at: Option<String>, pub created_at: Option<String>,
pub updated_at: Option<String>, pub updated_at: Option<String>,
@@ -70,7 +72,7 @@ impl Default for RolesDetailQueryDto {
Self { Self {
id: Thing::from(("".to_string(), surrealdb::sql::Id::Number(0))), id: Thing::from(("".to_string(), surrealdb::sql::Id::Number(0))),
name: String::new(), name: String::new(),
permissions: Vec::new(), permissions: None,
is_deleted: false, is_deleted: false,
created_at: None, created_at: None,
updated_at: None, updated_at: None,
+2
View File
@@ -44,6 +44,8 @@ impl RolesSchema {
name: dto.name, name: dto.name,
permissions: dto permissions: dto
.permissions .permissions
.as_ref()
.unwrap_or(&vec![])
.into_iter() .into_iter()
.map(|perm| { .map(|perm| {
make_thing_from_enum(ResourceEnum::Permissions, &perm.id.id.to_raw()) make_thing_from_enum(ResourceEnum::Permissions, &perm.id.id.to_raw())
@@ -88,7 +88,7 @@ where
} }
}; };
let user_permissions: Vec<String> = let user_permissions: Vec<String> =
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 // Check if user has Administrator permission - if yes, allow access to everything
let has_administrator_permission = user_permissions.contains(&PermissionsEnum::Administrator.to_string()); let has_administrator_permission = user_permissions.contains(&PermissionsEnum::Administrator.to_string());
+1 -1
View File
@@ -112,7 +112,7 @@ mod auth_repository_test {
role: RolesDetailQueryDto { role: RolesDetailQueryDto {
id: make_thing("app_roles", &Uuid::new_v4().to_string()), id: make_thing("app_roles", &Uuid::new_v4().to_string()),
name: "Dummy Role".into(), name: "Dummy Role".into(),
permissions: vec![], permissions: Some(vec![]),
is_deleted: false, is_deleted: false,
created_at: Some(get_iso_date()), created_at: Some(get_iso_date()),
updated_at: Some(get_iso_date()), updated_at: Some(get_iso_date()),