From 3861bfc1e2975a9e81eed4c9cb56ecd4fdd0559a Mon Sep 17 00:00:00 2001 From: brizzinck <87083857+brizzinck@users.noreply.github.com> Date: Wed, 8 Jan 2025 15:45:12 +0200 Subject: [PATCH] feat: registration by tg --- src/api/hackathon_2024/user/post.rs | 46 +++++-------------- src/dto/request/hackathon_2024/user.rs | 1 + src/models/hackathon_2024/user.rs | 3 ++ src/server.rs | 2 +- src/utils/actions/send_letter.rs | 1 + src/utils/env_configuration.rs | 1 + src/utils/security.rs | 1 + src/utils/validation/data/fields.rs | 12 +++++ .../validation/data/hackathon_2024/team.rs | 5 +- .../validation/data/hackathon_2024/user.rs | 4 +- src/utils/validation/validation_string.rs | 10 ++++ 11 files changed, 46 insertions(+), 40 deletions(-) diff --git a/src/api/hackathon_2024/user/post.rs b/src/api/hackathon_2024/user/post.rs index f4ed915..5a79856 100644 --- a/src/api/hackathon_2024/user/post.rs +++ b/src/api/hackathon_2024/user/post.rs @@ -1,57 +1,33 @@ use crate::dto::request::hackathon_2024::user::RegistrationData; -use crate::models::hackathon_2024::user::UserJwt; -use crate::utils::actions; use crate::utils::prelude_api::*; -use crate::utils::security::{encoded_data, verify_password}; +use crate::utils::security::verify_password; use crate::utils::validation; use rocket::post; -#[post("/hackathon_2024/user/try_registration", data = "")] -pub async fn try_registration( +#[post("/hackathon_2024/user/registration_by_tg", data = "")] +pub async fn registration_by_tg( db_pool: &DbState, - registration_data: Json, + data: Json, ) -> Result<(), ApiError> { - let registration_data = registration_data.into_inner(); + let data = data.into_inner(); let RegistrationData { user_data, team_data, - .. - } = registration_data; + } = data; validation::data::hackathon_2024::team::check_team_password(team_data.password.as_str())?; validation::data::hackathon_2024::user::field(&user_data)?; let team = crate::diesel::utils::hackathon_2024::team::fetch::by_id(db_pool, team_data.id)?; - verify_password(team_data.password, team.password_registration.as_str())?; - - let _ = crate::diesel::utils::hackathon_2024::university::fetch::by_id( - db_pool, - user_data.university_id, + verify_password( + team_data.password.as_str(), + team.password_registration.as_str(), )?; - let jwt_user = UserJwt::from(&user_data, 5); - - let token = encoded_data(&jwt_user)?; + let id = crate::diesel::utils::hackathon_2024::user::insert::new(db_pool, user_data)?; - actions::send_letter::send_letter( - "HACKATHON".to_owned(), - format!( - " - -

Hello!

