reactive_graph_runtime_graphql_schema/mutation/
remotes.rs1use 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#[Object]
17impl MutationRemotes {
18 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 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 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 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 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 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}