preparations for a separate attr update endpoint
parent
052403bc05
commit
8ceb310d9e
|
@ -10,6 +10,7 @@ use actix_files::NamedFile;
|
||||||
use actix_web::error::{ErrorBadRequest, ErrorInternalServerError, ErrorNotFound};
|
use actix_web::error::{ErrorBadRequest, ErrorInternalServerError, ErrorNotFound};
|
||||||
use actix_web::http;
|
use actix_web::http;
|
||||||
use actix_web::{delete, error, get, post, put, web, Either, Error, HttpResponse};
|
use actix_web::{delete, error, get, post, put, web, Either, Error, HttpResponse};
|
||||||
|
use anyhow::anyhow;
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use futures_util::StreamExt;
|
use futures_util::StreamExt;
|
||||||
use log::{debug, info, trace};
|
use log::{debug, info, trace};
|
||||||
|
@ -164,28 +165,19 @@ pub async fn get_object(
|
||||||
Ok(HttpResponse::Ok().json(result.as_hash().map_err(ErrorInternalServerError)?))
|
Ok(HttpResponse::Ok().json(result.as_hash().map_err(ErrorInternalServerError)?))
|
||||||
}
|
}
|
||||||
|
|
||||||
const MAX_SIZE: usize = 1_000_000;
|
|
||||||
|
|
||||||
#[put("/api/obj")]
|
#[put("/api/obj")]
|
||||||
pub async fn put_object(
|
pub async fn put_object(
|
||||||
state: web::Data<State>,
|
state: web::Data<State>,
|
||||||
mut payload: web::Payload,
|
mut payload: web::Payload,
|
||||||
) -> Result<HttpResponse, Error> {
|
) -> Result<HttpResponse, Error> {
|
||||||
let connection = state.upend.connection().map_err(ErrorInternalServerError)?;
|
let body = load_body(&mut payload)
|
||||||
|
.await
|
||||||
let mut body = web::BytesMut::new();
|
.map_err(error::ErrorBadRequest)?;
|
||||||
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 in_entry = serde_json::from_slice::<InEntry>(&body).map_err(ErrorBadRequest)?;
|
let in_entry = serde_json::from_slice::<InEntry>(&body).map_err(ErrorBadRequest)?;
|
||||||
let entry = Entry::try_from(in_entry).map_err(ErrorInternalServerError)?;
|
let entry = Entry::try_from(in_entry).map_err(ErrorInternalServerError)?;
|
||||||
|
|
||||||
|
let connection = state.upend.connection().map_err(ErrorInternalServerError)?;
|
||||||
|
|
||||||
let result_address = connection
|
let result_address = connection
|
||||||
.insert_entry(entry.clone())
|
.insert_entry(entry.clone())
|
||||||
.map_err(ErrorInternalServerError)?;
|
.map_err(ErrorInternalServerError)?;
|
||||||
|
@ -217,6 +209,31 @@ pub async fn delete_object(
|
||||||
Ok(HttpResponse::Ok().finish())
|
Ok(HttpResponse::Ok().finish())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// #[post("api/obj/{address_str}")]
|
||||||
|
// pub async fn update_attribute(
|
||||||
|
// state: web::Data<State>,
|
||||||
|
// address_str: web::Path<String>,
|
||||||
|
// mut payload: web::Payload,
|
||||||
|
// ) -> Result<HttpResponse, Error> {
|
||||||
|
// let body = load_body(&mut payload)
|
||||||
|
// .await
|
||||||
|
// .map_err(error::ErrorBadRequest)?;
|
||||||
|
// let entry_value = serde_json::from_slice::<EntryValue>(&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")]
|
#[get("/api/all/attributes")]
|
||||||
pub async fn get_all_attributes(state: web::Data<State>) -> Result<HttpResponse, Error> {
|
pub async fn get_all_attributes(state: web::Data<State>) -> Result<HttpResponse, Error> {
|
||||||
let connection = state.upend.connection().map_err(ErrorInternalServerError)?;
|
let connection = state.upend.connection().map_err(ErrorInternalServerError)?;
|
||||||
|
@ -349,3 +366,17 @@ pub async fn get_thumbnail(
|
||||||
}
|
}
|
||||||
Err(error::ErrorNotImplemented("Previews not enabled."))
|
Err(error::ErrorNotImplemented("Previews not enabled."))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const MAX_BODY_SIZE: usize = 1_000_000;
|
||||||
|
|
||||||
|
async fn load_body(payload: &mut web::Payload) -> Result<Vec<u8>> {
|
||||||
|
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())
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue