diff --git a/src/core/mod.rs b/src/core/mod.rs index 9656e8e..a9e6887 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -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 { diff --git a/src/core/state.rs b/src/core/state.rs index 0bb8086..0484830 100644 --- a/src/core/state.rs +++ b/src/core/state.rs @@ -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, pub event_bus: Arc, + pub services: Arc, } impl AppState {} - -#[derive(Debug, Clone)] -pub struct Services { - pub permission_sync: Arc, -} diff --git a/src/lib.rs b/src/lib.rs index e0d3913..9015fd0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,4 +14,5 @@ pub mod metrics; pub mod domain; +pub mod services; pub mod utils; diff --git a/src/services/mod.rs b/src/services/mod.rs new file mode 100644 index 0000000..4d5a897 --- /dev/null +++ b/src/services/mod.rs @@ -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, + pub event_bus: Arc, + pub services: OnceLock, +} + +#[derive(Debug, Clone)] +pub struct Services { + permission_sync: Arc, + server_order: Arc, +} + +impl Services { + pub fn new(repositories: Arc, event_bus: Arc) -> 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 + } +} diff --git a/src/core/permission_sync.rs b/src/services/permission_sync.rs similarity index 86% rename from src/core/permission_sync.rs rename to src/services/permission_sync.rs index 31c12f6..218786b 100644 --- a/src/core/permission_sync.rs +++ b/src/services/permission_sync.rs @@ -1,5 +1,5 @@ use crate::repositories::Repositories; -use event_bus::EventBus; +use crate::services::ServicesContext; use std::sync::Arc; use uuid::Uuid; // list of all events : @@ -51,44 +51,42 @@ use uuid::Uuid; #[derive(Debug, Clone)] pub struct PermissionSyncService { - repositories: Arc, - event_bus: Arc, + service_context: Arc, } impl PermissionSyncService { - pub fn new(repositories: Arc, event_bus: Arc) -> Self { - Self { - repositories, - event_bus, - } + pub fn new(service_context: Arc) -> 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 // --------------------------------------------------------------------- - - self.event_bus.on_async_with( + event_bus.on_async_with( "server_created", - self.repositories.clone(), + repositories.clone(), move |repositories, server_id: Uuid| async move { Self::sync_server(repositories, server_id).await; }, ); - self.event_bus.on_async_with( + event_bus.on_async_with( "server_user_created", - self.repositories.clone(), + 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( + event_bus.on_async_with( "server_user_deleted", - self.repositories.clone(), + repositories.clone(), move |repositories, (server_id, user_id): (Uuid, Uuid)| async move { Self::sync_user(repositories, user_id, server_id).await; }, @@ -98,17 +96,17 @@ impl PermissionSyncService { // Événements Rôles & Membres de Rôle // --------------------------------------------------------------------- - self.event_bus.on_async_with( + event_bus.on_async_with( "role_user_created", - self.repositories.clone(), + 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( + event_bus.on_async_with( "role_user_deleted", - self.repositories.clone(), + repositories.clone(), move |repositories, (_role_id, user_id, server_id): (Uuid, Uuid, Uuid)| async move { Self::sync_user(repositories, user_id, server_id).await; }, @@ -118,17 +116,17 @@ impl PermissionSyncService { // Overrides de Permissions Serveur // --------------------------------------------------------------------- - self.event_bus.on_async_with( + event_bus.on_async_with( "server_role_permission_updated", - self.repositories.clone(), + 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( + event_bus.on_async_with( "server_user_permission_updated", - self.repositories.clone(), + repositories.clone(), move |repositories, (server_id, user_id): (Uuid, Uuid)| async move { Self::sync_user(repositories, user_id, server_id).await; }, @@ -138,33 +136,33 @@ impl PermissionSyncService { // Événements Canaux & Overrides de Permissions Canaux // --------------------------------------------------------------------- - self.event_bus.on_async_with( + event_bus.on_async_with( "channel_created", - self.repositories.clone(), + repositories.clone(), move |repositories, server_id: Uuid| async move { Self::sync_server(repositories, server_id).await; }, ); - self.event_bus.on_async_with( + event_bus.on_async_with( "channel_deleted", - self.repositories.clone(), + repositories.clone(), move |repositories, server_id: Uuid| async move { Self::sync_server(repositories, server_id).await; }, ); - self.event_bus.on_async_with( + event_bus.on_async_with( "channel_role_permission_updated", - self.repositories.clone(), + 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( + event_bus.on_async_with( "channel_user_permission_updated", - self.repositories.clone(), + repositories.clone(), move |repositories, (server_id, user_id): (Uuid, Uuid)| async move { Self::sync_user(repositories, user_id, server_id).await; }, diff --git a/src/services/server_order.rs b/src/services/server_order.rs new file mode 100644 index 0000000..fcc93de --- /dev/null +++ b/src/services/server_order.rs @@ -0,0 +1,19 @@ +use crate::services::ServicesContext; +use std::sync::Arc; + +#[derive(Debug, Clone)] +pub struct ServerOrderService { + service_context: Arc, +} + +impl ServerOrderService { + pub fn new(service_context: Arc) -> 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; + } + } +}