@@ -6,6 +6,7 @@ use std::sync::Arc;
66
77use parking_lot:: Mutex ;
88use rocket:: form:: Form ;
9+ use rocket:: State ;
910use rocket:: response:: Redirect ;
1011use rocket:: route:: Route ;
1112use sailfish:: TemplateOnce ;
@@ -24,7 +25,7 @@ use crate::templates::{
2425DeploymentsTab , Layout , ModelsTab , NotebooksTab , ProjectsTab , SnapshotsTab , UploaderTab ,
2526} ;
2627use crate :: utils:: tabs;
27- use guards:: { Cluster , CurrentUserState } ;
28+ use guards:: Cluster ;
2829use responses:: { BadRequest , Error , ResponseOk } ;
2930use sqlx:: Executor ;
3031
@@ -41,7 +42,7 @@ pub struct ClustersSettings {
4142/// This gives it a bit of shared state that allows the dashboard to display cluster-specific information.
4243#[ derive( Debug , Default , Clone ) ]
4344pub struct Context {
44- pub cluster : models:: Cluster ,
45+ pub cluster : Option < models:: Cluster > ,
4546}
4647
4748/// Globally shared state, saved in memory.
@@ -117,36 +118,41 @@ impl Clusters {
117118}
118119}
119120
120- #[ derive( Debug , Default , Clone ) ]
121+
122+ // Globally shared state in memory.
123+
124+ #[ derive( Debug , Clone ) ]
121125pub struct CurrentUser {
122- pub user : Arc < Mutex < models:: User > > ,
123- pub visible_clusters : Arc < Mutex < HashMap < String , String > > > ,
126+ pub user : Arc < Mutex < Option < models:: User > > > ,
127+ pub visible_clusters : Arc < Mutex < Option < HashMap < String , String > > > > ,
124128}
125129
126130impl CurrentUser {
127- pub fn user ( & self , user : models:: User ) {
128- * self . user . lock ( ) = user;
131+ pub fn set_user ( & self , user : models:: User ) {
132+ * self . user . lock ( ) =Some ( user) ;
129133}
130134
131- pub fn get_user ( & self ) -> models:: User {
135+ pub fn get_user ( & self ) ->Option < models:: User > {
132136self . user . lock ( ) . clone ( )
133137}
134138
135- pub fn visible_clusters ( & self , visible_clusters : HashMap < String , String > ) {
136- * self . visible_clusters . lock ( ) = visible_clusters;
139+ pub fn set_visible_clusters ( & self , visible_clusters : HashMap < String , String > ) {
140+ * self . visible_clusters . lock ( ) =Some ( visible_clusters) ;
137141}
138142
139- pub fn get_visible_clusters ( & self ) ->HashMap < String , String > {
143+ pub fn get_visible_clusters ( & self ) ->Option < HashMap < String , String > > {
140144self . visible_clusters . lock ( ) . clone ( )
141145}
142146
147+ pub fn set_to_default ( & self ) {
148+ * self . user . lock ( ) =None ;
149+ * self . visible_clusters . lock ( ) =None ;
150+ }
151+
143152pub fn new ( ) ->CurrentUser {
144153CurrentUser {
145- user : Arc :: new ( Mutex :: new ( models:: User {
146- id : -1 ,
147- email : "" . to_string ( )
148- } ) ) ,
149- visible_clusters : Arc :: new ( Mutex :: new ( HashMap :: new ( ) ) ) ,
154+ user : Arc :: new ( Mutex :: new ( None ) ) ,
155+ visible_clusters : Arc :: new ( Mutex :: new ( None ) ) ,
150156}
151157}
152158}
@@ -573,7 +579,7 @@ pub async fn uploaded_index(cluster: Cluster, table_name: &str) -> ResponseOk {
573579#[ get( "/?<tab>&<notebook_id>&<model_id>&<project_id>&<snapshot_id>&<deployment_id>&<table_name>" ) ]
574580pub async fn dashboard (
575581cluster : Cluster ,
576- current_user : CurrentUserState ,
582+ current_user : & State < CurrentUser > ,
577583tab : Option < & str > ,
578584notebook_id : Option < i64 > ,
579585model_id : Option < i64 > ,
@@ -582,9 +588,12 @@ pub async fn dashboard(
582588deployment_id : Option < i64 > ,
583589table_name : Option < String > ,
584590) ->Result < ResponseOk , Error > {
591+ // 500 error if there is no cluster in global state.
592+ let _ = cluster. context . cluster . as_ref ( ) . unwrap ( ) ;
593+
585594let mut layout =crate :: templates:: Layout :: new ( "Dashboard" ) ;
586595 layout
587- . user ( & current_user. user )
596+ . user ( & current_user. get_user ( ) )
588597. cluster ( & cluster. context . cluster ) ;
589598
590599let all_tabs =vec ! [