use crate::repositories::Repositories; use crate::services::category::CategoryService; use crate::services::channel::ChannelService; use crate::services::emoji::EmojiService; use crate::services::message::MessageService; use crate::services::message_reaction::MessageReactionService; use crate::services::permission::PermissionService; use crate::services::permission_sync::PermissionSyncService; use crate::services::role::RoleService; use crate::services::server::ServerService; use crate::services::server_order::ServerOrderService; use crate::services::user::UserService; use event_bus::EventBus; use std::sync::{Arc, OnceLock}; pub mod category; pub mod channel; pub mod emoji; pub mod message; pub mod message_reaction; mod permission; pub mod permission_sync; pub mod realtime_registry; pub mod role; pub mod server; mod server_order; pub mod user; #[derive(Debug, Clone)] pub struct ServicesContext { pub repositories: Arc, pub event_bus: Arc, pub services: OnceLock, } #[derive(Debug, Clone)] pub struct Services { pub realtime_registry: Arc, pub permission_sync: Arc, pub server_order: Arc, pub channel: Arc, pub server: Arc, pub category: Arc, pub message: Arc, pub message_reaction: Arc, pub user: Arc, pub role: Arc, pub permission: Arc, pub emoji: 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 realtime_registry = Arc::new(realtime_registry::RealtimeRegistry::default()); let server_order = Arc::new(ServerOrderService::new(service_context.clone())); let channel = Arc::new(ChannelService::new(service_context.clone())); let server = Arc::new(ServerService::new(service_context.clone())); let category = Arc::new(CategoryService::new(service_context.clone())); let message = Arc::new(MessageService::new(service_context.clone())); let message_reaction = Arc::new(MessageReactionService::new(service_context.clone())); let user = Arc::new(UserService::new(service_context.clone())); let role = Arc::new(RoleService::new(service_context.clone())); let permission = Arc::new(PermissionService::new(service_context.clone())); let emoji = Arc::new(EmojiService::new(service_context.clone())); let services = Self { realtime_registry, permission_sync, server_order, channel, server, category, message, message_reaction, user, role, permission, emoji, }; let _ = service_context.services.set(services.clone()); services } }