Skip to content

Commit

Permalink
Merge pull request #273 from avored/improvements
Browse files Browse the repository at this point in the history
model not found validation check added
  • Loading branch information
indpurvesh authored Feb 9, 2025
2 parents 7c1785a + 0ecb6ef commit 40f324d
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 32 deletions.
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -17,33 +18,47 @@ pub async fn admin_user_forgot_password_api_handler(
state: State<Arc<AvoRedState>>,
Json(payload): Json<AdminUserForgotPasswordRequest>,
) -> Result<Json<ApiResponse<bool>>> {
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<ErrorMessage> = 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()))
}
}
}
2 changes: 1 addition & 1 deletion src/repositories/admin_user_repository.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ impl AdminUserRepository {
&self,
datastore: &Datastore,
database_session: &Session,
email: String,
email: &str,
) -> Result<AdminUserModel> {
let sql =
"SELECT *, ->admin_user_role->roles.* as roles FROM admin_users WHERE email=$data;";
Expand Down
29 changes: 13 additions & 16 deletions src/services/admin_user_service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ pub struct AdminUserService {
}

impl AdminUserService {

pub fn new(
admin_user_repository: AdminUserRepository,
role_repository: RoleRepository,
Expand All @@ -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<bool> {

let admin_user_model = self
.admin_user_repository
.find_by_email(datastore, database_session, to_address)
.await?;

let from_address = String::from("[email protected]");
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,
};

Expand Down Expand Up @@ -147,8 +152,9 @@ impl AdminUserService {
jwt_secret_key: &str
) -> Result<LoginResponseData> {

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
Expand Down Expand Up @@ -182,15 +188,6 @@ impl AdminUserService {

Ok(response_data)
}
pub async fn find_by_email(
&self,
(datastore, database_session): &DB,
email: String,
) -> Result<AdminUserModel> {
self.admin_user_repository
.find_by_email(datastore, database_session, email)
.await
}

pub async fn find_by_id(
&self,
Expand Down

0 comments on commit 40f324d

Please sign in to comment.