teo_runtime/handler/default/
upsert.rs

1use key_path::path;
2use crate::value::Value;
3use crate::response::Response;
4use crate::action::action::*;
5use crate::connection::transaction;
6use crate::handler::default::internal::create::create_internal;
7use crate::handler::default::internal::update::update_internal;
8use crate::request::Request;
9
10pub async fn upsert(request: Request) -> teo_result::Result<Response> {
11    let action = UPSERT | SINGLE | ENTRY;
12    let value: Value = request.transaction_ctx().run_transaction(move |ctx: transaction::Ctx| {
13        let request = request.clone();
14        let model = request.transaction_ctx().namespace().model_at_path(&request.handler_match().unwrap().path()).unwrap().clone();
15        async move {
16            let find_result = ctx.find_unique_internal(&model, request.body_value()?, true, action, Some(request.clone()), path![]).await?;
17            let include = request.body_value()?.get("include");
18            let select = request.body_value()?.get("select");
19            match find_result {
20                Some(object) => {
21                    let update = request.body_value()?.get("update");
22                    Ok(update_internal(object, update, include, select, &path![]).await?)
23                }
24                None => {
25                    let create = request.body_value()?.get("update");
26                    Ok(create_internal(ctx.clone(), request.clone(), create, include, select, &model, &path![], action).await?)
27                }
28            }
29        }
30    }).await?;
31    Ok(Response::data(value))
32}