diff --git a/src/api/handlers/admin_user/admin_user_forgot_password_api_handler.rs b/src/api/handlers/admin_user/admin_user_forgot_password_api_handler.rs index b69e2657..68c351da 100644 --- a/src/api/handlers/admin_user/admin_user_forgot_password_api_handler.rs +++ b/src/api/handlers/admin_user/admin_user_forgot_password_api_handler.rs @@ -1,12 +1,13 @@ use crate::api::handlers::admin_user::request::admin_user_forgot_password_request::AdminUserForgotPasswordRequest; use crate::avored_state::AvoRedState; use crate::error::{Error, Result}; -use crate::models::validation_error::ErrorResponse; +use crate::models::validation_error::{ErrorMessage, ErrorResponse}; use crate::responses::ApiResponse; use axum::extract::State; use axum::Json; use serde::Serialize; use std::sync::Arc; +use rust_i18n::t; #[derive(Serialize, Default)] pub struct ForgotPasswordViewModel { @@ -17,33 +18,47 @@ pub async fn admin_user_forgot_password_api_handler( state: State>, Json(payload): Json, ) -> Result>> { - println!( - "->> {:<12} - admin_user_forgot_password_api_handler", - "HANDLER" - ); + println!("->> {:<12} - admin_user_forgot_password_api_handler", "HANDLER"); let error_messages = payload.validate()?; - if !error_messages.is_empty() { let error_response = ErrorResponse { status: false, errors: error_messages, }; - return Err(Error::BadRequest(error_response)); } let template = &state.template; let react_admin_url = &state.config.react_admin_app_url; - let sent_status = state + match state .admin_user_service - .sent_forgot_password_email(&state.db, template, react_admin_url, payload.email) - .await?; + .sent_forgot_password_email(&state.db, template, react_admin_url, &payload.email) + .await { + Ok(sent_status) => { + let response_data = ApiResponse { + status: true, + data: sent_status, + }; - let response_data = ApiResponse { - status: true, - data: sent_status, - }; + Ok(Json(response_data)) + }, + Err(e) => match e { + Error::ModelNotFound(_e) => { + let mut errors: Vec = vec![]; + let error_message = ErrorMessage { + key: String::from("email"), + message: t!("email_address_not_valid").to_string(), + }; + errors.push(error_message); + let error_response = ErrorResponse { + status: false, + errors + }; - Ok(Json(response_data)) + Err(Error::BadRequest(error_response)) + }, + _ => Err(Error::Generic("500 Internal Server Error".to_string())) + } + } } diff --git a/src/repositories/admin_user_repository.rs b/src/repositories/admin_user_repository.rs index 9889a893..d2e0308e 100644 --- a/src/repositories/admin_user_repository.rs +++ b/src/repositories/admin_user_repository.rs @@ -25,7 +25,7 @@ impl AdminUserRepository { &self, datastore: &Datastore, database_session: &Session, - email: String, + email: &str, ) -> Result { let sql = "SELECT *, ->admin_user_role->roles.* as roles FROM admin_users WHERE email=$data;"; diff --git a/src/services/admin_user_service.rs b/src/services/admin_user_service.rs index 68bb2df3..6b612b74 100644 --- a/src/services/admin_user_service.rs +++ b/src/services/admin_user_service.rs @@ -36,6 +36,7 @@ pub struct AdminUserService { } impl AdminUserService { + pub fn new( admin_user_repository: AdminUserRepository, role_repository: RoleRepository, @@ -47,22 +48,26 @@ impl AdminUserService { password_reset_repository, }) } -} -impl AdminUserService { + pub async fn sent_forgot_password_email( &self, (datastore, database_session): &DB, template: &AvoRedTemplateProvider, react_admin_url: &str, - to_address: String, + to_address: &str, ) -> Result { + + let admin_user_model = self + .admin_user_repository + .find_by_email(datastore, database_session, to_address) + .await?; + let from_address = String::from("info@avored.com"); let email_subject = "Forgot your password?"; - let token = Alphanumeric.sample_string(&mut rand::thread_rng(), 22); let creatable_password_reset_model = CreatablePasswordResetModel { - email: to_address.clone(), + email: admin_user_model.email, token, }; @@ -147,8 +152,9 @@ impl AdminUserService { jwt_secret_key: &str ) -> Result { - let admin_user_model = self.admin_user_repository - .find_by_email(datastore, database_session, payload.email) + let admin_user_model = self + .admin_user_repository + .find_by_email(datastore, database_session, &payload.email) .await?; let is_password_match: bool = self @@ -182,15 +188,6 @@ impl AdminUserService { Ok(response_data) } - pub async fn find_by_email( - &self, - (datastore, database_session): &DB, - email: String, - ) -> Result { - self.admin_user_repository - .find_by_email(datastore, database_session, email) - .await - } pub async fn find_by_id( &self,