reactive_graph_client/client/instances/entities/
api.rs

1use std::sync::Arc;
2
3use crate::client::ReactiveGraphClient;
4use crate::client::ReactiveGraphClientExecutionError;
5use crate::client::instances::entities::mutations::add_component::mutations::add_component;
6use crate::client::instances::entities::mutations::add_property::mutations::add_property;
7use crate::client::instances::entities::mutations::create::mutations::create;
8use crate::client::instances::entities::mutations::delete::mutations::delete_entity_instance_mutation;
9use crate::client::instances::entities::mutations::remove_component::mutations::remove_component;
10use crate::client::instances::entities::mutations::remove_property::mutations::remove_property;
11use crate::client::instances::entities::mutations::set_property::mutations::set_property;
12use crate::client::instances::entities::queries::get_by_id::queries::get_entity_instance_by_id;
13use crate::client::instances::entities::queries::get_by_label::queries::get_entity_instance_by_label;
14use crate::client::instances::entities::queries::search::queries::search;
15use crate::client::instances::entities::variables::search::variables::SearchEntityInstancesVariables;
16use cynic::http::ReqwestExt;
17use reactive_graph_graph::ComponentTypeId;
18use reactive_graph_graph::EntityInstance;
19use reactive_graph_graph::EntityTypeId;
20use reactive_graph_graph::PropertyInstances;
21use reactive_graph_graph::PropertyType;
22use serde_json::Value;
23use uuid::Uuid;
24
25pub struct EntityInstances {
26    client: Arc<ReactiveGraphClient>,
27}
28
29impl EntityInstances {
30    pub fn new(client: Arc<ReactiveGraphClient>) -> Self {
31        Self { client }
32    }
33
34    pub async fn search(&self, search_query: SearchEntityInstancesVariables) -> Result<Option<Vec<EntityInstance>>, ReactiveGraphClientExecutionError> {
35        let entity_instances = self
36            .client
37            .client
38            .post(self.client.url_reactive_graph())
39            .run_graphql(search(search_query))
40            .await
41            .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
42            .data
43            .map(|data| crate::schema_graphql::instances::entity_instance::EntityInstances(data.instances.entities))
44            .map(From::from);
45        Ok(entity_instances)
46    }
47
48    pub async fn get_entity_instance_by_id<ID: Into<Uuid>>(&self, id: ID) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
49        let id = id.into();
50        let entity_instance = self
51            .client
52            .client
53            .post(self.client.url_reactive_graph())
54            .run_graphql(get_entity_instance_by_id(id))
55            .await
56            .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
57            .data
58            .and_then(|data| data.instances.entities.first().cloned())
59            .map(From::from);
60        Ok(entity_instance)
61    }
62
63    pub async fn get_entity_instance_by_label<L: Into<String>>(&self, label: L) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
64        let label = label.into();
65        let entity_instance = self
66            .client
67            .client
68            .post(self.client.url_reactive_graph())
69            .run_graphql(get_entity_instance_by_label(label))
70            .await
71            .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
72            .data
73            .and_then(|data| data.instances.entities.first().cloned())
74            .map(From::from);
75        Ok(entity_instance)
76    }
77
78    pub async fn set_property<ID: Into<Uuid>, S: Into<String>, V: Into<Value>>(
79        &self,
80        id: ID,
81        name: S,
82        value: V,
83    ) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
84        let id = id.into();
85        let name = name.into();
86        let value = value.into();
87        let entity_instance = self
88            .client
89            .client
90            .post(self.client.url_reactive_graph())
91            .run_graphql(set_property(id, name, value))
92            .await
93            .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
94            .data
95            .map(|data| data.instances.entities.update)
96            .map(From::from);
97        Ok(entity_instance)
98    }
99
100    pub async fn add_property<ID: Into<Uuid>, PT: Into<PropertyType>>(
101        &self,
102        id: ID,
103        property_type: PT,
104    ) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
105        let id = id.into();
106        let property_type = property_type.into();
107        let entity_instance = self
108            .client
109            .client
110            .post(self.client.url_reactive_graph())
111            .run_graphql(add_property(id, property_type))
112            .await
113            .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
114            .data
115            .map(|data| data.instances.entities.update)
116            .map(From::from);
117        Ok(entity_instance)
118    }
119
120    pub async fn remove_property<ID: Into<Uuid>, S: Into<String>>(
121        &self,
122        id: ID,
123        property_name: S,
124    ) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
125        let id = id.into();
126        let property_name = property_name.into();
127        let entity_instance = self
128            .client
129            .client
130            .post(self.client.url_reactive_graph())
131            .run_graphql(remove_property(id, property_name))
132            .await
133            .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
134            .data
135            .map(|data| data.instances.entities.update)
136            .map(From::from);
137        Ok(entity_instance)
138    }
139
140    pub async fn add_component<ID: Into<Uuid>, C: Into<ComponentTypeId>>(
141        &self,
142        id: ID,
143        component_ty: C,
144    ) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
145        let id = id.into();
146        let component_ty = component_ty.into();
147        let entity_instance = self
148            .client
149            .client
150            .post(self.client.url_reactive_graph())
151            .run_graphql(add_component(id, component_ty))
152            .await
153            .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
154            .data
155            .map(|data| data.instances.entities.update)
156            .map(From::from);
157        Ok(entity_instance)
158    }
159
160    pub async fn remove_component<ID: Into<Uuid>, C: Into<ComponentTypeId>>(
161        &self,
162        id: ID,
163        component_ty: C,
164    ) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
165        let id = id.into();
166        let component_ty = component_ty.into();
167        let entity_instance = self
168            .client
169            .client
170            .post(self.client.url_reactive_graph())
171            .run_graphql(remove_component(id, component_ty))
172            .await
173            .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
174            .data
175            .map(|data| data.instances.entities.update)
176            .map(From::from);
177        Ok(entity_instance)
178    }
179
180    pub async fn create<TY: Into<EntityTypeId>, ID: Into<Uuid>>(
181        &self,
182        ty: TY,
183        id: Option<ID>,
184        description: Option<String>,
185        properties: PropertyInstances,
186    ) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
187        let ty = ty.into();
188        let id = id.map(|id| id.into());
189        let entity_instance = self
190            .client
191            .client
192            .post(self.client.url_reactive_graph())
193            .run_graphql(create(ty, id, description, properties))
194            .await
195            .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
196            .data
197            .map(|data| data.instances.entities.create)
198            .map(From::from);
199        Ok(entity_instance)
200    }
201
202    pub async fn delete_entity_instance<ID: Into<Uuid>>(&self, id: ID) -> Result<Option<bool>, ReactiveGraphClientExecutionError> {
203        let id = id.into();
204        let entity_instance = self
205            .client
206            .client
207            .post(self.client.url_reactive_graph())
208            .run_graphql(delete_entity_instance_mutation(id))
209            .await
210            .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
211            .data
212            .map(|data| data.instances.entities.delete);
213        Ok(entity_instance)
214    }
215}