56 lines
1.2 KiB
Rust
56 lines
1.2 KiB
Rust
|
use std::sync::Arc;
|
||
|
|
||
|
use hyper::{Body, Request, Response, StatusCode};
|
||
|
use serde::{Deserialize, Serialize};
|
||
|
|
||
|
use garage_util::data::*;
|
||
|
|
||
|
use garage_table::util::*;
|
||
|
|
||
|
use garage_model::garage::Garage;
|
||
|
use garage_model::k2v::causality::*;
|
||
|
use garage_model::k2v::item_table::*;
|
||
|
|
||
|
use crate::error::*;
|
||
|
use crate::k2v::range::read_range;
|
||
|
|
||
|
pub async fn handle_insert_batch(
|
||
|
garage: Arc<Garage>,
|
||
|
bucket_id: Uuid,
|
||
|
req: Request<Body>,
|
||
|
) -> Result<Response<Body>, Error> {
|
||
|
let body = hyper::body::to_bytes(req.into_body()).await?;
|
||
|
let items: Vec<InsertBatchItem> =
|
||
|
serde_json::from_slice(&body).ok_or_bad_request("Invalid JSON")?;
|
||
|
|
||
|
let mut items2 = vec![];
|
||
|
for it in items {
|
||
|
let ct = it
|
||
|
.ct
|
||
|
.map(|s| CausalContext::parse(&s))
|
||
|
.transpose()
|
||
|
.ok_or_bad_request("Invalid causality token")?;
|
||
|
let v = match it.v {
|
||
|
Some(vs) => {
|
||
|
DvvsValue::Value(base64::decode(vs).ok_or_bad_request("Invalid base64 value")?)
|
||
|
}
|
||
|
None => DvvsValue::Deleted,
|
||
|
};
|
||
|
items2.push((it.pk, it.sk, ct, v));
|
||
|
}
|
||
|
|
||
|
garage.k2v_rpc.insert_batch(bucket_id, items2).await?;
|
||
|
|
||
|
Ok(Response::builder()
|
||
|
.status(StatusCode::OK)
|
||
|
.body(Body::empty())?)
|
||
|
}
|
||
|
|
||
|
#[derive(Deserialize)]
|
||
|
struct InsertBatchItem {
|
||
|
pk: String,
|
||
|
sk: String,
|
||
|
ct: Option<String>,
|
||
|
v: Option<String>,
|
||
|
}
|