reactive_graph_runtime_web_impl/
web_resource_manager_impl.rs

1use std::sync::Arc;
2
3use async_trait::async_trait;
4use dashmap::DashMap;
5use log::debug;
6use uuid::Uuid;
7
8use reactive_graph_config_api::ConfigManager;
9use reactive_graph_lifecycle::Lifecycle;
10use reactive_graph_plugin_api::WebResourceProvider;
11use reactive_graph_runtime_web_api::WebResourceManager;
12use springtime_di::Component;
13use springtime_di::component_alias;
14
15#[derive(Component)]
16pub struct WebResourceManagerImpl {
17    config_manager: Arc<dyn ConfigManager + Send + Sync>,
18
19    #[component(default = "DashMap::new")]
20    web_resource_providers: DashMap<String, Arc<dyn WebResourceProvider>>, // WebResourceProviders,
21    #[component(default = "DashMap::new")]
22    web_resource_provider_context_paths: DashMap<Uuid, String>, // WebResourceProviderContextPaths,
23}
24
25#[async_trait]
26#[component_alias]
27impl WebResourceManager for WebResourceManagerImpl {
28    fn has(&self, context_path: String) -> bool {
29        self.get(context_path).is_some()
30    }
31
32    fn get(&self, context_path: String) -> Option<Arc<dyn WebResourceProvider>> {
33        self.web_resource_providers.get(context_path.as_str()).map(|p| p.value().clone())
34    }
35
36    fn get_default(&self) -> Option<Arc<dyn WebResourceProvider>> {
37        self.config_manager
38            .get_graphql_default_context_path()
39            .and_then(|default_context_path| self.web_resource_providers.get(default_context_path.as_str()).map(|p| p.value().clone()))
40    }
41
42    async fn register_provider(&self, web_resource_provider: Arc<dyn WebResourceProvider>) {
43        let id = web_resource_provider.id();
44        let context_path: String = web_resource_provider.get_context_path();
45        debug!("Registering web resource provider with context path: {context_path}");
46        self.web_resource_providers.insert(context_path.clone(), web_resource_provider.clone());
47        self.web_resource_provider_context_paths.insert(id, context_path);
48    }
49
50    async fn unregister_provider(&self, id: Uuid) {
51        if let Some(context_path) = self.web_resource_provider_context_paths.get(&id) {
52            self.web_resource_providers.remove(context_path.value());
53        }
54        self.web_resource_provider_context_paths.remove(&id);
55    }
56}
57
58#[async_trait]
59impl Lifecycle for WebResourceManagerImpl {
60    async fn shutdown(&self) {
61        self.web_resource_provider_context_paths.clear();
62        self.web_resource_providers.clear();
63    }
64}