Display account details
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
use actix::{Actor, Context, Handler, Message, MessageResult};
|
||||
|
||||
use crate::data::entity_manager::EntityManager;
|
||||
use crate::data::user::{verify_password, User, UserID};
|
||||
use crate::data::user::{User, UserID, verify_password};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum LoginResult {
|
||||
@ -21,6 +21,13 @@ pub struct LoginRequest {
|
||||
#[derive(Debug)]
|
||||
pub struct ChangePasswordResult(pub bool);
|
||||
|
||||
#[derive(Message)]
|
||||
#[rtype(GetUserResult)]
|
||||
pub struct GetUserRequest(pub UserID);
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct GetUserResult(pub Option<User>);
|
||||
|
||||
#[derive(Message)]
|
||||
#[rtype(ChangePasswordResult)]
|
||||
pub struct ChangePasswordRequest {
|
||||
@ -75,3 +82,11 @@ impl Handler<ChangePasswordRequest> for UsersActor {
|
||||
)))
|
||||
}
|
||||
}
|
||||
|
||||
impl Handler<GetUserRequest> for UsersActor {
|
||||
type Result = MessageResult<GetUserRequest>;
|
||||
|
||||
fn handle(&mut self, msg: GetUserRequest, _ctx: &mut Self::Context) -> Self::Result {
|
||||
MessageResult(GetUserResult(self.manager.find_by_user_id(&msg.0)))
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
pub mod assets_controller;
|
||||
pub mod base_controller;
|
||||
pub mod login_controller;
|
||||
pub mod settings_controller;
|
62
src/controllers/settings_controller.rs
Normal file
62
src/controllers/settings_controller.rs
Normal file
@ -0,0 +1,62 @@
|
||||
use actix::Addr;
|
||||
use actix_identity::Identity;
|
||||
use actix_web::{HttpResponse, Responder, web};
|
||||
use askama::Template;
|
||||
|
||||
use crate::actors::users_actor;
|
||||
use crate::actors::users_actor::UsersActor;
|
||||
use crate::constants::APP_NAME;
|
||||
use crate::data::session_identity::SessionIdentity;
|
||||
use crate::data::user::User;
|
||||
|
||||
#[derive(Template)]
|
||||
#[template(path = "settings/base_settings_page.html")]
|
||||
struct BaseSettingsPage {
|
||||
danger_message: Option<String>,
|
||||
success_message: Option<String>,
|
||||
page_title: &'static str,
|
||||
app_name: &'static str,
|
||||
is_admin: bool,
|
||||
user_name: String,
|
||||
}
|
||||
|
||||
impl BaseSettingsPage {
|
||||
async fn get(user: &User) -> BaseSettingsPage {
|
||||
Self {
|
||||
danger_message: None,
|
||||
success_message: None,
|
||||
page_title: "Account details",
|
||||
app_name: APP_NAME,
|
||||
is_admin: user.admin,
|
||||
user_name: user.username.to_string(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Template)]
|
||||
#[template(path = "settings/account_details.html")]
|
||||
struct AccountDetailsPage {
|
||||
_parent: BaseSettingsPage,
|
||||
user_id: String,
|
||||
first_name: String,
|
||||
last_name: String,
|
||||
username: String,
|
||||
email: String,
|
||||
}
|
||||
|
||||
/// Account details page
|
||||
pub async fn account_settings_details_route(id: Identity, user_actor: web::Data<Addr<UsersActor>>) -> impl Responder {
|
||||
let user: User = user_actor.send(
|
||||
users_actor::GetUserRequest(SessionIdentity(&id).user_id())
|
||||
).await.unwrap().0.unwrap();
|
||||
|
||||
HttpResponse::Ok()
|
||||
.body(AccountDetailsPage {
|
||||
_parent: BaseSettingsPage::get(&user).await,
|
||||
user_id: user.uid,
|
||||
first_name: user.first_name,
|
||||
last_name: user.last_last,
|
||||
username: user.username,
|
||||
email: user.email,
|
||||
}.render().unwrap())
|
||||
}
|
@ -86,6 +86,10 @@ impl<'a> SessionIdentity<'a> {
|
||||
.unwrap_or(false)
|
||||
}
|
||||
|
||||
pub fn is_admin(&self) -> bool {
|
||||
self.get_session_data().unwrap_or_default().is_admin
|
||||
}
|
||||
|
||||
pub fn user_id(&self) -> UserID {
|
||||
self.get_session_data().unwrap_or_default().id
|
||||
}
|
||||
|
11
src/main.rs
11
src/main.rs
@ -14,6 +14,7 @@ use basic_oidc::constants::{
|
||||
};
|
||||
use basic_oidc::controllers::assets_controller::assets_route;
|
||||
use basic_oidc::controllers::login_controller::{login_route, logout_route};
|
||||
use basic_oidc::controllers::settings_controller;
|
||||
use basic_oidc::data::app_config::AppConfig;
|
||||
use basic_oidc::data::entity_manager::EntityManager;
|
||||
use basic_oidc::data::user::{hash_password, User};
|
||||
@ -81,18 +82,26 @@ async fn main() -> std::io::Result<()> {
|
||||
.app_data(web::Data::new(users_actor.clone()))
|
||||
.app_data(web::Data::new(bruteforce_actor.clone()))
|
||||
.app_data(web::Data::new(config.clone()))
|
||||
|
||||
.wrap(Logger::default())
|
||||
.wrap(AuthMiddleware {})
|
||||
.wrap(IdentityService::new(policy))
|
||||
// /health route
|
||||
|
||||
// health route
|
||||
.service(health)
|
||||
|
||||
// Assets serving
|
||||
.route("/assets/{path:.*}", web::get().to(assets_route))
|
||||
|
||||
// Login page
|
||||
.route("/login", web::get().to(login_route))
|
||||
.route("/login", web::post().to(login_route))
|
||||
|
||||
// Logout page
|
||||
.route("/logout", web::get().to(logout_route))
|
||||
|
||||
// Settings routes
|
||||
.route("/settings", web::get().to(settings_controller::account_settings_details_route))
|
||||
})
|
||||
.bind(listen_address)?
|
||||
.run()
|
||||
|
Reference in New Issue
Block a user