This commit is contained in:
2026-08-01 08:59:35 +02:00
parent fdc9fb592d
commit 22b0bc36bb
4 changed files with 46 additions and 8 deletions
-3
View File
@@ -48,9 +48,6 @@ pub struct Model {
on_delete = "Cascade"
)]
pub user: HasOne<super::user::Entity>,
#[sea_orm(has_many)]
pub computed_permissions: HasMany<super::computed_permission::Entity>,
}
#[async_trait]
+14
View File
@@ -13,6 +13,7 @@ use std::sync::{Arc, OnceLock};
use uuid::Uuid;
use crate::models::computed_permission::PermissionScopeType;
use crate::repositories::types::PermissionResource;
use crate::utils::ScopedLockManager;
// Instance globale du manager de verrous scopés par Server ID
@@ -35,6 +36,19 @@ impl ComputedPermissionRepository {
.await?)
}
pub async fn get_for_resource(
&self,
user_id: Uuid,
resource: PermissionResource,
) -> AnyResult<Option<computed_permission::Model>> {
Ok(computed_permission::Entity::find()
.filter(computed_permission::Column::UserId.eq(user_id))
.filter(computed_permission::Column::ScopeType.eq(resource.scope_type()))
.filter(computed_permission::Column::ResourceId.eq(resource.resource_id()))
.one(&self.context.db)
.await?)
}
/// Vérifie si l'utilisateur possède au moins une entrée de permission sur une ressource.
pub async fn had_perm_on(&self, user_id: Uuid, resource_id: Uuid) -> AnyResult<bool> {
Ok(computed_permission::Entity::find()
+7 -4
View File
@@ -67,11 +67,14 @@ impl ServerTreeRepository {
server_id: Uuid,
user_id: Uuid,
) -> AnyResult<Vec<(channel::Model, Option<computed_permission::Model>)>> {
// Construction dynamique de la relation personnalisée (channel.id = computed_permission.resource_id)
let channel_to_permission = channel::Entity::belongs_to(computed_permission::Entity)
.from(channel::Column::Id)
.to(computed_permission::Column::ResourceId)
.into();
let rows = channel::Entity::find()
.join(
JoinType::InnerJoin,
channel::Relation::ComputedPermission.def(),
)
.join(JoinType::InnerJoin, channel_to_permission)
.filter(channel::Column::ServerId.eq(server_id))
.filter(computed_permission::Column::UserId.eq(user_id))
.filter(computed_permission::Column::ServerId.eq(server_id))
+25 -1
View File
@@ -1,4 +1,5 @@
use crate::models::{category, channel};
use crate::models::{category, channel, computed_permission};
use uuid::Uuid;
pub enum ServerExplorerItem {
Category(category::Model, Vec<channel::Model>),
@@ -32,3 +33,26 @@ pub struct ChannelFilter {
pub struct UserFilter {
pub server_id: Option<uuid::Uuid>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PermissionResource {
Server(Uuid),
Category(Uuid),
Channel(Uuid),
}
impl PermissionResource {
pub fn scope_type(self) -> computed_permission::PermissionScopeType {
match self {
Self::Server(_) => computed_permission::PermissionScopeType::Server,
Self::Category(_) => computed_permission::PermissionScopeType::Category,
Self::Channel(_) => computed_permission::PermissionScopeType::Channel,
}
}
pub fn resource_id(self) -> Uuid {
match self {
Self::Server(id) | Self::Category(id) | Self::Channel(id) => id,
}
}
}