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 if !self.is_new() {
122 if !bypass_permission_check {
123 self.check_model_write_permission(path).await?;
124 }
125 }
126 let value_map = value.as_dictionary().unwrap();
128 let value_map_keys: Vec<&str> = value_map.keys().map(|k| k.as_str()).collect();
129 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 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 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 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 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 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 if self.is_new() {
198 if !bypass_permission_check {
199 self.check_model_write_permission(path).await?;
200 }
201 }
202 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 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 return Ok(());
496 } else if !false_empty {
497 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 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 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 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 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 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 }
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 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 self.transaction_ctx().transaction_for_model(self.model()).await.delete_object(self, path.clone()).await?;
666 for (opposite_model, opposite_relation) in namespace.model_opposite_relations(model) {
668 match opposite_relation.delete() {
669 Delete::NoAction => {} Delete::Deny => {}, 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 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 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 => {} Update::Deny => {}, 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 self.before_save_callback_check(path)?;
831 let is_new = self.is_new();
832 let is_modified = self.is_modified();
834 if is_modified || is_new {
835 self.apply_on_save_pipeline_and_validate_required_fields(path, ignore_required_relation).await?;
837 self.trigger_before_save_callbacks(path).await?;
838 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 self.perform_relation_manipulations(|r| r.has_foreign_key(), path, is_new, is_modified).await?;
844 }
845 self.perform_relation_manipulations(|r| !r.has_foreign_key(), path, is_new, is_modified).await?;
847 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 self.check_model_read_permission(path.as_ref()).await?;
915 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 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 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 self.link_and_save_relation_object(relation, new_object, path).await?;
1047 }
1048 }
1049 }
1050 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 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 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?; 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 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 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 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 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 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 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 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 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 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 let model = self.model();
1688 let relation = model.relation(key.as_ref());
1689 if relation.is_none() {
1690 }
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 let model = self.model();
1719 let relation = model.relation(key.as_ref());
1720 if relation.is_none() {
1721 }
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