teo_runtime/model/object/
object.rs

1use std::borrow::Cow;
2use std::borrow::Cow::{Borrowed, Owned};
3use std::collections::{BTreeMap, BTreeSet, HashSet};
4use std::fmt::{Debug, Display, Formatter};
5use std::ops::Deref;
6use std::sync::{Arc, Mutex, MutexGuard};
7use std::sync::atomic::{AtomicBool, Ordering};
8use serde::{Serialize, Serializer};
9use crate::value::Value;
10use teo_result::{Error, Result, ResultExt};
11use tokio::sync::Mutex as TokioMutex;
12use crate::action::Action;
13use crate::connection::transaction;
14use crate::model::{Field, Model};
15use key_path::{path, KeyPath};
16use crate::traits::named::Named;
17use async_recursion::async_recursion;
18use futures_util::StreamExt;
19use indexmap::{IndexMap, indexmap};
20use itertools::Itertools;
21use crate::teon;
22use crate::action::action::*;
23use crate::model::object::input::Input;
24use crate::model::object::input::Input::{AtomicUpdater, SetValue};
25use crate::model::relation::Relation;
26use crate::{pipeline, request::Request};
27use crate::model::field::column_named::ColumnNamed;
28use crate::model::field::is_optional::IsOptional;
29use crate::model::field::typed::Typed;
30use crate::model::relation::delete::Delete;
31use crate::model::relation::update::Update;
32use crate::namespace::Namespace;
33use crate::optionality::Optionality;
34use crate::readwrite::write::Write;
35use crate::utils::ContainsStr;
36use crate::error_ext;
37
38#[derive(Clone)]
39pub struct Object {
40    pub inner: Arc<Inner>
41}
42
43impl Object {
44
45    pub fn new(request: Option<Request>, transaction_ctx: transaction::Ctx, model: &Model, action: Action) -> Object {
46        Object {
47            inner: Arc::new(Inner {
48                request,
49                transaction_ctx,
50                model: model.clone(),
51                action,
52                is_initialized: AtomicBool::new(false),
53                is_new: AtomicBool::new(true),
54                is_modified: AtomicBool::new(false),
55                is_partial: AtomicBool::new(false),
56                is_deleted: AtomicBool::new(false),
57                inside_before_save_callback: AtomicBool::new(false),
58                inside_after_save_callback: AtomicBool::new(false),
59                selected_fields: Arc::new(Mutex::new(Vec::new())),
60                modified_fields: Arc::new(Mutex::new(BTreeSet::new())),
61                previous_value_map: Arc::new(Mutex::new(BTreeMap::new())),
62                value_map: Arc::new(Mutex::new(BTreeMap::new())),
63                atomic_updater_map: Arc::new(Mutex::new(BTreeMap::new())),
64                relation_query_map: Arc::new(Mutex::new(BTreeMap::new())),
65                relation_mutation_map: Arc::new(TokioMutex::new(BTreeMap::new())),
66                cached_property_map: Arc::new(Mutex::new(BTreeMap::new())),
67                object_set_map: Arc::new(TokioMutex::new(BTreeMap::new())),
68                object_set_many_map: Arc::new(TokioMutex::new(BTreeMap::new())),
69                object_connect_map: Arc::new(TokioMutex::new(BTreeMap::new())),
70                object_disconnect_map: Arc::new(TokioMutex::new(BTreeMap::new())),
71                ignore_relation: Arc::new(Mutex::new(None)),
72            })
73        }
74    }
75
76    pub fn transaction_ctx(&self) -> transaction::Ctx {
77        self.inner.transaction_ctx.clone()
78    }
79
80    pub fn request(&self) -> Option<Request> {
81        self.inner.request.clone()
82    }
83
84    pub fn model(&self) -> &Model {
85        &self.inner.model
86    }
87
88    pub fn namespace(&self) -> &Namespace {
89        self.inner.transaction_ctx.namespace()
90    }
91
92    fn pipeline_ctx_for_path_and_value(&self, path: KeyPath, value: Value) -> pipeline::Ctx {
93        pipeline::Ctx::new(Value::from(value), self.clone(), path, self.action(), self.transaction_ctx(), self.request())
94    }
95
96    pub async fn set_teon(&self, value: &Value) -> Result<()> {
97        self.set_teon_with_path_and_user_mode(value, &path![], true).await?;
98        Ok(())
99    }
100
101    pub async fn update_teon(&self, value: &Value) -> Result<()> {
102        check_user_json_keys(value.as_dictionary().unwrap(), &self.model().cache().input_keys.iter().map(|k| k.as_str()).collect(), self.model())?;
103        for (key, value) in value.as_dictionary().unwrap() {
104            if let Some(field) = self.model().field(key) {
105                self.set_value(key, value.cast(Some(field.r#type()), self.namespace()))?;
106            } else if let Some(field) = self.model().property(key) {
107                self.set_property(key, value.cast(Some(field.r#type()), self.namespace())).await?;
108            }
109        }
110        self.inner.is_initialized.store(true, Ordering::SeqCst);
111        Ok(())
112    }
113
114    pub async fn set_teon_with_path(&self, json_value: &Value, path: &KeyPath) -> Result<()> {
115        self.set_teon_with_path_and_user_mode(json_value, path, false).await
116    }
117
118    pub async fn set_teon_with_path_and_user_mode(&self, value: &Value, path: &KeyPath, bypass_permission_check: bool) -> Result<()> {
119        let model = self.model();
120        // permission
121        if !self.is_new() {
122            if !bypass_permission_check {
123                self.check_model_write_permission(path).await?;
124            }
125        }
126        // get value map
127        let value_map = value.as_dictionary().unwrap();
128        let value_map_keys: Vec<&str> = value_map.keys().map(|k| k.as_str()).collect();
129        // check keys
130        if bypass_permission_check {
131            check_user_json_keys(value_map, &model.cache().input_keys.iter().map(|k| k.as_str()).collect(), model)?;
132        }
133        // find keys to iterate
134        let initialized = self.inner.is_initialized.load(Ordering::SeqCst);
135        let keys = if initialized {
136            self.model().cache().all_keys.iter().filter(|k| value_map_keys.contains(&k.as_str())).map(|k| k.as_str()).collect::<Vec<&str>>()
137        } else {
138            self.model().cache().all_keys.iter().map(|k| k.as_str()).collect()
139        };
140        // assign values
141        for key in keys {
142            let path = path + key;
143            if let Some(field) = self.model().field(key) {
144                let need_to_trigger_default_value = if initialized { false } else {
145                    !value_map_keys.contains(&key)
146                };
147                if need_to_trigger_default_value {
148                    // apply default values
149                    if let Some(default) = field.default() {
150                        if let Some(pipeline) = default.as_pipeline() {
151                            let ctx = self.pipeline_ctx_for_path_and_value(path.clone(), Value::Null);
152                            let value: Value = ctx.run_pipeline(pipeline).await?;
153                            self.set_value_to_value_map(key, value);
154                        } else {
155                            self.set_value_to_value_map(key, default.clone());
156                        }
157                    }
158                } else {
159                    if !bypass_permission_check {
160                        self.check_field_write_permission(field, &path).await?;
161                    }
162                    // set_value_to_value_map
163                    let value = value_map.get(key).unwrap();
164                    match Input::decode_field(value) {
165                        AtomicUpdater(updator) => self.set_value_to_atomic_updator_map(key, updator),
166                        SetValue(value) => {
167                            // on set pipeline
168                            let ctx = self.pipeline_ctx_for_path_and_value(path.clone(), value.cast(Some(field.r#type()), self.namespace()));
169                            let value: Value = ctx.run_pipeline(field.on_set()).await?;
170                            self.check_write_rule(key, &value, &path).await?;
171                            self.set_value_to_value_map(key, value.clone());
172                        }
173                    }
174                }
175            } else if let Some(_) = self.model().relation(key) {
176                let manipulation = match value_map.get(&key.to_string()) {
177                    Some(value) => value,
178                    None => continue,
179                };
180                self.set_value_to_relation_manipulation_map(key, manipulation).await;
181            } else if let Some(property) = self.model().property(key) {
182                if value_map_keys.contains(&key) {
183                    if let Some(setter) = property.setter() {
184                        let value = value_map.get(&key.to_string()).unwrap();
185                        let input_result = Input::decode_field(value);
186                        let value = match input_result {
187                            SetValue(v) => v,
188                            _ => return Err(error_ext::unexpected_input(path + key)),
189                        };
190                        let ctx = self.pipeline_ctx_for_path_and_value(path.clone(), value.cast(Some(property.r#type()), self.namespace()));
191                        let _: Object = ctx.run_pipeline(setter).await?;
192                    }
193                }
194            }
195        };
196        // permission
197        if self.is_new() {
198            if !bypass_permission_check {
199                self.check_model_write_permission(path).await?;
200            }
201        }
202        // set flag
203        self.inner.is_initialized.store(true, Ordering::SeqCst);
204        Ok(())
205    }
206
207    pub fn copied_value(&self) -> Value {
208        let mut map = indexmap! {};
209        for (k, v) in self.inner.value_map.lock().unwrap().iter() {
210            let field = self.model().field(k).unwrap();
211            if field.copy() {
212                map.insert(k.to_owned(), v.clone());
213            }
214        }
215        Value::Dictionary(map)
216    }
217
218    async fn check_model_write_permission<'a>(&self, path: impl AsRef<KeyPath>) -> Result<()> {
219        let ctx = self.pipeline_ctx_for_path_and_value(path.as_ref().clone(), Value::Null);
220        ctx.run_pipeline_ignore_return_value(self.model().can_mutate()).await.alter_error_code(401)?;
221        Ok(())
222    }
223
224    async fn check_model_read_permission<'a>(&self, path: impl AsRef<KeyPath>) -> Result<()> {
225        let ctx = self.pipeline_ctx_for_path_and_value(path.as_ref().clone(), Value::Null);
226        ctx.run_pipeline_ignore_return_value(self.model().can_read()).await.alter_error_code(401)?;
227        Ok(())
228    }
229
230    async fn check_field_write_permission<'a>(&self, field: &Field, path: impl AsRef<KeyPath>) -> Result<()> {
231        let ctx = self.pipeline_ctx_for_path_and_value(path.as_ref().clone(), Value::Null);
232        ctx.run_pipeline_ignore_return_value(field.can_mutate()).await.alter_error_code(401)?;
233        Ok(())
234    }
235
236    async fn check_field_read_permission<'a>(&self, field: &Field, path: impl AsRef<KeyPath>) -> Result<()> {
237        let ctx = self.pipeline_ctx_for_path_and_value(path.as_ref().clone(), Value::Null);
238        ctx.run_pipeline_ignore_return_value(field.can_read()).await.alter_error_code(401)?;
239        Ok(())
240    }
241
242    fn record_previous_value_for_field_if_needed(&self, key: &str) {
243        let field = self.model().field(key).unwrap();
244        if !self.is_new() {
245            if self.inner.previous_value_map.lock().unwrap().get(field.name()).is_none() {
246                self.inner.previous_value_map.lock().unwrap().insert(field.name().to_string(), self.get_value(field.name()).unwrap());
247            }
248        }
249    }
250
251    async fn check_write_rule(&self, key: impl AsRef<str>, value: &Value, path: &KeyPath) -> Result<()> {
252        let field = self.model().field(key.as_ref()).unwrap();
253        let is_new = self.is_new();
254        let valid = match field.write() {
255            Write::NoWrite => false,
256            Write::Write => true,
257            Write::WriteOnCreate => is_new,
258            Write::WriteOnce => if is_new { true } else { self.get_value(key.as_ref()).unwrap().is_null() },
259            Write::WriteNonNull => if is_new { true } else { !value.is_null() },
260            Write::WriteIf(pipeline) => {
261                let ctx = self.pipeline_ctx_for_path_and_value(path + key.as_ref(), value.clone());
262                ctx.run_pipeline_ignore_return_value(pipeline).await.is_ok()
263            }
264        };
265        if !valid {
266            Err(Error::invalid_request_pathed(path + key.as_ref(), "unexpected key"))
267        } else {
268            Ok(())
269        }
270    }
271
272    fn set_modified_field(&self, key: &str) {
273        if !self.is_new() {
274            self.inner.is_modified.store(true, Ordering::SeqCst);
275            self.inner.modified_fields.lock().unwrap().insert(key.to_string());
276        }
277    }
278
279    fn set_value_to_atomic_updator_map(&self, key: &str, value: Value) {
280        self.inner.atomic_updater_map.lock().unwrap().insert(key.to_string(), value);
281        self.set_modified_field(key);
282    }
283
284    async fn set_value_to_relation_manipulation_map(&self, key: &str, value: &Value) {
285        self.inner.relation_mutation_map.lock().await.insert(key.to_string(), value.clone());
286        self.set_modified_field(key);
287    }
288
289    pub fn set(&self, key: impl AsRef<str>, value: impl Into<Value>) -> Result<()> {
290        self.set_value(key, value.into())
291    }
292
293    pub fn set_value(&self, key: impl AsRef<str>, value: Value) -> Result<()> {
294        let model_keys = &self.model().cache().save_keys_and_virtual_keys;
295        if !model_keys.contains_str(key.as_ref()) {
296            return Err(Error::new(format!("invalid key {}", key.as_ref())));
297        }
298        let target = self.model().field(key.as_ref()).map(|f| f.r#type());
299        self.set_value_to_value_map(key.as_ref(), value.cast(target, self.namespace()));
300        Ok(())
301    }
302
303    pub async fn set_property(&self, key: &str, value: impl Into<Value>) -> Result<()> {
304        let property = self.model().property(key).unwrap();
305        let setter = property.setter().unwrap();
306        let value: Value = value.into();
307        let ctx = self.pipeline_ctx_for_path_and_value(path![key], value.cast(Some(property.r#type()), self.namespace()));
308        ctx.run_pipeline_ignore_return_value(setter).await?;
309        Ok(())
310    }
311
312    pub fn set_from_database_result_value(&self, value: &Value, select: Option<&Value>, include: Option<&Value>) {
313        let model = self.model();
314        for (k, v) in value.as_dictionary().unwrap() {
315            if let Some(_) = model.field(k) {
316                self.set_value_to_value_map(k, v.clone());
317            } else if let Some(relation) = model.relation(k) {
318                self.inner.relation_query_map.lock().unwrap().insert(k.to_owned(), vec![]);
319                let include_arg = include.unwrap().get(k).unwrap();
320                let inner_select = include_arg.as_dictionary().map(|m| m.get("select")).flatten();
321                let inner_include = include_arg.as_dictionary().map(|m| m.get("include")).flatten();
322                for v in v.as_array().unwrap() {
323                    let action = FIND | (if relation.is_vec() { MANY } else { SINGLE }) | NESTED ;
324                    let object = self.transaction_ctx().new_object(self.namespace().model_at_path(&relation.model_path()).unwrap(), action, self.request()).unwrap();
325                    object.set_from_database_result_value(v, inner_select, inner_include);
326                    self.inner.relation_query_map.lock().unwrap().get_mut(k).unwrap().push(object);
327                }
328            } else if let Some(_property) = model.property(k) {
329                self.inner.cached_property_map.lock().unwrap().insert(k.to_owned(), v.clone());
330            }
331        }
332        self.set_select(select).unwrap();
333        self.inner.is_new.store(false, Ordering::SeqCst);
334        self.inner.is_modified.store(false, Ordering::SeqCst);
335    }
336
337    fn set_value_to_value_map(&self, key: &str, value: Value) {
338        let value_current = self.get_value(key).unwrap();
339        if value_current == value {
340            return
341        }
342        // record previous value if needed
343        self.record_previous_value_for_field_if_needed(key);
344
345        if value.is_null() {
346            self.inner.value_map.lock().unwrap().remove(key);
347        } else {
348            self.inner.value_map.lock().unwrap().insert(key.to_string(), value);
349        }
350        if !self.is_new() {
351            self.inner.is_modified.store(true, Ordering::SeqCst);
352            self.inner.modified_fields.lock().unwrap().insert(key.to_string());
353            if let Some(properties) = self.model().cache().field_property_map.get(key) {
354                for property in properties {
355                    self.inner.modified_fields.lock().unwrap().insert(property.to_string());
356                    self.inner.cached_property_map.lock().unwrap().remove(&property.to_string());
357                }
358            }
359        }
360    }
361
362    pub fn get_query_relation_object(&self, key: impl AsRef<str>, path: &KeyPath) -> Result<Option<Object>> {
363        let key = key.as_ref();
364        let model_keys = &self.model().cache().all_keys;
365        if !model_keys.contains_str(&key) {
366            Err(error_ext::invalid_key_on_model(path.clone(), key, self.model()))?;
367        }
368        match self.inner.relation_query_map.lock().unwrap().get(key) {
369            Some(list) => Ok(list.get(0).cloned()),
370            None => Ok(None)
371        }
372    }
373
374    pub fn get_mutation_relation_object(&self, key: impl AsRef<str>) -> Result<Option<Object>> {
375        let key = key.as_ref();
376        let model_keys = &self.model().cache().all_keys;
377        if !model_keys.contains_str(&key) {
378            Err(error_ext::invalid_key_on_model(Default::default(), key, self.model()))?;
379        }
380        match self.inner.relation_query_map.lock().unwrap().get(key) {
381            Some(list) => Ok(list.get(0).cloned()),
382            None => Ok(None)
383        }
384    }
385
386    pub fn has_query_relation_fetched(&self, key: impl AsRef<str>) -> bool {
387        self.inner.relation_query_map.lock().unwrap().contains_key(key.as_ref())
388    }
389
390    pub fn has_mutation_relation_fetched(&self, key: impl AsRef<str>) -> bool {
391        self.inner.relation_query_map.lock().unwrap().contains_key(key.as_ref())
392    }
393
394    pub fn get_relation_vec(&self, key: impl AsRef<str>) -> Result<Vec<Object>> {
395        let key = key.as_ref();
396        let model_keys = &self.model().cache().all_keys;
397        if !model_keys.contains_str(key) {
398            return Err(error_ext::invalid_key_on_model(Default::default(), key, self.model()))?;
399        }
400        match self.inner.relation_query_map.lock().unwrap().get(key) {
401            Some(list) => Ok(list.clone()),
402            None => Ok(vec![]),
403        }
404    }
405
406    pub async fn get_property<T, E>(&self, key: &str) -> Result<T> where T: TryFrom<Value, Error = E>, Error: From<E> {
407        Ok(self.get_property_value(key).await?.try_into()?)
408    }
409
410    pub async fn get_property_value(&self, key: &str) -> Result<Value> {
411        let property = self.model().property(key.as_ref()).unwrap();
412        if property.cached() {
413            if let Some(value) = self.inner.cached_property_map.lock().unwrap().get(key) {
414                return Ok(value.clone());
415            }
416        }
417        let getter = property.getter().unwrap();
418        let ctx = self.pipeline_ctx_for_path_and_value(path![key], Value::Null);
419        let value: Value = ctx.run_pipeline(getter).await?;
420        if property.cached() {
421            self.inner.cached_property_map.lock().unwrap().insert(key.to_string(), value.clone());
422        }
423        Ok(value)
424    }
425
426    pub fn get<T, E>(&self, key: impl AsRef<str>) -> Result<T> where T: TryFrom<Value, Error = E>, Error: From<E> {
427        Ok(self.get_value(key)?.try_into()?)
428    }
429
430    pub fn get_previous_value(&self, key: impl AsRef<str>) -> Result<Value> {
431        let key = key.as_ref();
432        let model_keys = &self.model().cache().all_keys;
433        if !model_keys.contains_str(key) {
434            let model = self.model();
435            Err(error_ext::invalid_key_on_model(Default::default(), key, model))?;
436        }
437        let map = self.inner.previous_value_map.lock().unwrap();
438        match map.get(key) {
439            Some(value) => Ok(value.clone()),
440            None => Ok(Value::Null),
441        }
442    }
443
444    pub fn get_previous_value_or_current_value(&self, key: impl AsRef<str>) -> Result<Value> {
445        match self.get_previous_value(key.as_ref()) {
446            Ok(v) => Ok(v),
447            Err(_) => {
448                self.get_value(key.as_ref())
449            }
450        }
451    }
452
453    fn get_value_map_value(&self, key: &str) -> Value {
454        match self.inner.value_map.lock().unwrap().get(key) {
455            Some(value) => value.clone(),
456            None => Value::Null,
457        }
458    }
459
460    pub fn get_value(&self, key: impl AsRef<str>) -> Result<Value> {
461        let model_keys = &self.model().cache().all_keys;
462        if !model_keys.contains_str(key.as_ref()) {
463            Err(error_ext::invalid_key_on_model(KeyPath::default(), key.as_ref(), self.model()))?;
464        }
465        Ok(self.get_value_map_value(key.as_ref()))
466    }
467
468    pub fn get_atomic_updator(&self, key: &str) -> Option<Value> {
469        self.inner.atomic_updater_map.lock().unwrap().get(key).cloned()
470    }
471
472    pub fn atomic_updators(&self) -> MutexGuard<BTreeMap<String, Value>> {
473        self.inner.atomic_updater_map.lock().unwrap()
474    }
475
476    pub fn set_select(&self, select: Option<&Value>) -> Result<()> {
477        if select.is_none() {
478            return Ok(());
479        }
480        let mut true_list: Vec<&str> = vec![];
481        let mut false_list: Vec<&str> = vec![];
482        let map = select.unwrap().as_dictionary().unwrap();
483        for (key, value) in map {
484            let bool_value = value.as_bool().unwrap();
485            if bool_value {
486                true_list.push(key.as_str());
487            } else {
488                false_list.push(key.as_str());
489            }
490        }
491        let true_empty = true_list.is_empty();
492        let false_empty = false_list.is_empty();
493        if true_empty && false_empty {
494            // just do nothing
495            return Ok(());
496        } else if !false_empty {
497            // all - false
498            let mut result: Vec<String> = vec![];
499            self.model().cache().all_keys.iter().for_each(|k| {
500                if let Some(field) = self.model().field(k) {
501                    if !false_list.contains(&&***&k) {
502                        result.push(field.name().to_string());
503                    }
504                } else if let Some(property) = self.model().property(k) {
505                    if !false_list.contains(&&***&k) {
506                        result.push(property.name().to_string());
507                    }
508                }
509            });
510            *self.inner.selected_fields.lock().unwrap() = result;
511            return Ok(());
512        } else {
513            // true
514            let mut result: Vec<String> = vec![];
515            self.model().cache().all_keys.iter().for_each(|k| {
516                if let Some(field) = self.model().field(k) {
517                    if true_list.contains(&k.as_str()) {
518                        result.push(field.name().to_string());
519                    }
520                } else if let Some(property) = self.model().property(k) {
521                    if true_list.contains(&k.as_str()) {
522                        result.push(property.name().to_string());
523                    }
524                }
525            });
526            *self.inner.selected_fields.lock().unwrap() = result;
527            return Ok(());
528        }
529    }
530
531    #[async_recursion]
532    pub async fn apply_on_save_pipeline_and_validate_required_fields(&self, path: &KeyPath, ignore_required_relation: bool) -> Result<()> {
533        // apply on save pipeline first
534        let model_keys = &self.model().cache().save_keys;
535        for key in model_keys {
536            let field = self.model().field(key);
537            if field.is_none() {
538                continue;
539            }
540            let field = field.unwrap();
541            if !field.on_save().is_empty() {
542                let initial_value = match self.inner.value_map.lock().unwrap().deref().get(&key.to_string()) {
543                    Some(value) => {
544                        value.clone()
545                    }
546                    None => {
547                        Value::Null
548                    }
549                };
550                let ctx = self.pipeline_ctx_for_path_and_value(path + field.name(), initial_value);
551                let value: Value = ctx.run_pipeline(field.on_save()).await?;
552                self.inner.value_map.lock().unwrap().insert(key.to_string(), value);
553                self.set_modified_field(key);
554            }
555        }
556        // validate required fields
557        for key in model_keys {
558            if let Some(field) = self.model().field(key) {
559                if field.auto() || field.auto_increment() || field.foreign_key() {
560                    continue
561                }
562                match field.optionality() {
563                    Optionality::Optional => (),
564                    Optionality::Required => {
565                        let value = self.get_value(key).unwrap();
566                        if value.is_null() {
567                            return Err(error_ext::missing_required_input(path + key.as_str()));
568                        }
569                    }
570                    Optionality::PresentWith(field_names) => {
571                        let value = self.get_value(key).unwrap();
572                        if value.is_null() {
573                            for name in field_names {
574                                let name = name.as_str();
575                                let value_at_name = self.get_value(name).unwrap();
576                                if !value_at_name.is_null() {
577                                    return Err(error_ext::missing_required_input_with_type(path.clone(), key))
578                                }
579                            }
580                        }
581                    }
582                    Optionality::PresentWithout(field_names) => {
583                        let value = self.get_value(key).unwrap();
584                        if value.is_null() {
585                            for name in field_names {
586                                let name = name.as_str();
587                                let value_at_name = self.get_value(name).unwrap();
588                                if !value_at_name.is_null() {
589                                    break;
590                                }
591                                return Err(error_ext::missing_required_input_with_type(path.clone(), key));
592                            }
593                        }
594                    }
595                    Optionality::PresentIf(pipeline) => {
596                        let value = self.get_value(key).unwrap();
597                        if value.is_null() {
598                            let ctx = self.pipeline_ctx_for_path_and_value(path + field.name(), Value::Null);
599                            let invalid = ctx.run_pipeline_ignore_return_value(pipeline).await.is_err();
600                            if invalid {
601                                return Err(error_ext::missing_required_input(path + field.name()));
602                            }
603                        }
604                    }
605                }
606            }
607        }
608        // validate required relations
609        for key in &self.model().cache().relation_output_keys {
610            if let Some(relation) = self.model().relation(key) {
611                if let Some(ignore) = self.inner.ignore_relation.lock().unwrap().as_ref() {
612                    if ignore.as_str() == relation.name() {
613                        continue
614                    }
615                }
616                if self.is_new() && relation.is_required() && !relation.is_vec() {
617                    if ignore_required_relation {
618                        continue
619                    }
620                    // check whether foreign key is received or a value is provided
621                    let map = self.inner.relation_mutation_map.lock().await;
622                    if map.get(&key.to_string()).is_some() {
623                        continue
624                    }
625                    for field_name in relation.fields() {
626                        if self.get_value(field_name).unwrap().is_null() {
627                            return Err(error_ext::missing_required_input(path + key.as_str()));
628                        }
629                    }
630                    continue
631                }
632            }
633        }
634        Ok(())
635    }
636
637    pub fn clear_new_state(&self) {
638        let is_new = self.is_new();
639        self.inner.is_new.store(false, Ordering::SeqCst);
640        self.inner.is_modified.store(false, Ordering::SeqCst);
641        // todo: set self as identity when identity
642    }
643
644    pub fn clear_state(&self) {
645        self.inner.is_new.store(false, Ordering::SeqCst);
646        self.inner.is_modified.store(false, Ordering::SeqCst);
647        *self.inner.modified_fields.lock().unwrap() = BTreeSet::new();
648    }
649
650    #[async_recursion]
651    pub async fn delete_from_database(&self, path: &KeyPath) -> Result<()> {
652        let model = self.model();
653        let namespace = self.namespace();
654        // check deny first
655        for (opposite_model, opposite_relation) in namespace.model_opposite_relations(model) {
656            if opposite_relation.delete() == Delete::Deny {
657                let finder = self.intrinsic_where_unique_for_opposite_relation(opposite_relation);
658                let count = self.transaction_ctx().count_objects(opposite_model, &finder, path.clone()).await.unwrap();
659                if count > 0 {
660                    return Err(error_ext::deletion_denied(path.clone(), &format!("{}.{}", opposite_model.path().join("."), opposite_relation.name())));
661                }
662            }
663        }
664        // real delete
665        self.transaction_ctx().transaction_for_model(self.model()).await.delete_object(self, path.clone()).await?;
666        // nullify and cascade
667        for (opposite_model, opposite_relation) in namespace.model_opposite_relations(model) {
668            match opposite_relation.delete() {
669                Delete::NoAction => {} // do nothing
670                Delete::Deny => {}, // done before
671                Delete::Nullify => {
672                    let finder = self.intrinsic_where_unique_for_opposite_relation(opposite_relation);
673                    self.transaction_ctx().batch(opposite_model, &finder, CODE_NAME | DISCONNECT | SINGLE, self.request(), path.clone(), |object| async move {
674                        for key in opposite_relation.fields() {
675                            object.set_value(key, Value::Null)?;
676                        }
677                        object.save_with_session_and_path( &path![]).await?;
678                        Ok(())
679                    }).await?;
680                },
681                Delete::Cascade => {
682                    let finder = self.intrinsic_where_unique_for_opposite_relation(opposite_relation);
683                    self.transaction_ctx().batch(opposite_model, &finder, CODE_NAME | DELETE | SINGLE, self.request(), path.clone(), |object| async move {
684                        object.delete_from_database(path).await?;
685                        Ok(())
686                    }).await?;
687                }
688                Delete::Default => {
689                    let finder = self.intrinsic_where_unique_for_opposite_relation(opposite_relation);
690                    self.transaction_ctx().batch(opposite_model, &finder, CODE_NAME | DISCONNECT | SINGLE, self.request(), path.clone(), |object| async move {
691                        for key in opposite_relation.fields() {
692                            let field = opposite_model.field(key).unwrap();
693                            if let Some(default) = field.default() {
694                                if let Some(pipeline) = default.as_pipeline() {
695                                    let pipeline_ctx = pipeline::Ctx::new(Value::Null.into(), object.clone(), path![], CODE_NAME | DISCONNECT | SINGLE, self.transaction_ctx(), self.request());
696                                    let value: Value = pipeline_ctx.run_pipeline(pipeline).await?;
697                                    object.set_value(key, value.clone())?;
698
699                                } else {
700                                    object.set_value(key, default.clone())?;
701                                }
702                            } else {
703                                Err(Error::new(format!("default value is not defined: {}.{}", opposite_model.path().join("."), key)))?;
704                            }
705                        }
706                        object.save_with_session_and_path(&path![]).await?;
707                        Ok(())
708                    }).await?;
709                }
710            }
711        }
712        Ok(())
713    }
714
715    #[async_recursion]
716    async fn save_to_database(&self, path: &KeyPath) -> Result<()> {
717        if !self.is_new() && self.is_modified() {
718            let modified_fields = self.inner.modified_fields.lock().unwrap().clone();
719            let namespace = self.namespace();
720            let model = self.model();
721            // check deny first
722            for (opposite_model, opposite_relation) in namespace.model_opposite_relations(model) {
723                if opposite_relation.update() == Update::Deny {
724                    let mut contains = false;
725                    for f_name in modified_fields.iter() {
726                        if opposite_relation.references().contains(f_name) {
727                            contains = true;
728                        }
729                    }
730                    if contains {
731                        let finder = self.intrinsic_where_unique_for_opposite_relation_with_prev_value(opposite_relation);
732                        let count = self.transaction_ctx().count_objects(opposite_model, &finder, path.clone()).await.unwrap();
733                        if count > 0 {
734                            return Err(error_ext::updation_denied(path.clone(), &format!("{}.{}", opposite_model.path().join("."), opposite_relation.name())));
735                        }
736                    }
737                }
738            }
739            // nullify and cascade
740            for (opposite_model, opposite_relation) in namespace.model_opposite_relations(model) {
741                let mut contains = false;
742                let mut relation_modified_fields = vec![];
743                for f_name in modified_fields.iter() {
744                    if opposite_relation.references().contains(f_name) {
745                        relation_modified_fields.push(f_name.as_str());
746                        contains = true;
747                    }
748                }
749                if contains && !self.every_field_is_null_previously(relation_modified_fields)? {
750                    match opposite_relation.update() {
751                        Update::NoAction => {} // do nothing
752                        Update::Deny => {}, // done before
753                        Update::Nullify => {
754                            if opposite_relation.has_foreign_key() {
755                                let finder = self.intrinsic_where_unique_for_opposite_relation_with_prev_value(opposite_relation);
756                                self.transaction_ctx().batch(opposite_model, &finder, CODE_NAME | DISCONNECT | SINGLE, self.request(), path.clone(), |object| async move {
757                                    for key in opposite_relation.fields() {
758                                        object.set_value(key, Value::Null)?;
759                                    }
760                                    object.save_with_session_and_path( &path![]).await?;
761                                    Ok(())
762                                }).await?;
763                            }
764                        },
765                        Update::Update => {
766                            let finder = self.intrinsic_where_unique_for_opposite_relation_with_prev_value(opposite_relation);
767                            self.transaction_ctx().batch(opposite_model, &finder, CODE_NAME | DISCONNECT | SINGLE, self.request(), path.clone(), |object| async move {
768                                for (local, foreign) in opposite_relation.iter() {
769                                    let current = self.get_value(foreign)?;
770                                    if object.get_value(local)? != current {
771                                        object.set_value(local, current)?;
772                                    }
773                                }
774                                object.save_with_session_and_path( &path![]).await?;
775                                Ok(())
776                            }).await?;
777                        }
778                        Update::Delete => {
779                            let finder = self.intrinsic_where_unique_for_opposite_relation_with_prev_value(opposite_relation);
780                            self.transaction_ctx().batch(opposite_model, &finder, CODE_NAME | DELETE | SINGLE, self.request(), path.clone(), |object| async move {
781                                object.delete_from_database(path).await?;
782                                Ok(())
783                            }).await?;
784                        }
785                        Update::Default => {
786                            let finder = self.intrinsic_where_unique_for_opposite_relation_with_prev_value(opposite_relation);
787                            self.transaction_ctx().batch(opposite_model, &finder, CODE_NAME | DISCONNECT | SINGLE, self.request(), path.clone(), |object| async move {
788                                for key in opposite_relation.fields() {
789                                    let field = opposite_model.field(key).unwrap();
790                                    if let Some(default) = field.default() {
791                                        if let Some(pipeline) = default.as_pipeline() {
792                                            let pipeline_ctx = pipeline::Ctx::new(Value::Null.into(), object.clone(), path![], CODE_NAME | DISCONNECT | SINGLE, self.transaction_ctx(), self.request());
793                                            let value: Value = pipeline_ctx.run_pipeline(pipeline).await?;
794                                            object.set_value(key, value)?;
795                                        } else {
796                                            object.set_value(key, default.clone())?;
797                                        }
798                                    } else {
799                                        Err(Error::new(format!("default value is not defined: {}.{}", opposite_model.path().join("."), key)))?;
800                                    }
801                                }
802                                object.save_with_session_and_path(&path![]).await?;
803                                Ok(())
804                            }).await?;
805                        }
806                    }
807                }
808            }
809        }
810        self.transaction_ctx().transaction_for_model(self.model()).await.save_object(self, path.clone()).await?;
811        self.clear_new_state();
812        Ok(())
813    }
814
815    fn before_save_callback_check(&self, path: &KeyPath) -> Result<()> {
816        let inside_before_callback = self.inner.inside_before_save_callback.load(Ordering::SeqCst);
817        if inside_before_callback {
818            return Err(error_ext::invalid_operation(path.clone(), "save called inside before callback"));
819        }
820        Ok(())
821    }
822
823    pub async fn save_with_session_and_path(&self, path: &KeyPath) -> Result<()> {
824        self.save_with_session_and_path_and_ignore(path, false).await
825    }
826
827    #[async_recursion]
828    pub async fn save_with_session_and_path_and_ignore(&self, path: &KeyPath, ignore_required_relation: bool) -> Result<()> {
829        // check if it's inside before callback
830        self.before_save_callback_check(path)?;
831        let is_new = self.is_new();
832        // validate and save
833        let is_modified = self.is_modified();
834        if is_modified || is_new {
835            // apply pipeline
836            self.apply_on_save_pipeline_and_validate_required_fields(path, ignore_required_relation).await?;
837            self.trigger_before_save_callbacks(path).await?;
838            // perform relation manipulations (has foreign key)
839            self.perform_relation_manipulations(|r| r.has_foreign_key(), path, is_new, is_modified).await?;
840            self.save_to_database(path).await?;
841        } else {
842            // perform relation manipulations (has foreign key)
843            self.perform_relation_manipulations(|r| r.has_foreign_key(), path, is_new, is_modified).await?;
844        }
845        // perform relation manipulations (doesn't have foreign key)
846        self.perform_relation_manipulations(|r| !r.has_foreign_key(), path, is_new, is_modified).await?;
847        // clear properties
848        self.clear_state();
849        if is_modified || is_new {
850            self.trigger_after_save_callbacks(path).await?;
851        }
852        Ok(())
853    }
854
855    pub async fn save(&self) -> Result<()> {
856        self.save_with_session_and_path(&path![]).await?;
857        Ok(())
858    }
859
860    pub async fn save_for_seed_without_required_relation(&self) -> Result<()> {
861        self.save_with_session_and_path_and_ignore(&path![], true).await
862    }
863
864    async fn trigger_before_delete_callbacks<'a>(&self, path: impl AsRef<KeyPath>) -> Result<()> {
865        let ctx = self.pipeline_ctx_for_path_and_value(path.as_ref().clone(), Value::Null);
866        ctx.run_pipeline_ignore_return_value(self.model().before_delete()).await?;
867        Ok(())
868    }
869
870    async fn trigger_after_delete_callbacks<'a>(&self, path: impl AsRef<KeyPath>) -> Result<()> {
871        let ctx = self.pipeline_ctx_for_path_and_value(path.as_ref().clone(), Value::Null);
872        ctx.run_pipeline_ignore_return_value(self.model().after_delete()).await?;
873        Ok(())
874    }
875
876    async fn trigger_before_save_callbacks<'a>(&self, path: impl AsRef<KeyPath>) -> Result<()> {
877        let ctx = self.pipeline_ctx_for_path_and_value(path.as_ref().clone(), Value::Null);
878        ctx.run_pipeline_ignore_return_value(self.model().before_save()).await?;
879        Ok(())
880    }
881
882    async fn trigger_after_save_callbacks<'a>(&self, path: impl AsRef<KeyPath>) -> Result<()> {
883        let inside_after_save_callback = self.inner.inside_after_save_callback.load(Ordering::SeqCst);
884        if inside_after_save_callback {
885            return Ok(());
886        }
887        self.inner.inside_after_save_callback.store(true, Ordering::SeqCst);
888        let ctx = self.pipeline_ctx_for_path_and_value(path.as_ref().clone(), Value::Null);
889        ctx.run_pipeline_ignore_return_value(self.model().after_save()).await?;
890        self.inner.inside_after_save_callback.store(false, Ordering::SeqCst);
891        Ok(())
892    }
893
894    pub async fn delete(&self) -> Result<()> {
895        self.trigger_before_delete_callbacks(path![]).await?;
896        self.delete_from_database(&path![]).await?;
897        Ok(())
898    }
899
900    pub async fn delete_internal<'a>(&self, path: impl AsRef<KeyPath>) -> Result<()> {
901        self.check_model_write_permission(path.as_ref()).await?;
902        self.trigger_before_delete_callbacks(path.as_ref()).await?;
903        self.delete_from_database(path.as_ref()).await?;
904        self.trigger_after_delete_callbacks(path.as_ref()).await
905    }
906
907    pub async fn to_teon(&self) -> Result<Value> {
908        self.to_teon_internal(&path![]).await
909    }
910
911    #[async_recursion]
912    pub async fn to_teon_internal<'a>(&self, path: &KeyPath) -> Result<Value> {
913        // check read permission
914        self.check_model_read_permission(path.as_ref()).await?;
915        // output
916        let select_list = self.inner.selected_fields.lock().unwrap().clone();
917        let select_filter = if select_list.is_empty() { false } else { true };
918        let mut map: IndexMap<String, Value> = IndexMap::new();
919        let keys = &self.model().cache().output_keys;
920        for key in keys {
921            if let Some(relation) = self.model().relation(key) {
922                if self.has_query_relation_fetched(relation.name()) {
923                    if !relation.is_vec() {
924                        let o = self.get_query_relation_object(key, &(path + key)).unwrap();
925                        match o {
926                            Some(o) => {
927                                map.insert(key.to_string(), o.to_teon_internal(&(path.as_ref() + relation.name())).await.unwrap());
928                            },
929                            None => ()
930                        };
931                    } else {
932                        let mut result_vec = vec![];
933                        let vec = self.get_relation_vec(key).unwrap();
934                        for (index, o) in vec.iter().enumerate() {
935                            result_vec.push(o.to_teon_internal(&(path.as_ref() + relation.name() + index)).await?);
936                        }
937                        map.insert(key.to_string(), Value::Array(result_vec));
938                    }
939                }
940            } else if (!select_filter) || (select_filter && select_list.contains(&key.to_string())) {
941                if let Some(field) = self.model().field(key) {
942                    let value = self.get_value(key).unwrap();
943                    if self.check_field_read_permission(field, path.as_ref()).await.is_err() {
944                        continue
945                    }
946                    let ctx = self.pipeline_ctx_for_path_and_value(path![key], value);
947                    let value: Value = ctx.run_pipeline(field.on_output()).await?;
948                    if !value.is_null() {
949                        map.insert(key.to_string(), value);
950                    }
951                } else if let Some(property) = self.model().property(key) {
952                    if property.cached() && self.inner.cached_property_map.lock().unwrap().contains_key(&key.to_string()) {
953                        let value = self.inner.cached_property_map.lock().unwrap().get(&key.to_string()).unwrap().clone();
954                        if !value.is_null() {
955                            map.insert(key.to_string(), value);
956                        }
957                    } else {
958                        if let Some(getter) = property.getter() {
959                            let ctx = self.pipeline_ctx_for_path_and_value(path![key], Value::Null);
960                            let value: Value = ctx.run_pipeline(&getter).await?;
961                            if !value.is_null() {
962                                map.insert(key.to_string(), value);
963                            }
964                        }
965                    }
966                }
967            }
968        }
969        return Ok(Value::Dictionary(map))
970    }
971
972    pub fn is_new(&self) -> bool {
973        self.inner.is_new.load(Ordering::SeqCst)
974    }
975
976    pub fn is_modified(&self) -> bool {
977        self.inner.is_modified.load(Ordering::SeqCst)
978    }
979
980    pub fn identifier(&self) -> Value {
981        let model = self.model();
982        let mut identifier: IndexMap<String, Value> = IndexMap::new();
983        for item in model.primary_index().unwrap().items() {
984            let val = self.get_value(&item.field).unwrap();
985            identifier.insert(item.field.to_owned(), val);
986        }
987        Value::Dictionary(identifier)
988    }
989
990    pub fn previous_identifier(&self) -> Value {
991        let model = self.model();
992        let mut identifier: IndexMap<String, Value> = IndexMap::new();
993        for item in model.primary_index().unwrap().items() {
994            let modify_map = self.inner.modified_fields.lock().unwrap();
995            let val = if modify_map.contains(&item.field) {
996                if let Ok(val) = self.get_previous_value(&item.field) {
997                    if val.is_null() {
998                        self.get_value(&item.field).unwrap()
999                    } else {
1000                        val
1001                    }
1002                } else {
1003                    self.get_value(&item.field).unwrap()
1004                }
1005            } else {
1006                self.get_value(&item.field).unwrap()
1007            };
1008            identifier.insert(item.field.to_owned(), val);
1009        }
1010        Value::Dictionary(identifier)
1011    }
1012
1013    pub fn db_identifier(&self) -> Value {
1014        let model = self.model();
1015        let mut identifier: IndexMap<String, Value> = IndexMap::new();
1016        let modified_fields = self.inner.modified_fields.lock().unwrap();
1017        for item in model.primary_index().unwrap().items() {
1018            let val = if modified_fields.contains(&item.field) {
1019                self.get_previous_value(&item.field).unwrap()
1020            } else {
1021                self.get_value(&item.field).unwrap()
1022            };
1023            identifier.insert(self.model().field(&item.field).unwrap().column_name().to_owned(), val.clone());
1024        }
1025        Value::Dictionary(identifier)
1026    }
1027
1028    async fn perform_relation_manipulations<F: Fn(&Relation) -> bool>(&self, f: F, path: &KeyPath, is_new: bool, is_modified: bool) -> Result<()> {
1029        for (_relation_name, relation) in self.model().relations() {
1030            if f(relation) {
1031                let many = relation.is_vec();
1032                // programming code set
1033                if many {
1034                    let object_set_many_map = self.inner.object_set_many_map.lock().await;
1035                    if let Some(objects_to_set) = object_set_many_map.get(relation.name()) {
1036                        self.nested_set_many_relation_object_object(relation, objects_to_set, path).await?;
1037                    }
1038                } else {
1039                    let object_set_map = self.inner.object_set_map.lock().await;
1040                    if let Some(option) = object_set_map.get(relation.name()) {
1041                        // disconnect current
1042                        let value = self.intrinsic_where_unique_for_relation(relation);
1043                        self.nested_disconnect_relation_object(relation, &value, path).await?;
1044                        if let Some(new_object) = option {
1045                            // connect new
1046                            self.link_and_save_relation_object(relation, new_object, path).await?;
1047                        }
1048                    }
1049                }
1050                // programming code connections
1051                let object_connect_map = self.inner.object_connect_map.lock().await;
1052                if let Some(objects_to_connect) = object_connect_map.get(relation.name()) {
1053                    for object in objects_to_connect {
1054                        self.link_and_save_relation_object(relation, object, path).await?;
1055                    }
1056                }
1057                // programming code disconnections
1058                let object_disconnect_map = self.inner.object_disconnect_map.lock().await;
1059                if let Some(objects_to_disconnect) = object_disconnect_map.get(relation.name()) {
1060                    for object in objects_to_disconnect {
1061                        if relation.has_join_table() {
1062                            self.delete_join_object(object, relation, self.namespace().opposite_relation(relation).1.unwrap(), path).await?;
1063                        } else if relation.has_foreign_key() {
1064                            self.remove_linked_values_from_related_relation(relation);
1065                        } else {
1066                            object.remove_linked_values_from_related_relation_on_related_object(relation, &object);
1067                            object.save_with_session_and_path(path).await?;
1068                        }
1069                    }
1070                }
1071                // value mutation
1072                let relation_mutation_map = self.inner.relation_mutation_map.lock().await;
1073                if let Some(manipulation) = relation_mutation_map.get(relation.name()) {
1074                    if many {
1075                        self.perform_relation_manipulation_many(relation, manipulation, &(path + relation.name()), is_new, is_modified).await?;
1076                    } else {
1077                        self.perform_relation_manipulation_one(relation, manipulation, &(path + relation.name()), is_new, is_modified).await?;
1078                    }
1079                }
1080            }
1081        }
1082        Ok(())
1083    }
1084
1085    async fn create_join_object<'a>(&'a self, object: &'a Object, relation: &'a Relation, opposite_relation: &'a Relation, path: &'a KeyPath) -> Result<()> {
1086        let join_model = self.namespace().model_at_path(&relation.through_path().unwrap()).unwrap();
1087        let action = JOIN_CREATE | CREATE | SINGLE;
1088        let join_object = self.transaction_ctx().new_object(join_model, action, self.request())?;
1089        join_object.set_teon(&teon!({})).await?; // initialize
1090        let local = relation.local().unwrap();
1091        let foreign = opposite_relation.local().unwrap();
1092        let join_local_relation = join_model.relation(local).unwrap();
1093        self.assign_linked_values_to_related_object(&join_object, join_local_relation);
1094        let join_foreign_relation = join_model.relation(foreign).unwrap();
1095        object.assign_linked_values_to_related_object(&join_object, join_foreign_relation);
1096        match join_object.save_with_session_and_path(path).await {
1097            Ok(_) => Ok(()),
1098            Err(_) => Err(error_ext::unexpected_input_value_with_reason(path.clone(), "Can't create join record.")),
1099        }
1100    }
1101
1102    async fn delete_join_object<'a>(&'a self, object: &'a Object, relation: &'a Relation, opposite_relation: &'a Relation, path: &'a KeyPath) -> Result<()> {
1103        let join_model = self.namespace().model_at_path(&relation.through_path().unwrap()).unwrap();
1104        let action = JOIN_DELETE | DELETE | SINGLE;
1105        let local = relation.local().unwrap();
1106        let foreign = opposite_relation.local().unwrap();
1107        let join_local_relation = join_model.relation(local).unwrap();
1108        let join_foreign_relation = join_model.relation(foreign).unwrap();
1109        let mut finder = IndexMap::new();
1110        for (l, f) in join_local_relation.iter() {
1111            finder.insert(l.to_owned(), self.get_value(f).unwrap());
1112        }
1113        for (l, f) in join_foreign_relation.iter() {
1114            finder.insert(l.to_owned(), object.get_value(f).unwrap());
1115        }
1116        let r#where = Value::Dictionary(finder);
1117        if let Some(object) = self.transaction_ctx().find_unique_internal(join_model, &teon!({ "where": r#where }), true, action, self.request(), path.clone()).await? {
1118            match object.delete_from_database(path).await {
1119                Ok(_) => Ok(()),
1120                Err(_) => Err(error_ext::unexpected_input_value_with_reason(path.clone(), "Can't delete join record.")),
1121            }
1122        } else {
1123            Ok(())
1124        }
1125    }
1126
1127    fn assign_linked_values_to_related_object(&self, object: &Object, opposite_relation: &Relation) {
1128        for (field, reference) in opposite_relation.iter() {
1129            object.set_value_to_value_map(field, self.get_value_map_value(reference));
1130        }
1131    }
1132
1133    fn remove_linked_values_from_related_relation(&self, relation: &Relation) {
1134        for (field, _) in relation.iter() {
1135            self.set_value_to_value_map(field, Value::Null)
1136        }
1137    }
1138
1139    fn remove_linked_values_from_related_relation_on_related_object(&self, relation: &Relation, object: &Object) {
1140        for (_, reference) in relation.iter() {
1141            object.set_value_to_value_map(reference, Value::Null)
1142        }
1143    }
1144
1145    async fn link_and_save_relation_object(&self, relation: &Relation, object: &Object, path: &KeyPath) -> Result<()> {
1146        let mut linked = false;
1147        let (_, opposite_relation) = self.namespace().opposite_relation(relation);
1148        if let Some(opposite_relation) = opposite_relation {
1149            if opposite_relation.has_foreign_key() {
1150                self.assign_linked_values_to_related_object(object, opposite_relation);
1151                linked = true;
1152            }
1153        }
1154        object.save_with_session_and_path(path).await?;
1155        if !linked {
1156            if relation.has_foreign_key() {
1157                object.assign_linked_values_to_related_object(self, relation);
1158            } else if relation.has_join_table() {
1159                self.create_join_object(object, relation, opposite_relation.unwrap(), path).await?;
1160            }
1161        }
1162        Ok(())
1163    }
1164
1165    async fn nested_create_relation_object(&self, relation: &Relation, value: &Value, path: &KeyPath) -> Result<()> {
1166        let action = NESTED | CREATE | SINGLE;
1167        let object = self.transaction_ctx().new_object(self.namespace().model_at_path(&relation.model_path()).unwrap(), action, self.request())?;
1168        object.set_teon_with_path(value.get("create").unwrap(), path).await?;
1169        if let Some(opposite) = self.namespace().opposite_relation(relation).1 {
1170            object.ignore_relation(opposite.name());
1171        }
1172        self.link_and_save_relation_object(relation, &object, path).await
1173    }
1174
1175    async fn nested_set_many_relation_object_object(&self, relation: &Relation, objects: &Vec<Object>, path: &KeyPath) -> Result<()> {
1176        // disconnect previous
1177        let records = self.fetch_relation_objects(relation.name(), None).await?;
1178        for record in records.iter() {
1179            self.nested_disconnect_relation_object_object(relation, record, path).await?;
1180        }
1181        // connect new
1182        for object in objects {
1183            self.link_and_save_relation_object(relation, &object, path).await?;
1184        }
1185        Ok(())
1186    }
1187
1188    async fn nested_set_many_relation_object(&self, relation: &Relation, value: &Value, path: &KeyPath) -> Result<()> {
1189        // disconnect previous
1190        let records = self.fetch_relation_objects(relation.name(), None).await?;
1191        for record in records.iter() {
1192            self.nested_disconnect_relation_object_object(relation, record, path).await?;
1193        }
1194        // connect new
1195        let value_vec = value.as_array().unwrap();
1196        for value in value_vec {
1197            self.nested_connect_relation_object(relation, value, path).await?;
1198        }
1199        Ok(())
1200    }
1201
1202    async fn nested_set_relation_object(&self, relation: &Relation, value: &Value, path: &KeyPath) -> Result<()> {
1203        if !(relation.has_foreign_key() && relation.is_required()) {
1204            // disconnect old
1205            let disconnect_value = self.intrinsic_where_unique_for_relation(relation);
1206            let _ = self.nested_disconnect_relation_object_no_check(relation, &disconnect_value, path).await;
1207        }
1208        if !value.is_null() {
1209            // connect new
1210            let action = NESTED | SET | SINGLE;
1211            let object = match self.transaction_ctx().find_unique_internal(self.namespace().model_at_path(&relation.model_path()).unwrap(), &teon!({ "where": value }), true, action, self.request(), path.clone()).await {
1212                Ok(object) => object.into_not_found_error(path.clone())?,
1213                Err(_) => return Err(error_ext::unexpected_input_value_with_reason(path.clone(), "Object is not found.")),
1214            };
1215            self.link_and_save_relation_object(relation, &object, path).await?;
1216        }
1217        Ok(())
1218    }
1219
1220    async fn nested_connect_relation_object(&self, relation: &Relation, value: &Value, path: &KeyPath) -> Result<()> {
1221        let action = NESTED | CONNECT | SINGLE;
1222        let object = match self.transaction_ctx().find_unique_internal(self.namespace().model_at_path(&relation.model_path()).unwrap(), &teon!({ "where": value }), true, action, self.request(), path.clone()).await {
1223            Ok(object) => object,
1224            Err(_) => return Err(error_ext::unexpected_input_value_with_reason(path.clone(), "Object is not found.")),
1225        }.into_not_found_error(path.clone())?;
1226        self.link_and_save_relation_object(relation, &object, path).await
1227    }
1228
1229    async fn nested_connect_or_create_relation_object(&self, relation: &Relation, value: &Value, path: &KeyPath) -> Result<()> {
1230        let r#where = value.get("where").unwrap();
1231        let create = value.get("create").unwrap();
1232        let action = CONNECT_OR_CREATE | CONNECT | NESTED | SINGLE;
1233        let object = match self.transaction_ctx().find_unique_internal(self.namespace().model_at_path(&relation.model_path()).unwrap(), &teon!({ "where": r#where }), true, action, self.request(), path.clone()).await {
1234            Ok(object) => object.into_not_found_error(path.clone())?,
1235            Err(_) => {
1236                self.transaction_ctx().new_object_with_teon_and_path(self.namespace().model_at_path(&relation.model_path()).unwrap(), create, &(path + "create"), action, self.request()).await?
1237            },
1238        };
1239        self.link_and_save_relation_object(relation, &object, path).await
1240    }
1241
1242    fn intrinsic_where_unique_for_relation(&self, relation: &Relation) -> Value {
1243        teon!({
1244            "where": Value::Dictionary(relation.iter().map(|(l, f)| (f.to_owned(), self.get_value(l).unwrap())).collect())
1245        })
1246    }
1247
1248    fn intrinsic_where_unique_for_opposite_relation(&self, relation: &Relation) -> Value {
1249        teon!({
1250            "where": Value::Dictionary(relation.iter().map(|(l, f)| (l.to_owned(), self.get_value(f).unwrap())).collect())
1251        })
1252    }
1253
1254    fn intrinsic_where_unique_for_opposite_relation_with_prev_value(&self, relation: &Relation) -> Value {
1255        teon!({
1256            "where": Value::Dictionary(relation.iter().map(|(l, f)| (l.to_owned(), self.get_previous_value_or_current_value(f).unwrap())).collect())
1257        })
1258    }
1259
1260    async fn nested_disconnect_relation_object_object(&self, relation: &Relation, object: &Object, path: &KeyPath) -> Result<()> {
1261        if !relation.is_vec() && relation.is_required() {
1262            return Err(error_ext::unexpected_input_value_with_reason(path.clone(), "Cannot disconnect required relation."));
1263        }
1264        if relation.has_foreign_key() {
1265            self.remove_linked_values_from_related_relation(relation);
1266        } else if relation.has_join_table() {
1267            self.delete_join_object(object, relation, self.namespace().opposite_relation(relation).1.unwrap(), path).await?;
1268        } else {
1269            object.remove_linked_values_from_related_relation_on_related_object(relation, &object);
1270            object.save_with_session_and_path(path).await?;
1271        }
1272        Ok(())
1273    }
1274
1275    async fn nested_disconnect_relation_object_no_check(&self, relation: &Relation, value: &Value, path: &KeyPath) -> Result<()> {
1276        if relation.has_foreign_key() {
1277            self.remove_linked_values_from_related_relation(relation);
1278        } else {
1279            let r#where = value;
1280            let action = NESTED | DISCONNECT | SINGLE;
1281            let object = match self.transaction_ctx().find_unique_internal(self.namespace().model_at_path(&relation.model_path()).unwrap(), r#where, true, action, self.request(), path.clone()).await {
1282                Ok(object) => object,
1283                Err(_) => return Err(error_ext::unexpected_input_value_with_reason(path.clone(), "object not found")),
1284            }.into_not_found_error(path.clone())?;
1285            object.remove_linked_values_from_related_relation_on_related_object(relation, &object);
1286            object.save_with_session_and_path(path).await?;
1287        }
1288        Ok(())
1289    }
1290
1291    async fn nested_disconnect_relation_object(&self, relation: &Relation, value: &Value, path: &KeyPath) -> Result<()> {
1292        if !relation.is_vec() && relation.is_required() {
1293            return Err(error_ext::unexpected_input_value_with_reason(path.clone(), "Cannot disconnect required relation."));
1294        }
1295        self.nested_disconnect_relation_object_no_check(relation, value, path).await?;
1296        Ok(())
1297    }
1298
1299    async fn nested_upsert_relation_object(&self, relation: &Relation, value: &Value, path: &KeyPath) -> Result<()> {
1300        let mut r#where = self.intrinsic_where_unique_for_relation(relation);
1301        r#where.as_dictionary_mut().unwrap().extend(value.get("where").unwrap().as_dictionary().cloned().unwrap());
1302        let create = value.get("create").unwrap();
1303        let update = value.get("update").unwrap();
1304        let action = NESTED | UPSERT | UPDATE | SINGLE;
1305        match self.transaction_ctx().find_unique_internal(self.namespace().model_at_path(&relation.model_path()).unwrap(), &teon!({ "where": r#where }), true, action, self.request(), path.clone()).await.into_not_found_error(path.clone()) {
1306            Ok(object) => {
1307                let path = path + "update";
1308                object.set_teon_with_path(update, &path).await?;
1309                object.save_with_session_and_path(&path).await?;
1310            },
1311            Err(_) => {
1312                let action = NESTED | UPSERT | CREATE | SINGLE;
1313                let object = self.transaction_ctx().new_object_with_teon_and_path(self.namespace().model_at_path(&relation.model_path()).unwrap(), create, &(path + "create"), action, self.request()).await?;
1314                self.link_and_save_relation_object(relation, &object, path).await?;
1315            },
1316        };
1317        Ok(())
1318    }
1319
1320    async fn nested_many_disconnect_relation_object(&self, relation: &Relation, value: &Value, path: &KeyPath) -> Result<()> {
1321        if relation.has_join_table() {
1322            let action = JOIN_DELETE | DELETE | SINGLE;
1323            let object = match self.transaction_ctx().find_unique_internal(self.namespace().model_at_path(&relation.model_path()).unwrap(), &teon!({ "where": value }), true, action, self.request(), path.clone()).await {
1324                Ok(object) => object.into_not_found_error(path.clone())?,
1325                Err(_) => return Err(error_ext::unexpected_input_value_with_reason(path.clone(), "Object is not found.")),
1326            };
1327            self.delete_join_object(&object, relation, self.namespace().opposite_relation(relation).1.unwrap(), path).await?;
1328        } else {
1329            let mut r#where = self.intrinsic_where_unique_for_relation(relation);
1330            r#where.as_dictionary_mut().unwrap().extend(value.as_dictionary().cloned().unwrap().into_iter());
1331            let action = DISCONNECT | NESTED | SINGLE;
1332            let object = match self.transaction_ctx().find_unique_internal(self.namespace().model_at_path(&relation.model_path()).unwrap(), &teon!({ "where": r#where }), true, action, self.request(), path.clone()).await {
1333                Ok(object) => object.into_not_found_error(path.clone())?,
1334                Err(_) => return Err(error_ext::unexpected_input_value_with_reason(path.clone(), "Object is not found.")),
1335            };
1336            object.remove_linked_values_from_related_relation_on_related_object(relation, &object);
1337            object.save_with_session_and_path(path).await?;
1338        }
1339        Ok(())
1340    }
1341
1342    async fn find_relation_objects_by_value(&self, relation: &Relation, value: &Value, path: &KeyPath, action: Action) -> Result<Vec<Object>> {
1343        if relation.has_join_table() {
1344            let mut finder = IndexMap::new();
1345            let join_relation = self.namespace().through_relation(relation).1;
1346            for (l, f) in join_relation.iter() {
1347                finder.insert(l.to_owned(), self.get_value(f).unwrap());
1348            }
1349            finder.insert(self.namespace().through_opposite_relation(relation).1.name().to_owned(), teon!({
1350                "is": value
1351            }));
1352            if let Ok(join_objects) = self.transaction_ctx().find_many_internal(self.namespace().model_at_path(&relation.through_path().unwrap()).unwrap(), &teon!({
1353                "where": Value::Dictionary(finder),
1354                "include": {
1355                    self.namespace().through_opposite_relation(relation).1.name(): true
1356                }
1357            }), true, action, self.request(), path.clone()).await {
1358                let mut results = vec![];
1359                for join_object in join_objects {
1360                    let object = join_object.get_query_relation_object(self.namespace().through_opposite_relation(relation).1.name(), path)?.unwrap();
1361                    results.push(object);
1362                }
1363                Ok(results)
1364            } else {
1365                return Err(error_ext::unexpected_input_value_with_reason(path.clone(), "object not found"));
1366            }
1367        } else {
1368            let mut r#where = self.intrinsic_where_unique_for_relation(relation);
1369            r#where.as_dictionary_mut().unwrap().extend(value.as_dictionary().cloned().unwrap());
1370            let action = NESTED | UPDATE | MANY;
1371            let objects = self.transaction_ctx().find_many_internal(self.namespace().model_at_path(&relation.model_path()).unwrap(), &teon!({ "where": r#where }), true, action, self.request(), path.clone()).await.unwrap();
1372            Ok(objects)
1373        }
1374    }
1375
1376    async fn find_relation_object_by_value(&self, relation: &Relation, value: &Value, path: &KeyPath, action: Action) -> Result<Object> {
1377        if relation.has_join_table() {
1378            let mut finder = IndexMap::new();
1379            let join_relation = self.namespace().through_relation(relation).1;
1380            for (l, f) in join_relation.iter() {
1381                finder.insert(l.to_owned(), self.get_value(f).unwrap());
1382            }
1383            finder.insert(self.namespace().through_opposite_relation(relation).1.name().to_owned(), teon!({
1384                "is": value
1385            }));
1386            if let Ok(join_object) = self.transaction_ctx().find_first_internal(self.namespace().model_at_path(&relation.through_path().unwrap()).unwrap(), &teon!({
1387                "where": Value::Dictionary(finder),
1388                "include": {
1389                    self.namespace().through_opposite_relation(relation).1.name(): true
1390                }
1391            }), true, action, self.request(), path.clone()).await.into_not_found_error(path.clone()) {
1392                let object = join_object.get_query_relation_object(self.namespace().through_opposite_relation(relation).1.name(), path)?.unwrap();
1393                Ok(object)
1394            } else {
1395                return Err(error_ext::unexpected_input_value_with_reason(path + "where", "Object is not found."));
1396            }
1397        } else {
1398            let mut r#where = self.intrinsic_where_unique_for_relation(relation);
1399            r#where.as_dictionary_mut().unwrap().extend(value.as_dictionary().cloned().unwrap());
1400            let action = NESTED | UPDATE | SINGLE;
1401            let object = match self.transaction_ctx().find_unique_internal(self.namespace().model_at_path(&relation.model_path()).unwrap(), &teon!({ "where": r#where }), true, action, self.request(), path.clone()).await {
1402                Ok(object) => object,
1403                Err(_) => return Err(error_ext::unexpected_input_value_with_reason(path + "where", "Object is not found.")),
1404            }.into_not_found_error(path.clone())?;
1405            Ok(object)
1406        }
1407    }
1408
1409    async fn nested_many_update_relation_object(&self, relation: &Relation, value: &Value, path: &KeyPath) -> Result<()> {
1410        let object = self.find_relation_object_by_value(relation, value.get("where").unwrap(), path, NESTED | UPDATE | SINGLE).await?;
1411        object.set_teon_with_path(value.get("update").unwrap(), &(path + "update")).await?;
1412        object.save_with_session_and_path(path).await?;
1413        Ok(())
1414    }
1415
1416    async fn nested_many_update_many_relation_object(&self, relation: &Relation, value: &Value, path: &KeyPath) -> Result<()> {
1417        let objects = self.find_relation_objects_by_value(relation, value.get("where").unwrap(), path, NESTED | UPDATE | MANY).await?;
1418        let update = value.get("update").unwrap();
1419        for object in objects {
1420            object.set_teon_with_path(update, path).await?;
1421            object.save_with_session_and_path(path).await?;
1422        }
1423        Ok(())
1424    }
1425
1426    async fn nested_update_relation_object<'a>(&'a self, relation: &Relation, value: &'a Value, path: &'a KeyPath) -> Result<()> {
1427        let r#where = value.get("where").unwrap();
1428        let action = NESTED | UPDATE | SINGLE;
1429        let object = match self.transaction_ctx().find_unique_internal(self.namespace().model_at_path(&relation.model_path()).unwrap(), &teon!({ "where": r#where }), true, action, self.request(), path.clone()).await {
1430            Ok(object) => object.into_not_found_error(path.clone())?,
1431            Err(_) => return Err(error_ext::unexpected_input_value_with_reason(path.clone(), "update: object not found")),
1432        };
1433        object.set_teon_with_path(value.get("update").unwrap(), path).await?;
1434        object.save_with_session_and_path(path).await?;
1435        Ok(())
1436    }
1437
1438    async fn nested_delete_relation_object(&self, relation: &Relation, value: &Value, path: &KeyPath) -> Result<()> {
1439        if !relation.is_vec() && relation.is_required() {
1440            return Err(error_ext::unexpected_input_value_with_reason(path.clone(), "Cannot delete required relation."));
1441        }
1442        let r#where = value.get("where").unwrap();
1443        let action = NESTED | DELETE | SINGLE;
1444        let object = match self.transaction_ctx().find_unique_internal(self.namespace().model_at_path(&relation.model_path()).unwrap(), &teon!({ "where": r#where }), true, action, self.request(), path.clone()).await {
1445            Ok(object) => object.into_not_found_error(path.clone())?,
1446            Err(_) => return Err(error_ext::unexpected_input_value_with_reason(path.clone(), "delete: object not found")),
1447        };
1448        object.delete_from_database(path).await?;
1449        if relation.has_join_table() {
1450            let opposite_relation = self.namespace().opposite_relation(relation).1.unwrap();
1451            self.delete_join_object(&object, relation, opposite_relation, path).await?;
1452        }
1453        if relation.has_foreign_key() {
1454            self.remove_linked_values_from_related_relation(relation);
1455        }
1456        Ok(())
1457    }
1458
1459    async fn nested_many_delete_relation_object(&self, relation: &Relation, value: &Value, path: &KeyPath) -> Result<()> {
1460        let object = self.find_relation_object_by_value(relation, value, path, NESTED | DELETE | SINGLE).await?;
1461        if relation.has_join_table() {
1462            let opposite_relation = self.namespace().opposite_relation(relation).1.unwrap();
1463            self.delete_join_object(&object, relation, opposite_relation, path).await?;
1464        }
1465        object.delete_from_database(path).await?;
1466        Ok(())
1467    }
1468
1469    async fn nested_many_delete_many_relation_object(&self, relation: &Relation, value: &Value, path: &KeyPath) -> Result<()> {
1470        let objects = self.find_relation_objects_by_value(relation, value, path, NESTED | DELETE | MANY).await?;
1471        for object in objects {
1472            object.delete_from_database(path).await?;
1473            if relation.has_join_table() {
1474                let opposite_relation = self.namespace().opposite_relation(relation).1.unwrap();
1475                self.delete_join_object(&object, relation, opposite_relation, path).await?;
1476            }
1477        }
1478        Ok(())
1479    }
1480
1481    async fn disconnect_object_which_connects_to<'a>(&'a self, relation: &Relation, value: &'a Value, path: &KeyPath) -> Result<()> {
1482        if let Ok(that) = self.transaction_ctx().find_unique::<Object>(self.model(), &teon!({
1483            "where": {
1484                relation.name(): {
1485                    "is": value
1486                }
1487            }
1488        }), self.request(), path.clone()).await.into_not_found_error(path.clone()) {
1489            if relation.is_required() {
1490                return Err(error_ext::cannot_disconnect_previous_relation(path.clone()));
1491            } else {
1492                for (l, _f) in relation.iter() {
1493                    that.set_value(l, Value::Null).unwrap();
1494                }
1495                that.save().await.unwrap();
1496            }
1497        }
1498        Ok(())
1499    }
1500
1501    async fn perform_relation_manipulation_one_inner(&self, relation: &Relation, action: Action, value: &Value, path: &KeyPath, is_new: bool, is_modified: bool) -> Result<()> {
1502        if !relation.is_vec() && !relation.has_foreign_key() && !is_new {
1503            match action {
1504                NESTED_CREATE_ACTION | NESTED_CONNECT_ACTION | NESTED_CONNECT_OR_CREATE_ACTION => {
1505                    let disconnect_value = self.intrinsic_where_unique_for_relation(relation);
1506                    let _ = self.nested_disconnect_relation_object_no_check(relation, &disconnect_value, path).await;
1507                },
1508                _ => ()
1509            }
1510        }
1511        if !relation.is_vec() && relation.has_foreign_key() {
1512            if let Some(opposite_relation) = self.namespace().opposite_relation(relation).1 {
1513                if !opposite_relation.is_vec() {
1514                    match action {
1515                        NESTED_CONNECT_ACTION | NESTED_SET_ACTION => {
1516                            if !value.is_null() {
1517                                self.disconnect_object_which_connects_to(relation, value, path).await?;
1518                            }
1519                        }
1520                        NESTED_CONNECT_OR_CREATE_ACTION => {
1521                            self.disconnect_object_which_connects_to(relation, value.get("where").unwrap(), path).await?;
1522                        }
1523                        _ => ()
1524                    }
1525                }
1526            }
1527        }
1528        match action {
1529            NESTED_CREATE_ACTION => self.nested_create_relation_object(relation, value, &path).await,
1530            NESTED_CONNECT_ACTION => self.nested_connect_relation_object(relation, value, &path).await,
1531            NESTED_SET_ACTION => self.nested_set_relation_object(relation, value, &path).await,
1532            NESTED_CONNECT_OR_CREATE_ACTION => self.nested_connect_or_create_relation_object(relation, value, &path).await,
1533            NESTED_DISCONNECT_ACTION => self.nested_disconnect_relation_object(relation, value, &path).await,
1534            NESTED_UPDATE_ACTION => self.nested_update_relation_object(relation, value, &path).await,
1535            NESTED_DELETE_ACTION => self.nested_delete_relation_object(relation, value, &path).await,
1536            NESTED_UPSERT_ACTION => self.nested_upsert_relation_object(relation, value, &path).await,
1537            _ => unreachable!(),
1538        }
1539    }
1540
1541    fn normalize_relation_one_value<'a>(&'a self, relation: &Relation, action: Action, value: &'a Value) -> Cow<Value> {
1542        match action {
1543            NESTED_CREATE_ACTION => Owned(Value::Dictionary(indexmap! {"create".to_owned() => value.clone()})),
1544            NESTED_UPDATE_ACTION => Owned({
1545                let mut normalized = self.intrinsic_where_unique_for_relation(relation);
1546                normalized.as_dictionary_mut().unwrap().insert("update".to_owned(), value.clone());
1547                normalized
1548            }),
1549            NESTED_DELETE_ACTION => Owned(self.intrinsic_where_unique_for_relation(relation)),
1550            NESTED_DISCONNECT_ACTION => Owned(self.intrinsic_where_unique_for_relation(relation)),
1551            NESTED_UPSERT_ACTION => {
1552                let mut value = value.clone();
1553                value.as_dictionary_mut().unwrap().insert("where".to_owned(), self.intrinsic_where_unique_for_relation(relation).get("where").unwrap().clone());
1554                Owned(value)
1555            }
1556            _ => Borrowed(value)
1557        }
1558    }
1559
1560    async fn perform_relation_manipulation_one(&self, relation: &Relation, value: &Value, path: &KeyPath, is_new: bool, is_modified: bool) -> Result<()> {
1561        for (key, value) in value.as_dictionary().unwrap() {
1562            let key = key.as_str();
1563            let path = path + key;
1564            let action = Action::nested_from_name(key).unwrap();
1565            let other_model = self.namespace().opposite_relation(relation).0;
1566            let normalized_value = self.normalize_relation_one_value(relation, action, value);
1567            // todo: action transform
1568            //let ctx = PipelineCtx::initial_state_with_value(normalized_value.as_ref().clone(), self.transaction_ctx().transaction_for_model(self.model()).unwrap(), self.initiator().as_req()).with_path(error_ext.clone()).with_action(action);
1569            //let (transformed_value, new_action) = other_model.transformed_action(ctx).await?;
1570            self.perform_relation_manipulation_one_inner(relation, action, &normalized_value, &path, is_new, is_modified).await?;
1571        }
1572        Ok(())
1573    }
1574
1575    fn normalize_relation_many_value<'a>(&'a self, action: Action, value: &'a Value) -> Cow<Value> {
1576        match action {
1577            NESTED_CREATE_ACTION => Owned(Value::Dictionary(indexmap! {"create".to_owned() => value.clone()})),
1578            _ => Borrowed(value)
1579        }
1580    }
1581
1582    async fn perform_relation_manipulation_many_inner(&self, relation: &Relation, action: Action, value: &Value, path: &KeyPath) -> Result<()> {
1583        match action {
1584            NESTED_CREATE_ACTION => self.nested_create_relation_object(relation, value, &path).await,
1585            NESTED_CONNECT_ACTION => self.nested_connect_relation_object(relation, value, &path).await,
1586            NESTED_SET_ACTION => self.nested_set_many_relation_object(relation, value, &path).await,
1587            NESTED_CONNECT_OR_CREATE_ACTION => self.nested_connect_or_create_relation_object(relation, value, &path).await,
1588            NESTED_DISCONNECT_ACTION => self.nested_many_disconnect_relation_object(relation, value, &path).await,
1589            NESTED_UPSERT_ACTION => self.nested_upsert_relation_object(relation, value, &path).await,
1590            NESTED_UPDATE_ACTION => self.nested_many_update_relation_object(relation, value, &path).await,
1591            NESTED_UPDATE_MANY_ACTION => self.nested_many_update_many_relation_object(relation, value, &path).await,
1592            NESTED_DELETE_ACTION => self.nested_many_delete_relation_object(relation, value, &path).await,
1593            NESTED_DELETE_MANY_ACTION => self.nested_many_delete_many_relation_object(relation, value, &path).await,
1594            _ => unreachable!(),
1595        }
1596    }
1597
1598    async fn perform_relation_manipulation_many(&self, relation: &Relation, value: &Value, path: &KeyPath, is_new: bool, is_modified: bool) -> Result<()> {
1599        for (key, value) in value.as_dictionary().unwrap() {
1600            let key = key.as_str();
1601            let path = path + key;
1602            let action = Action::nested_from_name(key).unwrap();
1603            let other_model = self.namespace().opposite_relation(relation).0;
1604            if value.is_array() && action != NESTED_SET_ACTION {
1605                for (_index, value) in value.as_array().unwrap().iter().enumerate() {
1606                    let normalized_value = self.normalize_relation_many_value(action, value);
1607                    // todo: transform action
1608                    //let ctx = PipelineCtx::initial_state_with_value(normalized_value.as_ref().clone(), self.transaction_ctx().transaction_for_model(self.model()).unwrap(), self.initiator().as_req()).with_path(&(error_ext.clone() + index)).with_action(action);
1609                    //let (transformed_value, new_action) = other_model.transformed_action(ctx).await?;
1610                    self.perform_relation_manipulation_many_inner(relation, action, &normalized_value, &path).await?;
1611                }
1612            }  else {
1613                let normalized_value = self.normalize_relation_many_value(action, value);
1614                // todo: transform action
1615                //let ctx = PipelineCtx::initial_state_with_value(normalized_value.as_ref().clone(), self.transaction_ctx().transaction_for_model(self.model()).unwrap(), self.initiator().as_req()).with_path(error_ext.clone()).with_action(action);
1616                //let (transformed_value, new_action) = other_model.transformed_action(ctx).await?;
1617                self.perform_relation_manipulation_many_inner(relation, action, &normalized_value, &path).await?;
1618            }
1619        }
1620        Ok(())
1621    }
1622
1623    pub async fn refreshed(&self, include: Option<&Value>, select: Option<&Value>) -> Result<Object> {
1624        let mut finder = teon!({
1625            "where": self.identifier(),
1626        });
1627        if let Some(include) = include {
1628            finder.as_dictionary_mut().unwrap().insert("include".to_string(), include.clone());
1629        }
1630        if let Some(select) = select {
1631            finder.as_dictionary_mut().unwrap().insert("select".to_string(), select.clone());
1632        }
1633        let target = self.transaction_ctx().find_unique_internal(self.model(), &finder, false, self.action(), self.request(), path![]).await.into_not_found_error(path![]);
1634        match target {
1635            Ok(obj) => {
1636                if self.model().cache().has_virtual_fields {
1637                    self.copy_virtual_fields(&obj);
1638                }
1639                Ok(obj)
1640            }
1641            Err(err) => Err(err.into())
1642        }
1643    }
1644
1645    fn copy_virtual_fields(&self, other: &Object) {
1646        for (_field_name, field) in self.model().fields() {
1647            if field.r#virtual() {
1648                let result = self.get_value(field.name()).unwrap();
1649                other.set(field.name(), result).unwrap();
1650            }
1651        }
1652    }
1653
1654    pub async fn force_set_relation_objects(&self, key: &str, objects: Vec<Object>) -> () {
1655        self.inner.object_set_many_map.lock().await.insert(key.to_owned(), objects);
1656    }
1657
1658    pub async fn force_add_relation_objects(&self, key: &str, objects: Vec<Object>) -> () {
1659        self.inner.object_connect_map.lock().await.insert(key.to_owned(), objects);
1660    }
1661
1662    pub async fn force_remove_relation_objects(&self, key: &str, objects: Vec<Object>) -> () {
1663        self.inner.object_disconnect_map.lock().await.insert(key.to_owned(), objects);
1664    }
1665
1666    pub async fn force_get_relation_objects(&self, key: &str, find_many_args: impl AsRef<Value>) -> Result<Vec<Object>> {
1667        self.fetch_relation_objects(key, Some(find_many_args.as_ref())).await
1668    }
1669
1670    pub async fn force_set_relation_object(&self, key: &str, object: Option<Object>) -> () {
1671        self.inner.object_set_map.lock().await.insert(key.to_owned(), object);
1672    }
1673
1674    pub async fn force_get_relation_object(&self, key: &str) -> Result<Option<Object>> {
1675        if self.has_mutation_relation_fetched(key) {
1676            self.get_mutation_relation_object(key)
1677        } else {
1678            match self.fetch_relation_object(key, None).await {
1679                Ok(r) => Ok(r),
1680                Err(e) => Err(e.into()),
1681            }
1682        }
1683    }
1684
1685    pub async fn fetch_relation_object(&self, key: impl AsRef<str>, find_unique_arg: Option<&Value>) -> Result<Option<Object>> {
1686        // get relation
1687        let model = self.model();
1688        let relation = model.relation(key.as_ref());
1689        if relation.is_none() {
1690            // todo() err here
1691        }
1692        let relation = relation.unwrap();
1693        let mut finder = self.intrinsic_where_unique_for_relation(relation);
1694        if let Some(find_unique_arg) = find_unique_arg {
1695            if let Some(include) = find_unique_arg.get("include") {
1696                finder.as_dictionary_mut().unwrap().insert("include".to_owned(), include.clone());
1697            }
1698            if let Some(select) = find_unique_arg.get("select") {
1699                finder.as_dictionary_mut().unwrap().insert("select".to_owned(), select.clone());
1700            }
1701        }
1702        let relation_model_name = self.namespace().model_at_path(&relation.model_path()).unwrap();
1703        let action = NESTED | FIND | CODE_NAME | SINGLE;
1704        match self.transaction_ctx().find_unique_internal(relation_model_name, &finder, false, action, self.request(), path![]).await {
1705            Ok(result) => {
1706                self.inner.relation_query_map.lock().unwrap().insert(key.as_ref().to_string(), vec![result.into_not_found_error(path![])?]);
1707                let obj = self.inner.relation_query_map.lock().unwrap().get(key.as_ref()).unwrap().get(0).unwrap().clone();
1708                Ok(Some(obj.clone()))
1709            }
1710            Err(err) => {
1711                Err(err)
1712            }
1713        }
1714    }
1715
1716    pub async fn fetch_relation_objects(&self, key: impl AsRef<str>, find_many_arg: Option<&Value>) -> Result<Vec<Object>> {
1717        // get relation
1718        let model = self.model();
1719        let relation = model.relation(key.as_ref());
1720        if relation.is_none() {
1721            // todo() err here
1722        }
1723        let relation = relation.unwrap();
1724        let empty = teon!({});
1725        let include_inside = if find_many_arg.is_some() {
1726            find_many_arg.unwrap()
1727        } else {
1728            &empty
1729        };
1730        let action = CODE_POSITION | CODE_NAME | FIND | MANY;
1731        if relation.has_join_table() {
1732            let identifier = self.identifier();
1733            let new_self = self.transaction_ctx().find_unique_internal(model, &teon!({
1734                "where": identifier,
1735                "include": {
1736                    key.as_ref(): include_inside
1737                }
1738            }), false, action, self.request(), path![]).await.into_not_found_error(path![])?;
1739            let vec = new_self.inner.relation_query_map.lock().unwrap().get(key.as_ref()).unwrap().clone();
1740            Ok(vec)
1741        } else {
1742            let mut finder = teon!({});
1743            if let Some(find_many_arg) = find_many_arg {
1744                for (k, v) in find_many_arg.as_dictionary().unwrap().iter() {
1745                    finder.as_dictionary_mut().unwrap().insert(k.clone(), v.clone());
1746                }
1747            }
1748            if finder.as_dictionary().unwrap().get("where").is_none() {
1749                finder.as_dictionary_mut().unwrap().insert("where".to_string(), teon!({}));
1750            }
1751            for (index, local_field_name) in relation.fields().iter().enumerate() {
1752                let foreign_field_name = relation.references().get(index).unwrap();
1753                let value = self.get_value(local_field_name).unwrap();
1754                if value == Value::Null {
1755                    return Ok(vec![]);
1756                }
1757                let json_value = value;
1758                finder.as_dictionary_mut().unwrap().get_mut("where").unwrap().as_dictionary_mut().unwrap().insert(foreign_field_name.to_owned(), json_value);
1759            }
1760            let relation_model = self.namespace().model_at_path(&relation.model_path()).unwrap();
1761            let results = self.transaction_ctx().find_many_internal(relation_model, &finder, false, action, self.request(), path![]).await?;
1762            Ok(results)
1763        }
1764    }
1765
1766    pub fn keys_for_save(&self) -> Vec<&str> {
1767        if self.is_new() {
1768            self.model().cache().save_keys.iter().map(|k| k.as_str()).collect()
1769        } else {
1770            self.model().cache().save_keys.iter().filter(|k| {
1771                self.inner.modified_fields.lock().unwrap().contains(&k.to_string()) ||
1772                    self.inner.atomic_updater_map.lock().unwrap().contains_key(&k.to_string())
1773            }).map(|k| k.as_str()).collect()
1774        }
1775    }
1776
1777    pub fn action(&self) -> Action {
1778        self.inner.action
1779    }
1780
1781    pub fn ignore_relation(&self, name: &str) {
1782        *self.inner.ignore_relation.lock().unwrap() = Some(name.to_owned()); 
1783    }
1784
1785    fn every_field_is_null_previously(&self, fields: Vec<&str>) -> Result<bool> {
1786        let mut result = true;
1787        for field in fields {
1788            if !self.get_previous_value_or_current_value(field)?.is_null() {
1789                result = false;
1790            }
1791        }
1792        Ok(result)
1793    }
1794}
1795
1796#[derive(Debug)]
1797pub struct Inner {
1798    request: Option<Request>,
1799    transaction_ctx: transaction::Ctx,
1800    model: Model,
1801    action: Action,
1802    pub is_initialized: AtomicBool,
1803    pub is_new: AtomicBool,
1804    is_modified: AtomicBool,
1805    is_partial: AtomicBool,
1806    is_deleted: AtomicBool,
1807    inside_before_save_callback: AtomicBool,
1808    inside_after_save_callback: AtomicBool,
1809    selected_fields: Arc<Mutex<Vec<String>>>,
1810    modified_fields: Arc<Mutex<BTreeSet<String>>>,
1811    pub value_map: Arc<Mutex<BTreeMap<String, Value>>>,
1812    previous_value_map: Arc<Mutex<BTreeMap<String, Value>>>,
1813    pub atomic_updater_map: Arc<Mutex<BTreeMap<String, Value>>>,
1814    pub relation_mutation_map: Arc<TokioMutex<BTreeMap<String, Value>>>,
1815    pub relation_query_map: Arc<Mutex<BTreeMap<String, Vec<Object>>>>,
1816    pub cached_property_map: Arc<Mutex<BTreeMap<String, Value>>>,
1817    pub object_set_map: Arc<TokioMutex<BTreeMap<String, Option<Object>>>>,
1818    pub object_set_many_map: Arc<TokioMutex<BTreeMap<String, Vec<Object>>>>,
1819    pub object_connect_map: Arc<TokioMutex<BTreeMap<String, Vec<Object>>>>,
1820    pub object_disconnect_map: Arc<TokioMutex<BTreeMap<String, Vec<Object>>>>,
1821    ignore_relation: Arc<Mutex<Option<String>>>,
1822}
1823
1824impl Serialize for Object {
1825
1826    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error> where S: Serializer {
1827        serializer.serialize_none()
1828    }
1829}
1830
1831fn check_user_json_keys<'a>(map: &IndexMap<String, Value>, allowed: &HashSet<&str>, model: &Model) -> Result<()> {
1832    if let Some(unallowed) = map.keys().find(|k| !allowed.contains(k.as_str())) {
1833        return Err(Error::new(format!("key '{}' is not allowed for {}", unallowed, model.name())));
1834    }
1835    Ok(())
1836}
1837
1838impl Debug for Object {
1839    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
1840        let mut result = f.debug_struct(self.model().name());
1841        for (_field_name, field) in self.model().fields() {
1842            let map = self.inner.value_map.lock().unwrap();
1843            let value = map.get(field.name()).unwrap_or(&Value::Null);
1844            result.field(field.name(), value);
1845        }
1846        result.finish()
1847    }
1848}
1849
1850impl Display for Object {
1851
1852    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
1853        f.write_str(format!("{} {{ {} }}", self.model().name(), self.model().fields().values().map(|field| {
1854            let map = self.inner.value_map.lock().unwrap();
1855            let value = map.get(field.name()).unwrap_or(&Value::Null);
1856            format!("{}: {}", field.name(), value)
1857        }).join(", ")).as_str())
1858    }
1859}
1860
1861impl PartialEq for Object {
1862
1863    fn eq(&self, other: &Self) -> bool {
1864        self.model() == other.model() && self.identifier() == other.identifier()
1865    }
1866}
1867
1868unsafe impl Send for Object { }
1869unsafe impl Sync for Object { }
1870
1871pub trait ErrorIfNotFound {
1872    fn into_not_found_error(self, path: KeyPath) -> Result<Object>;
1873}
1874
1875impl ErrorIfNotFound for Option<Object> {
1876    fn into_not_found_error(self, path: KeyPath) -> Result<Object> {
1877        match self {
1878            Some(object) => Ok(object),
1879            None => Err(Error::not_found_pathed(path, "not found")),
1880        }
1881    }
1882}
1883
1884impl ErrorIfNotFound for Result<Option<Object>> {
1885
1886    fn into_not_found_error(self, path: KeyPath) -> Result<Object> {
1887        match self {
1888            Err(err) => Err(err),
1889            Ok(option) => match option {
1890                Some(object) => Ok(object),
1891                None => Err(Error::not_found_pathed(path, "not found")),
1892            }
1893        }
1894    }
1895}
1896
1897unsafe impl Send for Inner {}
1898unsafe impl Sync for Inner {}
1899
1900