hit_data/hit_mod/helpers/
can_create_object.rs1use 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
32pub 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
53pub 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}