- Accept - - ", - token - ) - .to_string(), - user_data.nickname_tg.to_owned(), - )?; + info!("Succeed create user with id {id}"); - info!( - "verify email sent to {}, jwt token - {token}", - user_data.nickname_tg - ); Ok(()) } diff --git a/src/dto/request/hackathon_2024/user.rs b/src/dto/request/hackathon_2024/user.rs index 3162a0a..fec945f 100644 --- a/src/dto/request/hackathon_2024/user.rs +++ b/src/dto/request/hackathon_2024/user.rs @@ -2,6 +2,7 @@ use crate::diesel::models::hackathon_2024::user::HackathonUser2024Insertable; use crate::dto::request::hackathon_2024::team::TeamRegistrationData; use serde::Deserialize; +#[non_exhaustive] #[derive(Deserialize)] pub struct RegistrationData { pub user_data: HackathonUser2024Insertable, diff --git a/src/models/hackathon_2024/user.rs b/src/models/hackathon_2024/user.rs index dadf6ec..dad3491 100644 --- a/src/models/hackathon_2024/user.rs +++ b/src/models/hackathon_2024/user.rs @@ -1,6 +1,7 @@ use crate::diesel::models::hackathon_2024::user::HackathonUser2024Insertable; use serde::{Deserialize, Serialize}; +#[allow(dead_code)] #[derive(Debug, Serialize, Deserialize)] pub struct UserJwt { pub first_name: String, @@ -13,6 +14,7 @@ pub struct UserJwt { } impl UserJwt { + #[allow(dead_code)] pub fn from(data: &HackathonUser2024Insertable, exp: i64) -> Self { let exp = chrono::Utc::now() .checked_add_signed(chrono::Duration::minutes(exp)) @@ -28,6 +30,7 @@ impl UserJwt { exp, } } + #[allow(dead_code)] pub fn into(self) -> HackathonUser2024Insertable { HackathonUser2024Insertable { first_name: self.first_name, diff --git a/src/server.rs b/src/server.rs index 5ae0252..b3e27dd 100644 --- a/src/server.rs +++ b/src/server.rs @@ -67,7 +67,7 @@ impl Server { // /test/* api::test::get::ping, // /hackathon_2024/user/* - api::hackathon_2024::user::post::try_registration, + api::hackathon_2024::user::post::registration_by_tg, api::hackathon_2024::user::get::confirm_new_user, api::hackathon_2024::user::get::all, api::hackathon_2024::user::put::by_id, diff --git a/src/utils/actions/send_letter.rs b/src/utils/actions/send_letter.rs index 9ed784e..53ad130 100644 --- a/src/utils/actions/send_letter.rs +++ b/src/utils/actions/send_letter.rs @@ -3,6 +3,7 @@ use crate::utils::env_configuration::EnvConfiguration; use lettre::transport::smtp::authentication::Credentials; use lettre::{Message, SmtpTransport, Transport}; +#[allow(dead_code)] pub fn send_letter( title_letter: String, body_letter: String, diff --git a/src/utils/env_configuration.rs b/src/utils/env_configuration.rs index 43af6f2..9383380 100644 --- a/src/utils/env_configuration.rs +++ b/src/utils/env_configuration.rs @@ -13,6 +13,7 @@ pub struct EnvConfiguration { pub main_url: String, #[allow(dead_code)] pub smtp_email: String, + #[allow(dead_code)] pub smtp_password: String, pub server_port: u16, /* WILL UNCOMMENT WHEN IN SCHEMA.RS EXISTS USER_ROLE!!! diff --git a/src/utils/security.rs b/src/utils/security.rs index fb3dbe4..a2921e4 100644 --- a/src/utils/security.rs +++ b/src/utils/security.rs @@ -34,6 +34,7 @@ pub fn decoded_data( .map_err(|err| ApiError::TokenDecodeError(err.to_string())) } +#[allow(dead_code)] pub fn encoded_data(value: &T) -> Result { encode( &Header::new(Algorithm::HS512), diff --git a/src/utils/validation/data/fields.rs b/src/utils/validation/data/fields.rs index 8712fb3..fba398c 100644 --- a/src/utils/validation/data/fields.rs +++ b/src/utils/validation/data/fields.rs @@ -1,6 +1,7 @@ use crate::error::api_error::ApiError; use crate::utils::validation::validation_string::Validate; +#[allow(dead_code)] pub fn check_email(email: impl AsRef, error_message: impl AsRef) -> Result<(), ApiError> { if email.as_ref().is_email() { Ok(()) @@ -9,6 +10,17 @@ pub fn check_email(email: impl AsRef, error_message: impl AsRef) -> Re } } +pub fn check_nickname_tg( + nickname_tg: impl AsRef, + error_message: impl AsRef, +) -> Result<(), ApiError> { + if nickname_tg.as_ref().is_nickname_tg() { + Ok(()) + } else { + Err(ApiError::ValidationError(error_message.as_ref().to_owned())) + } +} + pub fn check_name( name: impl AsRef, length: usize, diff --git a/src/utils/validation/data/hackathon_2024/team.rs b/src/utils/validation/data/hackathon_2024/team.rs index 095343e..3eca7df 100644 --- a/src/utils/validation/data/hackathon_2024/team.rs +++ b/src/utils/validation/data/hackathon_2024/team.rs @@ -1,10 +1,10 @@ use crate::diesel::models::hackathon_2024::team::HackathonTeam2024Insertable; use crate::error::api_error::ApiError; -use crate::utils::validation::data::fields::{check_email, check_name, check_password}; +use crate::utils::validation::data::fields::{check_name, check_nickname_tg, check_password}; #[allow(dead_code)] pub fn field(new_team: &HackathonTeam2024Insertable) -> Result<(), ApiError> { - check_email( + check_nickname_tg( &new_team.nickname_tg, format!("Email don't correct {}", new_team.nickname_tg).as_str(), )?; @@ -30,5 +30,6 @@ pub fn check_team_password(password: impl AsRef) -> Result<(), ApiError> { ) .as_str(), )?; + Ok(()) } diff --git a/src/utils/validation/data/hackathon_2024/user.rs b/src/utils/validation/data/hackathon_2024/user.rs index 2f82568..b3c9e6f 100644 --- a/src/utils/validation/data/hackathon_2024/user.rs +++ b/src/utils/validation/data/hackathon_2024/user.rs @@ -1,9 +1,9 @@ use crate::diesel::models::hackathon_2024::user::HackathonUser2024Insertable; use crate::error::api_error::ApiError; -use crate::utils::validation::data::fields::{check_email, check_name, check_phone}; +use crate::utils::validation::data::fields::{check_name, check_nickname_tg, check_phone}; pub fn field(new_user: &HackathonUser2024Insertable) -> Result<(), ApiError> { - check_email( + check_nickname_tg( new_user.nickname_tg.as_str(), format!("Email don't correct {}", new_user.nickname_tg), )?; diff --git a/src/utils/validation/validation_string.rs b/src/utils/validation/validation_string.rs index 61c47cb..a3e6c81 100644 --- a/src/utils/validation/validation_string.rs +++ b/src/utils/validation/validation_string.rs @@ -10,6 +10,9 @@ pub trait Validate { #[allow(dead_code)] fn is_email(&self) -> bool; + #[allow(dead_code)] + fn is_nickname_tg(&self) -> bool; + #[allow(dead_code)] fn is_phone(&self) -> bool; @@ -33,6 +36,13 @@ impl> Validate for T { } } + fn is_nickname_tg(&self) -> bool { + match Regex::new(r"(?i)^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$") { + Ok(nickname_regex) => nickname_regex.is_match(self.as_ref()), + Err(_) => false, + } + } + fn is_phone(&self) -> bool { match Regex::new(r"^(\+380|0)\d{9}$") { Ok(phone_regex) => phone_regex.is_match(self.as_ref()),