use axum::extract::Multipart; use crate::prelude::*; #[derive(Deserialize, Debug)] pub struct Params { file_id: Uuid, } pub async fn modify( Query(params): Query, State(state): State, claims: Claims, mut multipart: Multipart, ) -> Result { db::file::get_permissions(params.file_id, claims.user_id, &state.pool) .await .handle_internal()? .can_write_guard()?; // Very weird work around let mut field = loop { match multipart.next_field().await { Ok(Some(field)) if field.file_name().is_some() => break field, Ok(Some(_)) => continue, _ => return Err(StatusCode::BAD_REQUEST), } }; let mut file = state .storage .write(params.file_id) .await .handle_internal()? .ok_or(StatusCode::NOT_FOUND)?; let (hash, size) = match crate::FileStorage::write_to_file(&mut file, &mut field).await { Ok(values) => values, Err(err) => { tracing::warn!(%err); return Err(StatusCode::INTERNAL_SERVER_ERROR); } }; db::file::update(params.file_id, size, hash, &state.pool) .await .handle_internal()?; Ok(StatusCode::NO_CONTENT) }