init
This commit is contained in:
@@ -48,9 +48,6 @@ pub struct Model {
|
|||||||
on_delete = "Cascade"
|
on_delete = "Cascade"
|
||||||
)]
|
)]
|
||||||
pub user: HasOne<super::user::Entity>,
|
pub user: HasOne<super::user::Entity>,
|
||||||
|
|
||||||
#[sea_orm(has_many)]
|
|
||||||
pub computed_permissions: HasMany<super::computed_permission::Entity>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ use std::sync::{Arc, OnceLock};
|
|||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
use crate::models::computed_permission::PermissionScopeType;
|
use crate::models::computed_permission::PermissionScopeType;
|
||||||
|
use crate::repositories::types::PermissionResource;
|
||||||
use crate::utils::ScopedLockManager;
|
use crate::utils::ScopedLockManager;
|
||||||
|
|
||||||
// Instance globale du manager de verrous scopés par Server ID
|
// Instance globale du manager de verrous scopés par Server ID
|
||||||
@@ -35,6 +36,19 @@ impl ComputedPermissionRepository {
|
|||||||
.await?)
|
.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.
|
/// 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> {
|
pub async fn had_perm_on(&self, user_id: Uuid, resource_id: Uuid) -> AnyResult<bool> {
|
||||||
Ok(computed_permission::Entity::find()
|
Ok(computed_permission::Entity::find()
|
||||||
|
|||||||
@@ -67,11 +67,14 @@ impl ServerTreeRepository {
|
|||||||
server_id: Uuid,
|
server_id: Uuid,
|
||||||
user_id: Uuid,
|
user_id: Uuid,
|
||||||
) -> AnyResult<Vec<(channel::Model, Option<computed_permission::Model>)>> {
|
) -> 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()
|
let rows = channel::Entity::find()
|
||||||
.join(
|
.join(JoinType::InnerJoin, channel_to_permission)
|
||||||
JoinType::InnerJoin,
|
|
||||||
channel::Relation::ComputedPermission.def(),
|
|
||||||
)
|
|
||||||
.filter(channel::Column::ServerId.eq(server_id))
|
.filter(channel::Column::ServerId.eq(server_id))
|
||||||
.filter(computed_permission::Column::UserId.eq(user_id))
|
.filter(computed_permission::Column::UserId.eq(user_id))
|
||||||
.filter(computed_permission::Column::ServerId.eq(server_id))
|
.filter(computed_permission::Column::ServerId.eq(server_id))
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use crate::models::{category, channel};
|
use crate::models::{category, channel, computed_permission};
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
pub enum ServerExplorerItem {
|
pub enum ServerExplorerItem {
|
||||||
Category(category::Model, Vec<channel::Model>),
|
Category(category::Model, Vec<channel::Model>),
|
||||||
@@ -32,3 +33,26 @@ pub struct ChannelFilter {
|
|||||||
pub struct UserFilter {
|
pub struct UserFilter {
|
||||||
pub server_id: Option<uuid::Uuid>,
|
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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user