This commit is contained in:
2026-07-28 22:49:50 +02:00
parent 066074dcd4
commit 9b705f0d96
6 changed files with 94 additions and 40 deletions
+3 -3
View File
@@ -1,12 +1,10 @@
mod permission_sync;
pub mod state;
use crate::config::AppConfig;
use crate::core::permission_sync::PermissionSyncService;
use crate::core::state::Services;
use crate::database::Database;
use crate::http::server::HttpServer;
use crate::metrics::{reporter, AppMetrics};
use crate::metrics::{AppMetrics, reporter};
use crate::repositories::Repositories;
use crate::routes::gateway::GatewayManager;
use crate::udp::server::UdpServer;
@@ -70,6 +68,8 @@ impl App {
let metrics = AppMetrics::new();
let services = Arc::new(Services::new(repositories.clone(), event_bus.clone()));
let permission_sync = PermissionSyncService::new(repositories.clone(), event_bus.clone());
let state = AppState {
-224
View File
@@ -1,224 +0,0 @@
use crate::repositories::Repositories;
use event_bus::EventBus;
use std::sync::Arc;
use uuid::Uuid;
// list of all events :
// server_user_created
// server_user_deleted
//
// role_user_created
// role_user_deleted
//
// server_role_permission_created
// server_role_permission_updated
// server_role_permission_deleted
//
// server_user_permission_created
// server_user_permission_updated
// server_user_permission_deleted
//
// channel_role_permission_created
// channel_role_permission_updated
// channel_role_permission_deleted
//
// channel_user_permission_created
// channel_user_permission_updated
// channel_user_permission_deleted
//
// channel_created
// channel_deleted
// [Requête HTTP Admin]
// │
// ▼
// 1. Repositories (Ecriture BDD)
// │
// ▼ (Emit Event ex: server_role_permission_updated)
// 2. EventBus
// │
// ├────────────────────────────────────────┐
// ▼ ▼
// 3. PermissionSyncService (Async Task) [Réponse HTTP 200/204]
// │
// ├─► Recalcule computed_permission (full_sync_user)
// │
// └─► Emit Event "user_permissions_updated"
// │
// ▼
// 4. Gateway WebSocket
// │
// ▼ (Push WS)
// 5. Client Frontend (Vue 3 / Pinia)
#[derive(Debug, Clone)]
pub struct PermissionSyncService {
repositories: Arc<Repositories>,
event_bus: Arc<EventBus>,
}
impl PermissionSyncService {
pub fn new(repositories: Arc<Repositories>, event_bus: Arc<EventBus>) -> Self {
Self {
repositories,
event_bus,
}
}
/// Enregistre les listeners sur l'EventBus pour mettre à jour le cache
/// des permissions calculées lors des modifications de structure ou de droits.
pub async fn start_listen_event(&self) {
// ---------------------------------------------------------------------
// Événements Serveur & Membres Serveur
// ---------------------------------------------------------------------
self.event_bus.on_async_with(
"server_created",
self.repositories.clone(),
move |repositories, server_id: Uuid| async move {
Self::sync_server(repositories, server_id).await;
},
);
self.event_bus.on_async_with(
"server_user_created",
self.repositories.clone(),
move |repositories, (server_id, user_id): (Uuid, Uuid)| async move {
Self::sync_user(repositories, user_id, server_id).await;
},
);
self.event_bus.on_async_with(
"server_user_deleted",
self.repositories.clone(),
move |repositories, (server_id, user_id): (Uuid, Uuid)| async move {
Self::sync_user(repositories, user_id, server_id).await;
},
);
// ---------------------------------------------------------------------
// Événements Rôles & Membres de Rôle
// ---------------------------------------------------------------------
self.event_bus.on_async_with(
"role_user_created",
self.repositories.clone(),
move |repositories, (_role_id, user_id, server_id): (Uuid, Uuid, Uuid)| async move {
Self::sync_user(repositories, user_id, server_id).await;
},
);
self.event_bus.on_async_with(
"role_user_deleted",
self.repositories.clone(),
move |repositories, (_role_id, user_id, server_id): (Uuid, Uuid, Uuid)| async move {
Self::sync_user(repositories, user_id, server_id).await;
},
);
// ---------------------------------------------------------------------
// Overrides de Permissions Serveur
// ---------------------------------------------------------------------
self.event_bus.on_async_with(
"server_role_permission_updated",
self.repositories.clone(),
move |repositories, (role_id, server_id): (Uuid, Uuid)| async move {
Self::sync_role_members(repositories, role_id, server_id).await;
},
);
self.event_bus.on_async_with(
"server_user_permission_updated",
self.repositories.clone(),
move |repositories, (server_id, user_id): (Uuid, Uuid)| async move {
Self::sync_user(repositories, user_id, server_id).await;
},
);
// ---------------------------------------------------------------------
// Événements Canaux & Overrides de Permissions Canaux
// ---------------------------------------------------------------------
self.event_bus.on_async_with(
"channel_created",
self.repositories.clone(),
move |repositories, server_id: Uuid| async move {
Self::sync_server(repositories, server_id).await;
},
);
self.event_bus.on_async_with(
"channel_deleted",
self.repositories.clone(),
move |repositories, server_id: Uuid| async move {
Self::sync_server(repositories, server_id).await;
},
);
self.event_bus.on_async_with(
"channel_role_permission_updated",
self.repositories.clone(),
move |repositories, (role_id, server_id): (Uuid, Uuid)| async move {
Self::sync_role_members(repositories, role_id, server_id).await;
},
);
self.event_bus.on_async_with(
"channel_user_permission_updated",
self.repositories.clone(),
move |repositories, (server_id, user_id): (Uuid, Uuid)| async move {
Self::sync_user(repositories, user_id, server_id).await;
},
);
}
// -------------------------------------------------------------------------
// Méthodes d'exécution Asynchrones
// -------------------------------------------------------------------------
/// Recalcule le cache pour un utilisateur sur un serveur donné.
async fn sync_user(repositories: Arc<Repositories>, user_id: Uuid, server_id: Uuid) {
if let Err(err) = repositories
.computed_permission
.full_sync_user(user_id, server_id)
.await
{
tracing::error!(
"Erreur lors de la synchronisation des permissions pour l'utilisateur {} sur le serveur {}: {:?}",
user_id,
server_id,
err
);
}
}
/// Recalcule le cache pour tous les membres d'un rôle.
async fn sync_role_members(repositories: Arc<Repositories>, role_id: Uuid, server_id: Uuid) {
if let Err(err) = repositories
.computed_permission
.sync_role_members(role_id, server_id)
.await
{
tracing::error!(
"Erreur lors de la synchronisation des membres du rôle {} sur le serveur {}: {:?}",
role_id,
server_id,
err
);
}
}
/// Recalcule le cache pour TOUS les utilisateurs d'un serveur.
async fn sync_server(repositories: Arc<Repositories>, server_id: Uuid) {
if let Err(err) = repositories
.computed_permission
.full_sync_server(server_id)
.await
{
tracing::error!(
"Erreur lors de la synchronisation complète du serveur {}: {:?}",
server_id,
err
);
}
}
}
+2 -6
View File
@@ -1,9 +1,9 @@
use crate::config::AppConfig;
use crate::core::permission_sync::PermissionSyncService;
use crate::metrics::AppMetrics;
use crate::models::server;
use crate::repositories::Repositories;
use crate::routes::gateway::GatewayManager;
use crate::services::Services;
use event_bus::EventBus;
use sea_orm::DatabaseConnection;
use std::sync::{Arc, RwLock};
@@ -18,11 +18,7 @@ pub struct AppState {
pub metrics: AppMetrics,
pub gateway: Arc<GatewayManager>,
pub event_bus: Arc<EventBus>,
pub services: Arc<Services>,
}
impl AppState {}
#[derive(Debug, Clone)]
pub struct Services {
pub permission_sync: Arc<PermissionSyncService>,
}