From 7669a02a9589e10d9ca00f896c77f40278e31176 Mon Sep 17 00:00:00 2001 From: StNicolay Date: Sun, 4 Aug 2024 12:34:46 +0300 Subject: [PATCH] Cleanup --- src/db/file.rs | 7 ++----- src/db/folder.rs | 5 +---- src/db/permissions.rs | 7 +------ src/db/users.rs | 6 +----- src/endpoints/authorization/register.rs | 2 ++ src/endpoints/file/upload.rs | 8 +++++++- src/endpoints/folder/delete.rs | 2 -- src/endpoints/folder/get_structure.rs | 4 +++- src/endpoints/folder/list.rs | 1 - src/endpoints/permissions/set.rs | 8 ++++++++ src/endpoints/users/delete.rs | 2 -- src/endpoints/users/put.rs | 6 +++--- src/endpoints/users/search.rs | 8 +++----- src/file_storage.rs | 7 +++++-- src/prelude.rs | 2 +- 15 files changed, 37 insertions(+), 38 deletions(-) diff --git a/src/db/file.rs b/src/db/file.rs index 39f59e6..7edae15 100644 --- a/src/db/file.rs +++ b/src/db/file.rs @@ -1,9 +1,6 @@ -use futures::Stream; -use uuid::Uuid; +use db::permissions::PermissionType; -use crate::Pool; - -use super::permissions::PermissionType; +use crate::prelude::*; pub async fn insert( file_id: Uuid, diff --git a/src/db/folder.rs b/src/db/folder.rs index 9420521..c6f92e0 100644 --- a/src/db/folder.rs +++ b/src/db/folder.rs @@ -1,7 +1,4 @@ -use futures::{Stream, TryStreamExt}; -use uuid::Uuid; - -use crate::{db::permissions::PermissionRaw, Pool}; +use crate::{db::permissions::PermissionRaw, prelude::*}; use super::permissions::PermissionType; diff --git a/src/db/permissions.rs b/src/db/permissions.rs index 5a1e72c..16690fa 100644 --- a/src/db/permissions.rs +++ b/src/db/permissions.rs @@ -1,11 +1,6 @@ use std::collections::HashMap; -use axum::http::StatusCode; -use futures::TryStreamExt as _; -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -use crate::Pool; +use crate::prelude::*; #[derive(sqlx::Type, Debug, Serialize, Deserialize)] #[sqlx(type_name = "permission")] diff --git a/src/db/users.rs b/src/db/users.rs index 0d25cac..a422f5c 100644 --- a/src/db/users.rs +++ b/src/db/users.rs @@ -1,8 +1,4 @@ -use futures::{stream::BoxStream, Stream, TryStreamExt}; -use serde::Serialize; -use uuid::Uuid; - -use crate::Pool; +use crate::prelude::*; /// Creates user and returns its id pub async fn create_user( diff --git a/src/endpoints/authorization/register.rs b/src/endpoints/authorization/register.rs index 0130b89..2597966 100644 --- a/src/endpoints/authorization/register.rs +++ b/src/endpoints/authorization/register.rs @@ -52,6 +52,7 @@ pub async fn register( params .validate() .map_err(|err| Either::E1((StatusCode::BAD_REQUEST, err.to_string())))?; + let password = HashedBytes::hash_bytes(params.password.as_bytes()).as_bytes(); let Some(id) = db::users::create_user(¶ms.username, ¶ms.email, &password, &pool) .await @@ -63,6 +64,7 @@ pub async fn register( "Either the user name or the email are taken".to_owned(), ))); }; + let token = Claims::new(id).encode().map_err(Either::E2)?; Ok(Json(token)) } diff --git a/src/endpoints/file/upload.rs b/src/endpoints/file/upload.rs index 1d47c4b..c71ff6d 100644 --- a/src/endpoints/file/upload.rs +++ b/src/endpoints/file/upload.rs @@ -1,7 +1,6 @@ use std::collections::{HashMap, HashSet}; use axum::extract::multipart::{self, Multipart}; -use futures::TryStreamExt; use tokio::io::AsyncWrite; use crate::prelude::*; @@ -47,6 +46,7 @@ pub async fn upload( .try_collect() .await .handle_internal()?; + let mut result = HashMap::new(); while let Ok(Some(mut field)) = multi.next_field().await { let Some(file_name) = field.file_name().map(ToOwned::to_owned) else { @@ -55,10 +55,15 @@ pub async fn upload( if existing_names.contains(&file_name) { continue; } + if file_name.len() > 50 { + continue; + } + let Ok((file_id, mut file)) = state.storage.create().await else { tracing::warn!("Couldn't create uuid for new file"); continue; }; + let is_success = create_file( file_id, &mut file, @@ -72,6 +77,7 @@ pub async fn upload( let _ = state.storage.delete(file_id).await; continue; } + result.insert(file_name, file_id); } diff --git a/src/endpoints/folder/delete.rs b/src/endpoints/folder/delete.rs index 781897e..0f9440c 100644 --- a/src/endpoints/folder/delete.rs +++ b/src/endpoints/folder/delete.rs @@ -1,5 +1,3 @@ -use futures::TryStreamExt; - use crate::prelude::*; #[derive(Deserialize, Debug)] diff --git a/src/endpoints/folder/get_structure.rs b/src/endpoints/folder/get_structure.rs index 812df99..67c220a 100644 --- a/src/endpoints/folder/get_structure.rs +++ b/src/endpoints/folder/get_structure.rs @@ -1,4 +1,3 @@ -use futures::TryStreamExt; use tokio::try_join; use super::list::Params; @@ -31,10 +30,12 @@ pub async fn structure( .await .handle_internal()? .ok_or(StatusCode::NOT_FOUND)?; + let folder = db::folder::get_by_id(folder_id, &pool) .await .handle_internal()? .ok_or(StatusCode::NOT_FOUND)?; + let mut response: FolderStructure = folder.into(); let mut stack = vec![&mut response]; while let Some(folder) = stack.pop() { @@ -49,5 +50,6 @@ pub async fn structure( folder.files = files; stack.extend(folder.folders.iter_mut()); } + Ok(Json(response)) } diff --git a/src/endpoints/folder/list.rs b/src/endpoints/folder/list.rs index 8c85704..4168b2a 100644 --- a/src/endpoints/folder/list.rs +++ b/src/endpoints/folder/list.rs @@ -1,4 +1,3 @@ -use futures::TryStreamExt; use tokio::try_join; use crate::prelude::*; diff --git a/src/endpoints/permissions/set.rs b/src/endpoints/permissions/set.rs index 5634381..238e66e 100644 --- a/src/endpoints/permissions/set.rs +++ b/src/endpoints/permissions/set.rs @@ -26,6 +26,14 @@ pub async fn set( .handle_internal()? .can_manage_guard()?; + let folder_info = db::folder::get_by_id(params.folder_id, &pool) + .await + .handle_internal()? + .ok_or(StatusCode::NOT_FOUND)?; + if folder_info.owner_id == params.user_id { + return Err(StatusCode::BAD_REQUEST); + } + db::permissions::insert( params.user_id, params.folder_id, diff --git a/src/endpoints/users/delete.rs b/src/endpoints/users/delete.rs index 40f7f2a..427b9a2 100644 --- a/src/endpoints/users/delete.rs +++ b/src/endpoints/users/delete.rs @@ -1,5 +1,3 @@ -use futures::TryStreamExt; - use crate::prelude::*; pub async fn delete( diff --git a/src/endpoints/users/put.rs b/src/endpoints/users/put.rs index 8a8cdbf..394421b 100644 --- a/src/endpoints/users/put.rs +++ b/src/endpoints/users/put.rs @@ -18,9 +18,9 @@ pub async fn put( params .validate() .map_err(|err| (StatusCode::BAD_REQUEST, err.to_string()))?; - let info = db::users::update(claims.user_id, ¶ms.username, ¶ms.email, &pool) + db::users::update(claims.user_id, ¶ms.username, ¶ms.email, &pool) .await .handle_internal() - .map_err(|status| (status, String::new()))?; - Ok(Json(info)) + .map_err(|status| (status, String::new())) + .map(Json) } diff --git a/src/endpoints/users/search.rs b/src/endpoints/users/search.rs index 4bf3d77..b699507 100644 --- a/src/endpoints/users/search.rs +++ b/src/endpoints/users/search.rs @@ -1,5 +1,3 @@ -use futures::{future, TryStreamExt}; - use crate::prelude::*; #[derive(Deserialize, Debug)] @@ -11,11 +9,11 @@ pub async fn search( State(pool): State, Query(params): Query, ) -> sqlx::Result>, StatusCode> { - let users = db::users::search_for_user(¶ms.search_string, &pool) + db::users::search_for_user(¶ms.search_string, &pool) .take(20) .try_filter(|user| future::ready(user.similarity > 0.1)) .try_collect() .await - .handle_internal()?; - Ok(Json(users)) + .handle_internal() + .map(Json) } diff --git a/src/file_storage.rs b/src/file_storage.rs index 2c3e6ab..8a69fb1 100644 --- a/src/file_storage.rs +++ b/src/file_storage.rs @@ -5,14 +5,14 @@ use std::{ }; use axum::body::Bytes; -use futures::{Stream, StreamExt}; use sha2::Digest as _; use tokio::{ fs, io::{AsyncWrite, AsyncWriteExt, BufWriter}, }; use tokio_util::io::StreamReader; -use uuid::Uuid; + +use crate::prelude::*; #[derive(Clone)] pub struct FileStorage(Arc); @@ -95,6 +95,7 @@ impl FileStorage { const BUF_CAP: usize = 64 * 1024 * 1024; // 64 MiB let mut hash = sha2::Sha512::new(); let mut size: i64 = 0; + let stream = stream.map(|value| { let bytes = value.map_err(io::Error::other)?; hash.update(&bytes); @@ -104,10 +105,12 @@ impl FileStorage { .ok_or_else(|| io::Error::other(anyhow::anyhow!("Size calculation overflow")))?; io::Result::Ok(bytes) }); + let mut reader = StreamReader::new(stream); let mut writer = BufWriter::with_capacity(BUF_CAP, file); tokio::io::copy_buf(&mut reader, &mut writer).await?; writer.flush().await?; + let hash = hash.finalize().to_vec(); Ok((hash, size)) } diff --git a/src/prelude.rs b/src/prelude.rs index 2ac8308..6bf2b80 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -3,6 +3,6 @@ pub use axum::{ extract::{Json, Query, State}, http::StatusCode, }; -pub use futures::StreamExt as _; +pub use futures::{future, stream::BoxStream, Stream, StreamExt as _, TryStreamExt as _}; pub use serde::{Deserialize, Serialize}; pub use uuid::Uuid;