teo_runtime/handler/default/
update_many.rs

1use key_path::path;
2use crate::value::Value;
3use crate::teon;
4use crate::response::Response;
5use crate::action::action::*;
6use crate::connection::transaction;
7use crate::handler::default::internal::update::update_internal;
8use crate::request::Request;
9
10pub async fn update_many(request: Request) -> teo_result::Result<Response> {
11    let action = UPDATE | MANY | ENTRY;
12    let (objects, count) = 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 input = request.body_value()?.as_dictionary().unwrap();
17            let update = input.get("update");
18            let include = input.get("include");
19            let select = input.get("select");
20            let objects = ctx.find_many_internal(&model, request.body_value()?, true, action, Some(request.clone()), path![]).await?;
21            let mut count = 0;
22            let mut ret_data: Vec<Value> = vec![];
23            for (index, object) in objects.iter().enumerate() {
24                let update_result = update_internal(object.clone(), update, include, select, &path!["update", index]).await?;
25                ret_data.push(update_result);
26                count += 1;
27            }
28            Ok((ret_data, count))
29        }
30    }).await?;
31    Ok(Response::data_meta(Value::Array(objects), teon!({"count": count})))
32}