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 user_id = user.email.clone();
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 {
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,
@@ -37,6 +37,7 @@ pub enum PermissionsEnum {
ManageAllTeams,
ViewAllSensitiveData,
AccessAdminDashboard,
Administrator,
// Gacha permissions
CreateGachaClaims,
@@ -44,7 +44,7 @@ pub async fn permissions_guard(
};
// 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 {
let required_str = required.to_string();
if !user_permissions.contains(&required_str) {
+4 -2
View File
@@ -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<PermissionsQueryDto>,
pub permissions: Option<Vec<PermissionsQueryDto>>,
pub is_deleted: bool,
pub created_at: Option<String>,
pub updated_at: Option<String>,
@@ -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,
+2
View File
@@ -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())
@@ -88,7 +88,7 @@ where
}
};
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
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 {
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()),