reactive_graph_dynamic_graph_impl/object/relation/mutation/
trigger.rs

1use crate::object::types::DynamicGraphTypeDefinition;
2use async_graphql::dynamic::Field;
3use async_graphql::dynamic::FieldFuture;
4use async_graphql::dynamic::FieldValue;
5use async_graphql::dynamic::TypeRef;
6use reactive_graph_graph::ComponentTypeIdContainer;
7use reactive_graph_graph::PropertyInstanceSetter;
8use reactive_graph_graph::PropertyTypeDefinition;
9use reactive_graph_graph::RelationType;
10use reactive_graph_reactive_model_impl::ReactiveRelation;
11use reactive_graph_runtime_model::ActionProperties::TRIGGER;
12use reactive_graph_runtime_model::COMPONENT_ACTION;
13use serde_json::json;
14
15pub fn relation_trigger_field(relation_type: &RelationType) -> Option<Field> {
16    if !relation_type.is_a(&COMPONENT_ACTION) {
17        return None;
18    }
19    let dy_ty = DynamicGraphTypeDefinition::from(&relation_type.ty);
20    let trigger_field = Field::new(TRIGGER.property_name(), TypeRef::named_nn_list_nn(dy_ty.to_string()), move |ctx| {
21        FieldFuture::new(async move {
22            let relation_instances = ctx.parent_value.try_downcast_ref::<Vec<ReactiveRelation>>()?;
23            for relation_instance in relation_instances {
24                relation_instance.set(TRIGGER.property_name(), json!(true));
25            }
26            Ok(Some(FieldValue::list(
27                relation_instances
28                    .iter()
29                    .map(|relation_instance| FieldValue::owned_any(relation_instance.clone())),
30            )))
31        })
32    });
33    Some(trigger_field)
34}