init
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
use crate::repositories::Repositories;
|
||||
use crate::services::permission_sync::PermissionSyncService;
|
||||
use crate::services::server_order::ServerOrderService;
|
||||
use event_bus::EventBus;
|
||||
use std::sync::{Arc, OnceLock};
|
||||
|
||||
pub mod permission_sync;
|
||||
mod server_order;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct ServicesContext {
|
||||
pub repositories: Arc<Repositories>,
|
||||
pub event_bus: Arc<EventBus>,
|
||||
pub services: OnceLock<Services>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct Services {
|
||||
permission_sync: Arc<PermissionSyncService>,
|
||||
server_order: Arc<ServerOrderService>,
|
||||
}
|
||||
|
||||
impl Services {
|
||||
pub fn new(repositories: Arc<Repositories>, event_bus: Arc<EventBus>) -> Self {
|
||||
let service_context = Arc::new(ServicesContext {
|
||||
repositories,
|
||||
event_bus,
|
||||
services: OnceLock::new(),
|
||||
});
|
||||
let permission_sync = Arc::new(PermissionSyncService::new(service_context.clone()));
|
||||
let server_order = Arc::new(ServerOrderService::new(service_context.clone()));
|
||||
|
||||
let services = Self {
|
||||
permission_sync,
|
||||
server_order,
|
||||
};
|
||||
let _ = service_context.services.set(services.clone());
|
||||
services
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,222 @@
|
||||
use crate::repositories::Repositories;
|
||||
use crate::services::ServicesContext;
|
||||
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 {
|
||||
service_context: Arc<ServicesContext>,
|
||||
}
|
||||
|
||||
impl PermissionSyncService {
|
||||
pub fn new(service_context: Arc<ServicesContext>) -> Self {
|
||||
Self { service_context }
|
||||
}
|
||||
|
||||
/// 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) {
|
||||
let event_bus = self.service_context.event_bus.clone();
|
||||
let repositories = self.service_context.repositories.clone();
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// Événements Serveur & Membres Serveur
|
||||
// ---------------------------------------------------------------------
|
||||
event_bus.on_async_with(
|
||||
"server_created",
|
||||
repositories.clone(),
|
||||
move |repositories, server_id: Uuid| async move {
|
||||
Self::sync_server(repositories, server_id).await;
|
||||
},
|
||||
);
|
||||
|
||||
event_bus.on_async_with(
|
||||
"server_user_created",
|
||||
repositories.clone(),
|
||||
move |repositories, (server_id, user_id): (Uuid, Uuid)| async move {
|
||||
Self::sync_user(repositories, user_id, server_id).await;
|
||||
},
|
||||
);
|
||||
|
||||
event_bus.on_async_with(
|
||||
"server_user_deleted",
|
||||
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
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
event_bus.on_async_with(
|
||||
"role_user_created",
|
||||
repositories.clone(),
|
||||
move |repositories, (_role_id, user_id, server_id): (Uuid, Uuid, Uuid)| async move {
|
||||
Self::sync_user(repositories, user_id, server_id).await;
|
||||
},
|
||||
);
|
||||
|
||||
event_bus.on_async_with(
|
||||
"role_user_deleted",
|
||||
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
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
event_bus.on_async_with(
|
||||
"server_role_permission_updated",
|
||||
repositories.clone(),
|
||||
move |repositories, (role_id, server_id): (Uuid, Uuid)| async move {
|
||||
Self::sync_role_members(repositories, role_id, server_id).await;
|
||||
},
|
||||
);
|
||||
|
||||
event_bus.on_async_with(
|
||||
"server_user_permission_updated",
|
||||
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
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
event_bus.on_async_with(
|
||||
"channel_created",
|
||||
repositories.clone(),
|
||||
move |repositories, server_id: Uuid| async move {
|
||||
Self::sync_server(repositories, server_id).await;
|
||||
},
|
||||
);
|
||||
|
||||
event_bus.on_async_with(
|
||||
"channel_deleted",
|
||||
repositories.clone(),
|
||||
move |repositories, server_id: Uuid| async move {
|
||||
Self::sync_server(repositories, server_id).await;
|
||||
},
|
||||
);
|
||||
|
||||
event_bus.on_async_with(
|
||||
"channel_role_permission_updated",
|
||||
repositories.clone(),
|
||||
move |repositories, (role_id, server_id): (Uuid, Uuid)| async move {
|
||||
Self::sync_role_members(repositories, role_id, server_id).await;
|
||||
},
|
||||
);
|
||||
|
||||
event_bus.on_async_with(
|
||||
"channel_user_permission_updated",
|
||||
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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
use crate::services::ServicesContext;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct ServerOrderService {
|
||||
service_context: Arc<ServicesContext>,
|
||||
}
|
||||
|
||||
impl ServerOrderService {
|
||||
pub fn new(service_context: Arc<ServicesContext>) -> Self {
|
||||
Self { service_context }
|
||||
}
|
||||
|
||||
pub async fn exemple_call_other_service(&self) {
|
||||
if let Some(services) = self.service_context.services.get() {
|
||||
services.permission_sync.start_listen_event().await;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user