reactive_graph_runtime_graphql_schema/mutation/
remotes.rs

1use std::sync::Arc;
2
3use async_graphql::Context;
4use async_graphql::Object;
5use async_graphql::Result;
6
7use reactive_graph_remotes_api::RemotesManager;
8
9use crate::instance_address::InstanceAddressDefinition;
10use crate::query::instance::GraphQLInstanceInfo;
11
12#[derive(Default)]
13pub struct MutationRemotes;
14
15/// Mutations for managing remote instances.
16#[Object]
17impl MutationRemotes {
18    /// Adds a remote.
19    async fn add(&self, context: &Context<'_>, address: InstanceAddressDefinition, fetch_remotes_from_remote: Option<bool>) -> Result<GraphQLInstanceInfo> {
20        let remotes_manager = context.data::<Arc<dyn RemotesManager + Send + Sync>>()?;
21        let instance = remotes_manager.add(&address.into()).await?;
22        if fetch_remotes_from_remote.unwrap_or(false) {
23            let _ = remotes_manager.fetch_and_add_remotes_from_remote(&instance.address).await;
24        }
25        Ok(instance.into())
26    }
27
28    /// Removes a remote.
29    async fn remove(&self, context: &Context<'_>, address: InstanceAddressDefinition) -> Result<bool> {
30        let remotes_manager = context.data::<Arc<dyn RemotesManager + Send + Sync>>()?;
31        Ok(remotes_manager.remove(&address.into()))
32    }
33
34    /// Removes all remotes.
35    async fn remove_all(&self, context: &Context<'_>) -> Result<bool> {
36        let remotes_manager = context.data::<Arc<dyn RemotesManager + Send + Sync>>()?;
37        remotes_manager.remove_all();
38        Ok(true)
39    }
40
41    /// Updates a remote.
42    async fn update(&self, context: &Context<'_>, address: InstanceAddressDefinition) -> Result<GraphQLInstanceInfo> {
43        let remotes_manager = context.data::<Arc<dyn RemotesManager + Send + Sync>>()?;
44        let instance = remotes_manager.update(&address.into()).await?;
45        Ok(instance.into())
46    }
47
48    /// Updates all remotes.
49    async fn update_all(&self, context: &Context<'_>) -> Result<Vec<GraphQLInstanceInfo>> {
50        let remotes_manager = context.data::<Arc<dyn RemotesManager + Send + Sync>>()?;
51        let updated_remotes = remotes_manager.update_all().await.into_iter().map(|instance| instance.into()).collect();
52        Ok(updated_remotes)
53    }
54
55    /// Fetches the remotes which are available on the given remote.
56    async fn fetch_remotes_from_remote(&self, context: &Context<'_>, address: InstanceAddressDefinition) -> Result<Vec<GraphQLInstanceInfo>> {
57        let remotes_manager = context.data::<Arc<dyn RemotesManager + Send + Sync>>()?;
58        let added_instances = remotes_manager
59            .fetch_and_add_remotes_from_remote(&address.into())
60            .await?
61            .into_iter()
62            .map(|instance| instance.into())
63            .collect();
64        Ok(added_instances)
65    }
66
67    async fn fetch_remotes_from_all_remotes(&self, context: &Context<'_>) -> Result<Vec<GraphQLInstanceInfo>> {
68        let remotes_manager = context.data::<Arc<dyn RemotesManager + Send + Sync>>()?;
69        let added_instances = remotes_manager
70            .fetch_and_add_remotes_from_all_remotes()
71            .await
72            .into_iter()
73            .map(|instance| instance.into())
74            .collect();
75        Ok(added_instances)
76    }
77}