diff --git a/src/merger/mod.rs b/src/merger/mod.rs index 867997e..917d3cc 100644 --- a/src/merger/mod.rs +++ b/src/merger/mod.rs @@ -129,6 +129,25 @@ impl Merger { crate::drop::Drop::success_with_val(stripped_val) } + fn inject_organization_id( + relative: &mut serde_json::Map, + entity_fields: &serde_json::Map, + schema: &Arc, + ) { + if !relative.contains_key("organization_id") { + if let Some(org_id) = entity_fields.get("organization_id") { + if let Some(compiled_props) = schema.obj.compiled_properties.get() { + if let Some(org_schema) = compiled_props.get("organization_id") { + if org_schema.obj.const_.is_some() { + return; + } + } + } + relative.insert("organization_id".to_string(), org_id.clone()); + } + } + } + pub(crate) fn merge_internal( &self, mut schema: Arc, @@ -313,11 +332,7 @@ impl Merger { let parent_is_source = edge.forward; if parent_is_source { - if !relative.contains_key("organization_id") { - if let Some(org_id) = entity_fields.get("organization_id") { - relative.insert("organization_id".to_string(), org_id.clone()); - } - } + Self::inject_organization_id(&mut relative, &entity_fields, &rel_schema); let mut merged_relative = match self.merge_internal( rel_schema.clone(), @@ -338,11 +353,7 @@ impl Merger { ); entity_response.insert(relation_name, Value::Object(merged_relative)); } else { - if !relative.contains_key("organization_id") { - if let Some(org_id) = entity_fields.get("organization_id") { - relative.insert("organization_id".to_string(), org_id.clone()); - } - } + Self::inject_organization_id(&mut relative, &entity_fields, &rel_schema); Self::apply_entity_relation( &mut relative, @@ -401,14 +412,21 @@ impl Merger { if let Some(compiled_edges) = schema.obj.compiled_edges.get() { if let Some(edge) = compiled_edges.get(&relation_name) { if let Some(relation) = self.db.relations.get(&edge.constraint) { + let mut item_schema = rel_schema.clone(); + if let Some(crate::database::object::SchemaTypeOrArray::Single(t)) = + &rel_schema.obj.type_ + { + if t == "array" { + if let Some(items_def) = &rel_schema.obj.items { + item_schema = items_def.clone(); + } + } + } + let mut relative_responses = Vec::new(); for relative_item_val in relative_arr { if let Value::Object(mut relative_item) = relative_item_val { - if !relative_item.contains_key("organization_id") { - if let Some(org_id) = entity_fields.get("organization_id") { - relative_item.insert("organization_id".to_string(), org_id.clone()); - } - } + Self::inject_organization_id(&mut relative_item, &entity_fields, &item_schema); Self::apply_entity_relation( &mut relative_item, @@ -417,19 +435,8 @@ impl Merger { &entity_fields, ); - let mut item_schema = rel_schema.clone(); - if let Some(crate::database::object::SchemaTypeOrArray::Single(t)) = - &rel_schema.obj.type_ - { - if t == "array" { - if let Some(items_def) = &rel_schema.obj.items { - item_schema = items_def.clone(); - } - } - } - let merged_relative = match self.merge_internal( - item_schema, + item_schema.clone(), Value::Object(relative_item), notifications, )? {