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 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) {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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()),
|
||||||
|
|||||||
Reference in New Issue
Block a user