hit_data/hit_mod/helpers/
can_create_object.rs

1use crate::Hit;
2use crate::HitError;
3use crate::HitKernel;
4use crate::Model;
5use std::collections::HashMap;
6use std::rc::Rc;
7
8fn get_allowed_fields(
9    kernel: Rc<HitKernel>,
10    model: &Model,
11    target_model_name: &str,
12) -> Result<Option<Vec<String>>, HitError> {
13    let mut allowed_fields = vec![];
14    let target_model = kernel.get_model(target_model_name)?;
15    let fields = target_model.get_fields();
16    for (_, field) in fields {
17        let borrowed_field = field.borrow();
18        if borrowed_field.accepts_model(&model) {
19            allowed_fields.push(borrowed_field.get_name());
20        }
21    }
22
23    if allowed_fields.len() > 0 {
24        Ok(Some(allowed_fields))
25    } else {
26        Ok(None)
27    }
28}
29
30pub type ObjectPermissions = HashMap<String, HashMap<String, Vec<String>>>;
31
32// Indexes all the models where a given model can be added (used for suggestions)
33pub fn get_all_permissions(kernel: Rc<HitKernel>) -> Result<ObjectPermissions, HitError> {
34    let mut output: ObjectPermissions = HashMap::new();
35    let list_of_models_clone = kernel.clone().get_models();
36
37    for model_name in kernel.clone().get_models() {
38        let model = kernel.clone().get_model(&model_name)?;
39        let mut allowed_models = HashMap::new();
40        for target_model_name in list_of_models_clone.clone() {
41            match get_allowed_fields(kernel.clone(), &model, &target_model_name)? {
42                Some(fields) => {
43                    allowed_models.insert(target_model_name, fields);
44                }
45                None => {}
46            }
47        }
48        output.insert(model_name.to_string(), allowed_models);
49    }
50    Ok(output)
51}
52
53// Get all destination models from an index, for a model type
54// TODO : use index by type when they are implemented
55pub fn get_all_targets(
56    model_name: &str,
57    index: &Hit,
58    permissions: &ObjectPermissions,
59) -> Result<Vec<String>, String> {
60    match permissions.get(model_name) {
61        Some(permissions) => {
62            let mut destination_ids = vec![];
63            let entries = &index.index;
64            for (id, _) in entries.iter() {
65                let target_model = index.get_model(id).ok_or("Model not found".to_string())?;
66                let target_model_name = target_model.get_name();
67                match permissions.get(target_model_name) {
68                    Some(_) => {
69                        destination_ids.push(id.to_string());
70                    }
71                    None => {}
72                }
73            }
74            Ok(destination_ids)
75        }
76        None => Ok(vec![]),
77    }
78}