@@ -24,7 +24,7 @@ use crate::templates::{
2424DeploymentsTab , Layout , ModelsTab , NotebooksTab , ProjectsTab , SnapshotsTab , UploaderTab ,
2525} ;
2626use crate :: utils:: tabs;
27- use guards:: Cluster ;
27+ use guards:: { Cluster , CurrentUserState } ;
2828use responses:: { BadRequest , Error , ResponseOk } ;
2929use sqlx:: Executor ;
3030
@@ -41,9 +41,7 @@ pub struct ClustersSettings {
4141/// This gives it a bit of shared state that allows the dashboard to display cluster-specific information.
4242#[ derive( Debug , Default , Clone ) ]
4343pub struct Context {
44- pub user : models:: User ,
4544pub cluster : models:: Cluster ,
46- pub visible_clusters : HashMap < String , String > ,
4745}
4846
4947/// Globally shared state, saved in memory.
@@ -119,6 +117,34 @@ impl Clusters {
119117}
120118}
121119
120+ #[ derive( Debug , Default , Clone ) ]
121+ pub struct CurrentUser {
122+ pub user : Arc < Mutex < models:: User > > ,
123+ pub visible_clusters : Arc < Mutex < HashMap < String , String > > > ,
124+ }
125+
126+ impl CurrentUser {
127+ pub fn user ( & self , user : models:: User ) {
128+ * self . user . lock ( ) = user;
129+ }
130+
131+ pub fn get_user ( & self ) -> models:: User {
132+ self . user . lock ( ) . clone ( )
133+ }
134+
135+ pub fn visible_clusters ( & self , visible_clusters : HashMap < String , String > ) {
136+ * self . visible_clusters . lock ( ) = visible_clusters;
137+ }
138+
139+ pub fn get_visible_clusters ( & self ) ->HashMap < String , String > {
140+ self . visible_clusters . lock ( ) . clone ( )
141+ }
142+
143+ pub fn new ( ) ->CurrentUser {
144+ CurrentUser :: default ( )
145+ }
146+ }
147+
122148#[ get( "/projects" ) ]
123149pub async fn project_index ( cluster : Cluster ) ->Result < ResponseOk , Error > {
124150Ok ( ResponseOk (
@@ -541,6 +567,7 @@ pub async fn uploaded_index(cluster: Cluster, table_name: &str) -> ResponseOk {
541567#[ get( "/?<tab>&<notebook_id>&<model_id>&<project_id>&<snapshot_id>&<deployment_id>&<table_name>" ) ]
542568pub async fn dashboard (
543569cluster : Cluster ,
570+ current_user : CurrentUserState ,
544571tab : Option < & str > ,
545572notebook_id : Option < i64 > ,
546573model_id : Option < i64 > ,
@@ -549,17 +576,10 @@ pub async fn dashboard(
549576deployment_id : Option < i64 > ,
550577table_name : Option < String > ,
551578) ->Result < ResponseOk , Error > {
552- let user =if cluster. context . user . is_anonymous ( ) {
553- None
554- } else {
555- Some ( cluster. context . user . clone ( ) )
556- } ;
557-
558579let mut layout =crate :: templates:: Layout :: new ( "Dashboard" ) ;
559-
560- if user. is_some ( ) {
561- layout. user ( & user. clone ( ) . unwrap ( ) ) ;
562- }
580+ layout
581+ . user ( & current_user. user )
582+ . cluster ( & cluster. context . cluster ) ;
563583
564584let all_tabs =vec ! [
565585 tabs:: Tab {