diff --git a/.sqlx/query-3dd4a65d3106d742c2221c0589ac68d4621c6e351f9fbb7aa58629ff2d829234.json b/.sqlx/query-28910fe1287349babee7578fa647d031f4e3c94812d46e1c4afa73fa70059720.json similarity index 67% rename from .sqlx/query-3dd4a65d3106d742c2221c0589ac68d4621c6e351f9fbb7aa58629ff2d829234.json rename to .sqlx/query-28910fe1287349babee7578fa647d031f4e3c94812d46e1c4afa73fa70059720.json index 4f66675..28b4ab4 100644 --- a/.sqlx/query-3dd4a65d3106d742c2221c0589ac68d4621c6e351f9fbb7aa58629ff2d829234.json +++ b/.sqlx/query-28910fe1287349babee7578fa647d031f4e3c94812d46e1c4afa73fa70059720.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO folders(parent_folder_id, owner_id, folder_name) VALUES ($1, $2, $3) RETURNING folder_id", + "query": "INSERT INTO folders(parent_folder_id, owner_id, folder_name)\nSELECT $1, owner_id, $2 FROM folders WHERE parent_folder_id = $1\nRETURNING folder_id", "describe": { "columns": [ { @@ -12,7 +12,6 @@ "parameters": { "Left": [ "Uuid", - "Int4", "Varchar" ] }, @@ -20,5 +19,5 @@ false ] }, - "hash": "3dd4a65d3106d742c2221c0589ac68d4621c6e351f9fbb7aa58629ff2d829234" + "hash": "28910fe1287349babee7578fa647d031f4e3c94812d46e1c4afa73fa70059720" } diff --git a/.sqlx/query-3028a7c8ec616933e490ed267967b1406552c2b7c69f4f1f02a147df5411e692.json b/.sqlx/query-3028a7c8ec616933e490ed267967b1406552c2b7c69f4f1f02a147df5411e692.json index 9bea034..4e843a8 100644 --- a/.sqlx/query-3028a7c8ec616933e490ed267967b1406552c2b7c69f4f1f02a147df5411e692.json +++ b/.sqlx/query-3028a7c8ec616933e490ed267967b1406552c2b7c69f4f1f02a147df5411e692.json @@ -21,7 +21,7 @@ { "ordinal": 3, "name": "created_at", - "type_info": "Timestamp" + "type_info": "Timestamptz" } ], "parameters": { diff --git a/.sqlx/query-8d8bf29e632723ba48a19ea52a8466424f7628e84df17178bf26eaca1cc99aca.json b/.sqlx/query-e0d415b13ccf7aa865558395eb6997bfff50762d36cf3742470a897f4588c802.json similarity index 87% rename from .sqlx/query-8d8bf29e632723ba48a19ea52a8466424f7628e84df17178bf26eaca1cc99aca.json rename to .sqlx/query-e0d415b13ccf7aa865558395eb6997bfff50762d36cf3742470a897f4588c802.json index 6fd00b7..3aad444 100644 --- a/.sqlx/query-8d8bf29e632723ba48a19ea52a8466424f7628e84df17178bf26eaca1cc99aca.json +++ b/.sqlx/query-e0d415b13ccf7aa865558395eb6997bfff50762d36cf3742470a897f4588c802.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n user_id, username, email, \n GREATEST (\n similarity (email, $1),\n similarity (username, $1)\n ) as \"similarity!\"\nFROM\n users\nORDER BY\n \"similarity!\" DESC", + "query": "SELECT\n user_id, username, email, \n GREATEST (\n similarity (email, $1),\n similarity (username, $1)\n ) as \"similarity!\"\nFROM\n users\nORDER BY\n \"similarity!\" DESC\nLIMIT 20", "describe": { "columns": [ { @@ -36,5 +36,5 @@ null ] }, - "hash": "8d8bf29e632723ba48a19ea52a8466424f7628e84df17178bf26eaca1cc99aca" + "hash": "e0d415b13ccf7aa865558395eb6997bfff50762d36cf3742470a897f4588c802" } diff --git a/.sqlx/query-e125c9f06cb89c6ddd2653ed45c576da3aecfb9fb74aabf202e83406fc8c8fff.json b/.sqlx/query-e125c9f06cb89c6ddd2653ed45c576da3aecfb9fb74aabf202e83406fc8c8fff.json index f558664..71e5a4a 100644 --- a/.sqlx/query-e125c9f06cb89c6ddd2653ed45c576da3aecfb9fb74aabf202e83406fc8c8fff.json +++ b/.sqlx/query-e125c9f06cb89c6ddd2653ed45c576da3aecfb9fb74aabf202e83406fc8c8fff.json @@ -26,12 +26,12 @@ { "ordinal": 4, "name": "created_at", - "type_info": "Timestamp" + "type_info": "Timestamptz" }, { "ordinal": 5, "name": "updated_at", - "type_info": "Timestamp" + "type_info": "Timestamptz" } ], "parameters": { diff --git a/.sqlx/query-ef707c0f6d2ef0d66e71929167b5c82bb8bf923736e6c797711bc3124f0693bc.json b/.sqlx/query-ef707c0f6d2ef0d66e71929167b5c82bb8bf923736e6c797711bc3124f0693bc.json index ddb54f2..ab493b4 100644 --- a/.sqlx/query-ef707c0f6d2ef0d66e71929167b5c82bb8bf923736e6c797711bc3124f0693bc.json +++ b/.sqlx/query-ef707c0f6d2ef0d66e71929167b5c82bb8bf923736e6c797711bc3124f0693bc.json @@ -21,7 +21,7 @@ { "ordinal": 3, "name": "created_at", - "type_info": "Timestamp" + "type_info": "Timestamptz" } ], "parameters": { diff --git a/Cargo.lock b/Cargo.lock index deb4d1c..d1443a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -321,9 +321,9 @@ checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cc" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" +checksum = "504bdec147f2cc13c8b57ed9401fd8a147cc66b67ad5cb241394244f2c947549" dependencies = [ "jobserver", "libc", @@ -920,9 +920,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" +checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" dependencies = [ "bytes", "futures-util", @@ -1259,9 +1259,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.2" +version = "0.36.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" +checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" dependencies = [ "memchr", ] @@ -1731,18 +1731,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.204" +version = "1.0.205" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.204" +version = "1.0.205" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1" dependencies = [ "proc-macro2", "quote", @@ -2156,15 +2156,15 @@ checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" [[package]] name = "tempfile" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fcd239983515c23a32fb82099f97d0b11b8c72f654ed659363a95c3dad7a53" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2653,6 +2653,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-targets" version = "0.48.5" diff --git a/sql/search_for_user.sql b/sql/search_for_user.sql index 0e3167e..88ee491 100644 --- a/sql/search_for_user.sql +++ b/sql/search_for_user.sql @@ -7,4 +7,5 @@ SELECT FROM users ORDER BY - "similarity!" DESC \ No newline at end of file + "similarity!" DESC +LIMIT 20 \ No newline at end of file diff --git a/src/db/file.rs b/src/db/file.rs index e612692..4204684 100644 --- a/src/db/file.rs +++ b/src/db/file.rs @@ -67,10 +67,11 @@ pub async fn get_permissions( } pub async fn get_name(file_id: Uuid, pool: &Pool) -> sqlx::Result> { - let record = sqlx::query!("SELECT file_name FROM files WHERE file_id = $1", file_id) + let name = sqlx::query!("SELECT file_name FROM files WHERE file_id = $1", file_id) .fetch_optional(pool) - .await?; - Ok(record.map(|record| record.file_name)) + .await? + .map(|record| record.file_name); + Ok(name) } pub async fn delete(file_id: Uuid, pool: &Pool) -> sqlx::Result { diff --git a/src/db/users.rs b/src/db/users.rs index a422f5c..0fe1932 100644 --- a/src/db/users.rs +++ b/src/db/users.rs @@ -80,7 +80,7 @@ pub async fn get(user_id: i32, pool: &Pool) -> sqlx::Result> { .await } -/// Gets the hashed password field by either the email or th username +/// Gets the hashed password field by either the email or the username pub async fn get_hash(search_string: &str, pool: &Pool) -> sqlx::Result)>> { let record = sqlx::query!( "SELECT user_id, hashed_password FROM users WHERE username = $1 OR email = $1", diff --git a/src/endpoints/file/delete.rs b/src/endpoints/file/delete.rs index 434857e..f47a5ac 100644 --- a/src/endpoints/file/delete.rs +++ b/src/endpoints/file/delete.rs @@ -14,15 +14,9 @@ pub async fn delete( .await .can_write_guard()?; - let deleted = db::file::delete(params.file_id, &state.pool) + db::file::delete(params.file_id, &state.pool) .await .handle_internal("Error deleting the file")?; - if !deleted { - return Err(GeneralError::message( - StatusCode::NOT_FOUND, - "Item not found", - )); // Will not happen most of the time due to can write guard - } state .storage diff --git a/src/endpoints/folder/get_structure.rs b/src/endpoints/folder/get_structure.rs index da67ab2..472981f 100644 --- a/src/endpoints/folder/get_structure.rs +++ b/src/endpoints/folder/get_structure.rs @@ -1,3 +1,4 @@ +use db::{file::FileWithoutParentId, folder::FolderWithoutParentId}; use tokio::try_join; use super::list::Params; @@ -6,13 +7,13 @@ use crate::prelude::*; #[derive(Serialize, Debug)] pub struct FolderStructure { #[serde(flatten)] - folder_base: db::folder::FolderWithoutParentId, + folder_base: FolderWithoutParentId, folders: Vec, - files: Vec, + files: Vec, } -impl From for FolderStructure { - fn from(value: db::folder::FolderWithoutParentId) -> Self { +impl From for FolderStructure { + fn from(value: FolderWithoutParentId) -> Self { FolderStructure { folder_base: value, folders: Vec::new(), diff --git a/src/endpoints/permissions/set.rs b/src/endpoints/permissions/set.rs index 768618c..f64266a 100644 --- a/src/endpoints/permissions/set.rs +++ b/src/endpoints/permissions/set.rs @@ -18,7 +18,7 @@ pub async fn set( if params.folder_id == root { return Err(GeneralError::message( StatusCode::BAD_REQUEST, - "Cannot delete the root folder", + "Cannot set permissions for the root folder", )); } @@ -33,7 +33,7 @@ pub async fn set( if folder_info.owner_id == params.user_id { return Err(GeneralError::message( StatusCode::BAD_REQUEST, - "Cannot set permissions of the folder owner", + "Cannot set permissions of the folder's owner", )); } diff --git a/src/endpoints/users/get.rs b/src/endpoints/users/get.rs index 96f040c..95fea3e 100644 --- a/src/endpoints/users/get.rs +++ b/src/endpoints/users/get.rs @@ -8,11 +8,11 @@ pub struct Params { type Response = GeneralResult>; pub async fn get(State(pool): State, Query(params): Query) -> Response { - let info = db::users::get(params.user_id, &pool) + db::users::get(params.user_id, &pool) .await .handle_internal("Error getting the user")? - .handle(StatusCode::NOT_FOUND, "User not found")?; - Ok(Json(info)) + .handle(StatusCode::NOT_FOUND, "User not found") + .map(Json) } pub async fn current(state: State, claims: Claims) -> Response { diff --git a/src/endpoints/users/put.rs b/src/endpoints/users/put.rs index 763317f..c1de3d2 100644 --- a/src/endpoints/users/put.rs +++ b/src/endpoints/users/put.rs @@ -15,7 +15,7 @@ pub async fn put( claims: Claims, Json(params): Json, ) -> GeneralResult> { - params.validate().handle_validation()?; + params.validate()?; db::users::update(claims.user_id, ¶ms.username, ¶ms.email, &pool) .await .handle_internal("Error updating the user") diff --git a/src/endpoints/users/register.rs b/src/endpoints/users/register.rs index 81447be..5a4343d 100644 --- a/src/endpoints/users/register.rs +++ b/src/endpoints/users/register.rs @@ -48,7 +48,7 @@ pub async fn register( State(pool): State, Form(params): Form, ) -> GeneralResult> { - params.validate().handle_validation()?; + params.validate()?; let password = HashedBytes::hash_bytes(params.password.as_bytes()).as_bytes(); let id = db::users::create_user(¶ms.username, ¶ms.email, &password, &pool) diff --git a/src/errors.rs b/src/errors.rs index b82bb46..15e9ff2 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -41,6 +41,12 @@ impl IntoResponse for GeneralError { } } +impl From for GeneralError { + fn from(value: validator::ValidationErrors) -> Self { + GeneralError::message(StatusCode::BAD_REQUEST, value.to_string()) + } +} + pub type GeneralResult = Result; pub trait ErrorHandlingExt @@ -92,19 +98,6 @@ pub trait ItemNotFoundExt { impl ItemNotFoundExt for Option { fn item_not_found(self) -> GeneralResult { - self.ok_or(GeneralError::const_message( - StatusCode::NOT_FOUND, - "Item not found", - )) - } -} - -pub trait ValidationExt { - fn handle_validation(self) -> GeneralResult; -} - -impl ValidationExt for Result { - fn handle_validation(self) -> GeneralResult { - self.map_err(|err| GeneralError::message(StatusCode::BAD_REQUEST, err.to_string())) + self.handle(StatusCode::NOT_FOUND, "Item not found") } } diff --git a/src/prelude.rs b/src/prelude.rs index 92d18f5..a97b938 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -1,10 +1,7 @@ pub(crate) use crate::{ auth::Claims, db::{self, permissions::PermissionExt as _}, - errors::{ - ErrorHandlingExt as _, GeneralError, GeneralResult, ItemNotFoundExt as _, - ValidationExt as _, - }, + errors::{ErrorHandlingExt as _, GeneralError, GeneralResult, ItemNotFoundExt as _}, AppState, Pool, }; pub use axum::{