feat: Add Administrator permission and update permissions handling for roles and users
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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()),
|
||||
|
||||
Reference in New Issue
Block a user