teo_runtime/handler/default/
copy.rs

1use key_path::path;
2use crate::value::Value;
3use crate::teon;
4use crate::request::Request;
5use crate::response::Response;
6use crate::action::action::*;
7use crate::connection::transaction;
8use crate::model::object::object::ErrorIfNotFound;
9
10pub async fn copy(request: Request) -> teo_result::Result<Response> {
11    let action = COPY | 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 object = ctx.find_unique_internal(&model, request.body_value()?, true, action, Some(request.clone()), path![]).await?.into_not_found_error(path![])?;
17            let copy = request.body_value()?.get("copy");
18            let include = request.body_value()?.get("include");
19            let select = request.body_value()?.get("select");
20            let value = object.copied_value();
21            let new = ctx.new_object_with_teon_and_path(&model, &teon!({}), &path![], action, Some(request.clone())).await?;
22            new.update_teon(&value).await?;
23            if let Some(copy) = copy {
24                new.set_teon_with_path(copy, &path!["copy"]).await?;
25            }
26            new.save_with_session_and_path(&path!["copy"]).await?;
27            let refreshed = new.refreshed(include, select).await?;
28            refreshed.to_teon_internal(&path!["data"]).await
29        }
30    }).await?;
31    Ok(Response::data(value))
32}