@@ -53,7 +53,7 @@ pub struct Dashboard {
5353 pub dashboard_id : Option < Ulid > ,
5454 pub modified : Option < DateTime < Utc > > ,
5555 dashboard_type : Option < DashboardType > ,
56- pub tiles : Vec < Tile > ,
56+ pub tiles : Option < Vec < Tile > > ,
5757}
5858
5959#[ derive( Default , Debug ) ]
@@ -88,25 +88,22 @@ impl Dashboards {
8888 user_id : & str ,
8989 dashboard : & mut Dashboard ,
9090 ) -> Result < ( ) , DashboardError > {
91- let mut s = self . 0 . write ( ) . await ;
9291 let dashboard_id = Ulid :: new ( ) ;
9392 dashboard. author = Some ( user_id. to_string ( ) ) ;
9493 dashboard. dashboard_id = Some ( dashboard_id) ;
9594 dashboard. version = Some ( CURRENT_DASHBOARD_VERSION . to_string ( ) ) ;
9695 dashboard. modified = Some ( Utc :: now ( ) ) ;
9796 dashboard. dashboard_type = Some ( DashboardType :: Dashboard ) ;
98- for tile in dashboard. tiles . iter_mut ( ) {
99- tile. tile_id = Ulid :: new ( ) ;
100- }
101- s. push ( dashboard. clone ( ) ) ;
102-
10397 let path = dashboard_path ( user_id, & format ! ( "{}.json" , dashboard_id) ) ;
10498
10599 let store = PARSEABLE . storage . get_object_store ( ) ;
106100 let dashboard_bytes = serde_json:: to_vec ( & dashboard) ?;
107101 store
108102 . put_object ( & path, Bytes :: from ( dashboard_bytes) )
109103 . await ?;
104+
105+ self . 0 . write ( ) . await . push ( dashboard. clone ( ) ) ;
106+
110107 Ok ( ( ) )
111108 }
112109
@@ -116,20 +113,18 @@ impl Dashboards {
116113 dashboard_id : Ulid ,
117114 dashboard : & mut Dashboard ,
118115 ) -> Result < ( ) , DashboardError > {
119- let mut s = self . 0 . write ( ) . await ;
120- if self . get_dashboard ( dashboard_id) . await . is_none ( ) {
116+ if self
117+ . get_dashboard_by_user ( dashboard_id, user_id)
118+ . await
119+ . is_none ( )
120+ {
121121 return Err ( DashboardError :: Metadata ( "Dashboard does not exist" ) ) ;
122122 }
123+ dashboard. author = Some ( user_id. to_string ( ) ) ;
123124 dashboard. dashboard_id = Some ( dashboard_id) ;
124- dashboard. modified = Some ( Utc :: now ( ) ) ;
125125 dashboard. version = Some ( CURRENT_DASHBOARD_VERSION . to_string ( ) ) ;
126- for tile in dashboard. tiles . iter_mut ( ) {
127- if tile. tile_id . is_nil ( ) {
128- tile. tile_id = Ulid :: new ( ) ;
129- }
130- }
131- s. retain ( |d| d. dashboard_id != dashboard. dashboard_id ) ;
132- s. push ( dashboard. clone ( ) ) ;
126+ dashboard. modified = Some ( Utc :: now ( ) ) ;
127+ dashboard. dashboard_type = Some ( DashboardType :: Dashboard ) ;
133128
134129 let path = dashboard_path ( user_id, & format ! ( "{}.json" , dashboard_id) ) ;
135130
@@ -138,6 +133,13 @@ impl Dashboards {
138133 store
139134 . put_object ( & path, Bytes :: from ( dashboard_bytes) )
140135 . await ?;
136+
137+ self . 0
138+ . write ( )
139+ . await
140+ . retain ( |d| d. dashboard_id != dashboard. dashboard_id ) ;
141+ self . 0 . write ( ) . await . push ( dashboard. clone ( ) ) ;
142+
141143 Ok ( ( ) )
142144 }
143145
@@ -146,15 +148,21 @@ impl Dashboards {
146148 user_id : & str ,
147149 dashboard_id : Ulid ,
148150 ) -> Result < ( ) , DashboardError > {
149- let mut s = self . 0 . write ( ) . await ;
150-
151- if self . get_dashboard ( dashboard_id) . await . is_none ( ) {
151+ if self
152+ . get_dashboard_by_user ( dashboard_id, user_id)
153+ . await
154+ . is_none ( )
155+ {
152156 return Err ( DashboardError :: Metadata ( "Dashboard does not exist" ) ) ;
153157 }
154- s . retain ( |d| * d . dashboard_id . as_ref ( ) . unwrap ( ) != dashboard_id ) ;
158+
155159 let path = dashboard_path ( user_id, & format ! ( "{}.json" , dashboard_id) ) ;
156160 let store = PARSEABLE . storage . get_object_store ( ) ;
157161 store. delete_object ( & path) . await ?;
162+ self . 0
163+ . write ( )
164+ . await
165+ . retain ( |d| * d. dashboard_id . as_ref ( ) . unwrap ( ) != dashboard_id) ;
158166
159167 Ok ( ( ) )
160168 }
@@ -168,6 +176,22 @@ impl Dashboards {
168176 . cloned ( )
169177 }
170178
179+ pub async fn get_dashboard_by_user (
180+ & self ,
181+ dashboard_id : Ulid ,
182+ user_id : & str ,
183+ ) -> Option < Dashboard > {
184+ self . 0
185+ . read ( )
186+ . await
187+ . iter ( )
188+ . find ( |d| {
189+ * d. dashboard_id . as_ref ( ) . unwrap ( ) == dashboard_id
190+ && d. author == Some ( user_id. to_string ( ) )
191+ } )
192+ . cloned ( )
193+ }
194+
171195 pub async fn list_dashboards ( & self ) -> Vec < Dashboard > {
172196 let read = self . 0 . read ( ) . await ;
173197
0 commit comments