diff --git a/src/routes.rs b/src/routes.rs index 3b1c5ad..c06c2b9 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -10,6 +10,7 @@ use actix_files::NamedFile; use actix_web::error::{ErrorBadRequest, ErrorInternalServerError, ErrorNotFound}; use actix_web::http; use actix_web::{delete, error, get, post, put, web, Either, Error, HttpResponse}; +use anyhow::anyhow; use anyhow::Result; use futures_util::StreamExt; use log::{debug, info, trace}; @@ -164,28 +165,19 @@ pub async fn get_object( Ok(HttpResponse::Ok().json(result.as_hash().map_err(ErrorInternalServerError)?)) } -const MAX_SIZE: usize = 1_000_000; - #[put("/api/obj")] pub async fn put_object( state: web::Data, mut payload: web::Payload, ) -> Result { - let connection = state.upend.connection().map_err(ErrorInternalServerError)?; - - let mut body = web::BytesMut::new(); - while let Some(chunk) = payload.next().await { - let chunk = chunk?; - // limit max size of in-memory payload - if (body.len() + chunk.len()) > MAX_SIZE { - return Err(error::ErrorBadRequest("overflow.")); - } - body.extend_from_slice(&chunk); - } - + let body = load_body(&mut payload) + .await + .map_err(error::ErrorBadRequest)?; let in_entry = serde_json::from_slice::(&body).map_err(ErrorBadRequest)?; let entry = Entry::try_from(in_entry).map_err(ErrorInternalServerError)?; + let connection = state.upend.connection().map_err(ErrorInternalServerError)?; + let result_address = connection .insert_entry(entry.clone()) .map_err(ErrorInternalServerError)?; @@ -217,6 +209,31 @@ pub async fn delete_object( Ok(HttpResponse::Ok().finish()) } +// #[post("api/obj/{address_str}")] +// pub async fn update_attribute( +// state: web::Data, +// address_str: web::Path, +// mut payload: web::Payload, +// ) -> Result { +// let body = load_body(&mut payload) +// .await +// .map_err(error::ErrorBadRequest)?; +// let entry_value = serde_json::from_slice::(&body).map_err(ErrorBadRequest)?; + +// let connection = state.upend.connection().map_err(ErrorInternalServerError)?; + +// connection +// .transaction::<_, anyhow::Error, _>(|| { +// let address = Address::decode(&decode(address_str.into_inner())?)?; +// let _ = connection.remove_object(address)?; + +// Ok(()) +// }) +// .map_err(ErrorInternalServerError)?; + +// Ok(HttpResponse::Ok().finish()) +// } + #[get("/api/all/attributes")] pub async fn get_all_attributes(state: web::Data) -> Result { let connection = state.upend.connection().map_err(ErrorInternalServerError)?; @@ -349,3 +366,17 @@ pub async fn get_thumbnail( } Err(error::ErrorNotImplemented("Previews not enabled.")) } + +const MAX_BODY_SIZE: usize = 1_000_000; + +async fn load_body(payload: &mut web::Payload) -> Result> { + let mut body = web::BytesMut::new(); + while let Some(chunk) = payload.next().await { + let chunk = chunk?; + if (body.len() + chunk.len()) > MAX_BODY_SIZE { + return Err(anyhow!("OVERFLOW")); + } + body.extend_from_slice(&chunk); + } + Ok(body.as_ref().to_vec()) +}