From 04af863ec41caf70e137ce6326733dd8522518a9 Mon Sep 17 00:00:00 2001 From: Igor Pashev Date: Tue, 30 Jun 2020 14:01:30 +0200 Subject: [PATCH] Handle sessions in one place This includes logging in and logging out. `logged_out` is removed because "disabled" is not working with `a` anyway. Can be added to the auth::Model if needed. Signed-off-by: Igor Pashev --- iml-gui/crate/src/auth.rs | 50 +++++++--------------- iml-gui/crate/src/components/tree.rs | 2 +- iml-gui/crate/src/generated/css_classes.rs | 3 -- iml-gui/crate/src/lib.rs | 43 +------------------ iml-gui/crate/src/page/login.rs | 29 ++----------- iml-gui/crate/src/page/partial/footer.rs | 9 ++-- iml-gui/crate/src/page/partial/header.rs | 11 ++--- 7 files changed, 27 insertions(+), 120 deletions(-) diff --git a/iml-gui/crate/src/auth.rs b/iml-gui/crate/src/auth.rs index 299aebbfba..750af731a9 100644 --- a/iml-gui/crate/src/auth.rs +++ b/iml-gui/crate/src/auth.rs @@ -14,7 +14,6 @@ use web_sys::HtmlDocument; #[derive(Default)] pub struct Model { session: Option, - pub state: State, request_controller: Option, cancel: Option>, } @@ -25,46 +24,26 @@ impl Model { } } -#[derive(PartialEq, Eq)] -pub enum State { - Fetching, - Stopped, -} - -impl Default for State { - fn default() -> Self { - Self::Fetching - } -} - #[allow(clippy::large_enum_variant)] #[derive(Clone, Debug)] pub enum Msg { Fetch, Fetched(fetch::FetchObject), - SetSession(Session), + Logout, + LoggedIn, Loop, - Stop, Noop, } pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { match msg { Msg::Fetch => { - model.state = State::Fetching; model.cancel = None; let request = fetch_session().controller(|controller| model.request_controller = Some(controller)); orders.skip().perform_cmd(request.fetch_json(Msg::Fetched)); } - Msg::SetSession(session) => { - if session.needs_login() { - orders.send_g_msg(GMsg::RouteChange(Route::Login.into())); - } - - model.session = Some(session); - } Msg::Fetched(data) => { match data.response() { Err(fail_reason) => { @@ -95,12 +74,21 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) } }; } - Msg::Loop => { + Msg::LoggedIn => { orders.skip(); + orders.send_msg(Msg::Fetch); + orders.send_g_msg(GMsg::RouteChange(Route::Dashboard.into())); + } - if model.state == State::Stopped { - return; - } + Msg::Logout => { + orders.perform_g_cmd( + fetch_session() + .method(fetch::Method::Delete) + .fetch(|_| GMsg::AuthProxy(Box::new(Msg::LoggedIn))), + ); + } + Msg::Loop => { + orders.skip(); let (cancel, fut) = sleep_with_handle(Duration::from_secs(10), Msg::Fetch, Msg::Noop); @@ -108,14 +96,6 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) orders.perform_cmd(fut); } - Msg::Stop => { - model.state = State::Stopped; - model.cancel = None; - - if let Some(c) = model.request_controller.take() { - c.abort(); - } - } Msg::Noop => {} }; } diff --git a/iml-gui/crate/src/components/tree.rs b/iml-gui/crate/src/components/tree.rs index 707776f333..f1c6734a8d 100644 --- a/iml-gui/crate/src/components/tree.rs +++ b/iml-gui/crate/src/components/tree.rs @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. use crate::{ - components::{attrs, alert_indicator, font_awesome, paging, Placement, tooltip}, + components::{alert_indicator, attrs, font_awesome, paging, tooltip, Placement}, generated::css_classes::C, route::RouteId, GMsg, Route, diff --git a/iml-gui/crate/src/generated/css_classes.rs b/iml-gui/crate/src/generated/css_classes.rs index 30eba3e260..3b145c1267 100644 --- a/iml-gui/crate/src/generated/css_classes.rs +++ b/iml-gui/crate/src/generated/css_classes.rs @@ -1,9 +1,7 @@ - // DO NOT EDIT THIS FILE - IT'S GENERATED, CHANGES WILL BE LOST! #[allow(non_snake_case, dead_code)] pub struct CssClasses<'a> { - /** width: 100%; max-width: 569px; @media (min-width: 569px) @@ -93733,7 +93731,6 @@ pub struct CssClasses<'a> { } pub static C: CssClasses = CssClasses { - /** width: 100%; max-width: 569px; @media (min-width: 569px) diff --git a/iml-gui/crate/src/lib.rs b/iml-gui/crate/src/lib.rs index 6ebd62525f..ba01ae38f2 100644 --- a/iml-gui/crate/src/lib.rs +++ b/iml-gui/crate/src/lib.rs @@ -37,7 +37,7 @@ use futures::channel::oneshot; use generated::css_classes::C; use iml_wire_types::{ warp_drive::{self, ArcRecord}, - Conf, GroupType, Session, + Conf, GroupType, }; use lazy_static::lazy_static; use page::{Page, RecordChange}; @@ -157,7 +157,6 @@ pub struct Model { conf: Conf, loading: Loading, locks: warp_drive::Locks, - logging_out: bool, manage_menu_state: WatchState, menu_visibility: Visibility, notification: notification::Model, @@ -225,7 +224,6 @@ fn after_mount(url: Url, orders: &mut impl Orders) -> AfterMount), - GetSession, - GotSession(fetch::ResponseDataResult), HideMenu, LoadPage, Locks(warp_drive::Locks), - LoggedOut(fetch::FetchObject<()>), - Logout, ManageMenuState, Notification(notification::Msg), RecordChange(Box), @@ -332,10 +326,6 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) Msg::RouteChanged(url) => { model.route = Route::from(url); - if model.route == Route::Login { - orders.send_msg(Msg::Logout); - } - if model.route == Route::Dashboard { model.breadcrumbs.clear(); } @@ -409,23 +399,6 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) Msg::EventSourceError(_) => { log("EventSource error."); } - Msg::GetSession => { - orders - .skip() - .perform_cmd(auth::fetch_session().fetch_json_data(Msg::GotSession)); - } - Msg::GotSession(data_result) => match data_result { - Ok(resp) => { - orders.send_g_msg(GMsg::AuthProxy(Box::new(auth::Msg::SetSession(resp)))); - - model.logging_out = false; - } - Err(fail_reason) => { - error!("Error fetching login session {:?}", fail_reason.message()); - - orders.skip(); - } - }, Msg::Records(records) => { model.records = (&*records).into(); @@ -582,20 +555,6 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) &mut orders.proxy(Msg::StatusSection), ); } - Msg::Logout => { - model.logging_out = true; - - orders.proxy(Msg::Auth).send_msg(Box::new(auth::Msg::Stop)); - - orders.perform_cmd( - auth::fetch_session() - .method(fetch::Method::Delete) - .fetch(Msg::LoggedOut), - ); - } - Msg::LoggedOut(_) => { - orders.send_msg(Msg::GetSession); - } Msg::WindowClick => { if model.manage_menu_state.should_update() { model.manage_menu_state.update(); diff --git a/iml-gui/crate/src/page/login.rs b/iml-gui/crate/src/page/login.rs index 5d623e5fcb..d33548d03f 100644 --- a/iml-gui/crate/src/page/login.rs +++ b/iml-gui/crate/src/page/login.rs @@ -6,10 +6,10 @@ use crate::{ auth, components::{ddn_logo, ddn_logo_lettering, whamcloud_logo}, generated::css_classes::C, - FailReasonExt, GMsg, MergeAttrs, Route, + GMsg, MergeAttrs, }; use core::fmt; -use iml_wire_types::{Branding, Session}; +use iml_wire_types::Branding; use seed::{browser::service::fetch, prelude::*, *}; #[derive(Clone, Default, serde::Serialize)] @@ -45,8 +45,6 @@ pub enum Msg { PasswordChange(String), SubmitResp(fetch::FetchObject), Submit, - GetSession, - GotSession(fetch::ResponseDataResult), } impl fmt::Debug for Msg { @@ -80,7 +78,7 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) Err(e) => error!("Response error {:?}", e), Ok(x) => { if x.status.code < 400 { - orders.skip().send_msg(Msg::GetSession); + orders.skip().send_g_msg(GMsg::AuthProxy(Box::new(auth::Msg::LoggedIn))); } else { model.logging_in = false; @@ -92,27 +90,6 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) } }; } - Msg::GetSession => { - orders - .skip() - .perform_cmd(auth::fetch_session().fetch_json_data(Msg::GotSession)); - } - Msg::GotSession(data_result) => { - match data_result { - Ok(resp) => { - orders - .send_g_msg(GMsg::AuthProxy(Box::new(auth::Msg::SetSession(resp)))) - .send_g_msg(GMsg::RouteChange(Route::Dashboard.into())); - - model.logging_in = false; - } - Err(fail_reason) => { - error!("Error fetching login session {:?}", fail_reason.message()); - - orders.skip(); - } - }; - } } } diff --git a/iml-gui/crate/src/page/partial/footer.rs b/iml-gui/crate/src/page/partial/footer.rs index a8b87d03bb..9e8dcfdbe7 100644 --- a/iml-gui/crate/src/page/partial/footer.rs +++ b/iml-gui/crate/src/page/partial/footer.rs @@ -24,20 +24,17 @@ pub fn view(conf: &Conf) -> impl View { } }; - let footer_text = match conf.branding { + let footer_text = match conf.branding { Branding::Whamcloud => div![ footer_string, year.to_string(), " DDN. All rights reserved.".to_string(), ], - _ => div![footer_string] + _ => div![footer_string], }; footer![ class![C.h_5, C.flex, C.justify_center], - div![ - class![C.px_5, C.text_sm, C.items_center,], - footer_text - ] + div![class![C.px_5, C.text_sm, C.items_center,], footer_text] ] } diff --git a/iml-gui/crate/src/page/partial/header.rs b/iml-gui/crate/src/page/partial/header.rs index e7d1712f05..df742a92a4 100644 --- a/iml-gui/crate/src/page/partial/header.rs +++ b/iml-gui/crate/src/page/partial/header.rs @@ -245,7 +245,7 @@ fn nav(model: &Model) -> Node { C.lg__h_16, ], main_menu_items(model), - auth_view(&model.auth, model.logging_out), + auth_view(&model.auth), ] } else { empty![] @@ -255,14 +255,12 @@ fn nav(model: &Model) -> Node { /// Show the logged in user if available. /// Also show the Login / Logout link -pub fn auth_view(auth: &auth::Model, logging_out: bool) -> Node { +pub fn auth_view(auth: &auth::Model) -> Node { let x = match auth.get_session() { Some(session) => session, None => return empty![], }; - let disabled = attrs! { At::Disabled => logging_out.as_at_value() }; - let cls = class![ C.block, C.border_b_2, @@ -283,14 +281,14 @@ pub fn auth_view(auth: &auth::Model, logging_out: bool) -> Node { C.text_gray_300 ]; - let mut auth_link = a![&cls, &disabled, if !x.has_user() { "Login" } else { "Logout" }]; + let mut auth_link = a![&cls, if !x.has_user() { "Login" } else { "Logout" }]; let auth_link = if !x.has_user() { auth_link.merge_attrs(attrs! { At::Href => Route::Login.to_href(), }) } else { - auth_link.add_listener(simple_ev(Ev::Click, Msg::Logout)); + auth_link.add_listener(simple_ev(Ev::Click, Msg::Auth(Box::new(auth::Msg::Logout)))); auth_link }; @@ -301,7 +299,6 @@ pub fn auth_view(auth: &auth::Model, logging_out: bool) -> Node { Some(user) => { a![ &cls, - &disabled, attrs! { At::Href => Route::User(user.id.into()).to_href() },