2023-09-30 11:26:47 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
forms.rs - All the forms
|
|
|
|
*/
|
|
|
|
|
|
|
|
use std::collections::HashMap;
|
|
|
|
|
2023-10-01 04:05:08 +02:00
|
|
|
use askama::Template;
|
2023-10-01 04:05:39 +02:00
|
|
|
use warp::{Filter, reply::Reply, reject::Rejection, filters::multipart::FormData, http::StatusCode};
|
2023-09-30 11:26:47 +02:00
|
|
|
use futures_util::TryStreamExt;
|
|
|
|
use bytes::BufMut;
|
|
|
|
|
2023-10-01 04:05:08 +02:00
|
|
|
use super::{state::SharedState, pages::BadActionReq, rejection::HttpReject};
|
2023-10-01 02:14:35 +02:00
|
|
|
|
|
|
|
pub async fn upload(form: FormData, _state: SharedState) -> Result<Box<dyn Reply>, Rejection> {
|
2023-09-30 11:26:47 +02:00
|
|
|
|
|
|
|
let params: HashMap<String, String> = form.and_then(|mut field| async move {
|
|
|
|
let mut bytes: Vec<u8> = vec![];
|
|
|
|
while let Some(byte) = field.data().await {
|
|
|
|
bytes.put(byte.unwrap())
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok((field.name().into(), String::from_utf8_lossy(&bytes).to_string()))
|
2023-10-01 04:05:08 +02:00
|
|
|
}).try_collect()
|
|
|
|
.await
|
|
|
|
.map_err(|err| warp::reject::custom(HttpReject::WarpError(err.into())))?;
|
|
|
|
|
|
|
|
// check that required fields exist
|
|
|
|
let mut all_exist = true;
|
|
|
|
let _ = vec!["delmode", "file"].iter().for_each(|x| {
|
|
|
|
let field = x.to_string();
|
|
|
|
if ! params.contains_key(&field) {
|
|
|
|
all_exist = false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
if ! all_exist {
|
|
|
|
return Ok(Box::new(
|
|
|
|
warp::reply::with_status(
|
|
|
|
warp::reply::html(
|
|
|
|
BadActionReq {}
|
|
|
|
.render()
|
|
|
|
.map_err(|err| warp::reject::custom(HttpReject::AskamaError(err.into())))?
|
|
|
|
),
|
|
|
|
StatusCode::BAD_REQUEST
|
|
|
|
)
|
|
|
|
))
|
|
|
|
}
|
2023-09-30 11:26:47 +02:00
|
|
|
|
|
|
|
Ok(Box::new(warp::reply::json(¶ms)))
|
|
|
|
}
|
|
|
|
|
2023-10-01 02:14:35 +02:00
|
|
|
pub fn get_routes(state: SharedState) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
|
2023-09-30 11:26:47 +02:00
|
|
|
warp::post().and(
|
2023-10-01 02:14:35 +02:00
|
|
|
warp::multipart::form()
|
|
|
|
.and(warp::any().map(move || state.clone()))
|
|
|
|
.and_then(upload)
|
2023-09-30 11:26:47 +02:00
|
|
|
)
|
|
|
|
}
|