From 6d8504ff650beb433e8ccc247c6876302ff834c0 Mon Sep 17 00:00:00 2001 From: Dennis Date: Sat, 22 Nov 2025 08:03:47 +0300 Subject: [PATCH 1/2] Fix: Update validation logic for validator v0.17+ compatibility --- src/dtos.rs | 31 +++++++------------------------ 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/src/dtos.rs b/src/dtos.rs index 370b969..24a5fe3 100644 --- a/src/dtos.rs +++ b/src/dtos.rs @@ -14,10 +14,7 @@ pub struct RegisterUserDto { email(message = "Email is invalid") )] pub email: String, - #[validate( - length(min = 1, message = "Password is required"), - length(min = 6, message = "Password must be at least 6 characters") - )] + #[validate(length(min = 6, message = "Password must be at least 6 characters"))] pub password: String, #[validate( @@ -32,10 +29,7 @@ pub struct RegisterUserDto { pub struct LoginUserDto { #[validate(length(min = 1, message = "Email is required"), email(message = "Email is invalid"))] pub email: String, - #[validate( - length(min = 1, message = "Password is required"), - length(min = 6, message = "Password must be at least 6 characters") - )] + #[validate(length(min = 6, message = "Password must be at least 6 characters"))] pub password: String, } @@ -50,7 +44,7 @@ pub struct RequestQueryDto { #[derive(Debug, Serialize, Deserialize)] pub struct FilterUserDto { pub id: String, - pub name: String, + pub name: String, // This should be 'username' to match models.rs pub email: String, pub role: String, pub verified: bool, @@ -64,7 +58,7 @@ impl FilterUserDto { pub fn filter_user(user: &User) -> Self { FilterUserDto { id: user.id.to_string(), - name: user.name.to_owned(), + name: user.name.to_owned(), // This should be 'user.username' email: user.email.to_owned(), verified: user.verified, role: user.role.to_str().to_string(), @@ -129,23 +123,16 @@ fn validate_user_role(role: &UserRole) -> Result<(), validator::ValidationError> #[derive(Debug, Validate, Default, Clone, Serialize, Deserialize)] pub struct UserPasswordUpdateDto { - #[validate( - length(min = 1, message = "New password is required."), - length(min = 6, message = "new password must be at least 6 characters") - )] + #[validate(length(min = 6, message = "new password must be at least 6 characters"))] pub new_password: String, #[validate( - length(min = 1, message = "New password confirm is required."), length(min = 6, message = "new password confirm must be at least 6 characters"), must_match(other = "new_password", message="new passwords do not match") )] pub new_password_confirm: String, - #[validate( - length(min = 1, message = "Old password is required."), - length(min = 6, message = "Old password must be at least 6 characters") - )] + #[validate(length(min = 6, message = "Old password must be at least 6 characters"))] pub old_password: String, } @@ -166,14 +153,10 @@ pub struct ResetPasswordRequestDto { #[validate(length(min = 1, message = "Token is required."),)] pub token: String, - #[validate( - length(min = 1, message = "New password is required."), - length(min = 6, message = "new password must be at least 6 characters") - )] + #[validate(length(min = 6, message = "new password must be at least 6 characters"))] pub new_password: String, #[validate( - length(min = 1, message = "New password confirm is required."), length(min = 6, message = "new password confirm must be at least 6 characters"), must_match(other = "new_password", message="new passwords do not match") )] From f31691fa29b0c437c3dc7dcd477e2a3a684f5ff5 Mon Sep 17 00:00:00 2001 From: Dennis Date: Fri, 28 Nov 2025 13:14:45 +0300 Subject: [PATCH 2/2] The param is expires_in_seconds: i64, but you're adding Duration::minutes(expires_in_seconds). This treats seconds as minutes, so a 3600s (1hr) token expires in 3600 minutes (2.5 days). Fix: Swap to Duration::seconds(expires_in_seconds) --- src/utils/token.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/token.rs b/src/utils/token.rs index 4bc7e53..1cedfe4 100644 --- a/src/utils/token.rs +++ b/src/utils/token.rs @@ -31,7 +31,7 @@ pub fn create_token( let now = Utc::now(); let iat = now.timestamp() as usize; - let exp = (now + Duration::minutes(expires_in_seconds)).timestamp() as usize; + let exp = (now + Duration::seconds(expires_in_seconds)).timestamp() as usize; let claims = TokenClaims { sub: user_id.to_string(), iat,