@@ -30,7 +30,7 @@ use crate::{
30
30
use super :: TimeFilter ;
31
31
32
32
pub static DASHBOARDS : Lazy < Dashboards > = Lazy :: new ( Dashboards :: default) ;
33
- pub const CURRENT_DASHBOARD_VERSION : & str = "v2 " ;
33
+ pub const CURRENT_DASHBOARD_VERSION : & str = "v3 " ;
34
34
35
35
#[ derive( Debug , Serialize , Deserialize , Default , Clone ) ]
36
36
pub struct Tiles {
@@ -62,6 +62,25 @@ pub struct CircularChartConfig {
62
62
pub struct GraphConfig {
63
63
x_key : String ,
64
64
y_keys : Vec < String > ,
65
+ graph_type : Option < GraphType > ,
66
+ orientation : Option < Orientation > ,
67
+ }
68
+
69
+ #[ derive( Debug , Serialize , Deserialize , Default , Clone ) ]
70
+ #[ serde( rename_all = "lowercase" ) ]
71
+ pub enum GraphType {
72
+ #[ default]
73
+ Default ,
74
+ Stacked ,
75
+ Percent ,
76
+ }
77
+
78
+ #[ derive( Debug , Serialize , Deserialize , Default , Clone ) ]
79
+ #[ serde( rename_all = "lowercase" ) ]
80
+ pub enum Orientation {
81
+ #[ default]
82
+ Horizontal ,
83
+ Vertical ,
65
84
}
66
85
67
86
#[ derive( Debug , Serialize , Deserialize , Default , Clone ) ]
@@ -96,32 +115,62 @@ impl Dashboards {
96
115
let mut this = vec ! [ ] ;
97
116
let store = CONFIG . storage ( ) . get_object_store ( ) ;
98
117
let dashboards = store. get_all_dashboards ( ) . await . unwrap_or_default ( ) ;
99
-
100
118
for dashboard in dashboards {
101
119
if dashboard. is_empty ( ) {
102
120
continue ;
103
121
}
104
122
let mut dashboard_value = serde_json:: from_slice :: < serde_json:: Value > ( & dashboard) ?;
105
123
if let Some ( meta) = dashboard_value. clone ( ) . as_object ( ) {
106
124
let version = meta. get ( "version" ) . and_then ( |version| version. as_str ( ) ) ;
107
- let user_id = meta. get ( "user_id" ) . and_then ( |user_id| user_id. as_str ( ) ) ;
108
125
let dashboard_id = meta
109
126
. get ( "dashboard_id" )
110
127
. and_then ( |dashboard_id| dashboard_id. as_str ( ) ) ;
111
-
112
- if version == Some ( "v1" ) {
113
- dashboard_value = migrate_v1_v2 ( dashboard_value) ;
114
- if let ( Some ( user_id) , Some ( dashboard_id) ) = ( user_id, dashboard_id) {
115
- let path = dashboard_path ( user_id, & format ! ( "{}.json" , dashboard_id) ) ;
128
+ match version {
129
+ Some ( "v1" ) => {
130
+ dashboard_value = migrate_v1_v2 ( dashboard_value) ;
131
+ dashboard_value = migrate_v2_v3 ( dashboard_value) ;
132
+ let user_id = dashboard_value
133
+ . as_object ( )
134
+ . unwrap ( )
135
+ . get ( "user_id" )
136
+ . and_then ( |user_id| user_id. as_str ( ) ) ;
137
+ let path = dashboard_path (
138
+ user_id. unwrap ( ) ,
139
+ & format ! ( "{}.json" , dashboard_id. unwrap( ) ) ,
140
+ ) ;
116
141
let dashboard_bytes = to_bytes ( & dashboard_value) ;
117
142
store. put_object ( & path, dashboard_bytes. clone ( ) ) . await ?;
118
143
if let Ok ( dashboard) = serde_json:: from_slice :: < Dashboard > ( & dashboard_bytes)
119
144
{
145
+ this. retain ( |d : & Dashboard | d. dashboard_id != dashboard. dashboard_id ) ;
146
+ this. push ( dashboard) ;
147
+ }
148
+ }
149
+ Some ( "v2" ) => {
150
+ dashboard_value = migrate_v2_v3 ( dashboard_value) ;
151
+ let user_id = dashboard_value
152
+ . as_object ( )
153
+ . unwrap ( )
154
+ . get ( "user_id" )
155
+ . and_then ( |user_id| user_id. as_str ( ) ) ;
156
+ let path = dashboard_path (
157
+ user_id. unwrap ( ) ,
158
+ & format ! ( "{}.json" , dashboard_id. unwrap( ) ) ,
159
+ ) ;
160
+ let dashboard_bytes = to_bytes ( & dashboard_value) ;
161
+ store. put_object ( & path, dashboard_bytes. clone ( ) ) . await ?;
162
+ if let Ok ( dashboard) = serde_json:: from_slice :: < Dashboard > ( & dashboard_bytes)
163
+ {
164
+ this. retain ( |d| d. dashboard_id != dashboard. dashboard_id ) ;
165
+ this. push ( dashboard) ;
166
+ }
167
+ }
168
+ _ => {
169
+ if let Ok ( dashboard) = serde_json:: from_slice :: < Dashboard > ( & dashboard) {
170
+ this. retain ( |d| d. dashboard_id != dashboard. dashboard_id ) ;
120
171
this. push ( dashboard) ;
121
172
}
122
173
}
123
- } else if let Ok ( dashboard) = serde_json:: from_slice :: < Dashboard > ( & dashboard) {
124
- this. push ( dashboard) ;
125
174
}
126
175
}
127
176
}
@@ -176,6 +225,55 @@ fn migrate_v1_v2(mut dashboard_meta: Value) -> Value {
176
225
"version" . to_owned ( ) ,
177
226
Value :: String ( CURRENT_DASHBOARD_VERSION . into ( ) ) ,
178
227
) ;
228
+ let tiles = dashboard_meta_map
229
+ . get_mut ( "tiles" )
230
+ . unwrap ( )
231
+ . as_array_mut ( )
232
+ . unwrap ( ) ;
233
+ for tile in tiles. iter_mut ( ) {
234
+ let tile_map = tile. as_object_mut ( ) . unwrap ( ) ;
235
+ let visualization = tile_map
236
+ . get_mut ( "visualization" )
237
+ . unwrap ( )
238
+ . as_object_mut ( )
239
+ . unwrap ( ) ;
240
+ visualization. insert ( "tick_config" . to_owned ( ) , Value :: Array ( vec ! [ ] ) ) ;
241
+ }
242
+
243
+ dashboard_meta
244
+ }
245
+
246
+ fn migrate_v2_v3 ( mut dashboard_meta : Value ) -> Value {
247
+ let dashboard_meta_map = dashboard_meta. as_object_mut ( ) . unwrap ( ) ;
248
+
249
+ dashboard_meta_map. insert (
250
+ "version" . to_owned ( ) ,
251
+ Value :: String ( CURRENT_DASHBOARD_VERSION . into ( ) ) ,
252
+ ) ;
253
+ let tiles = dashboard_meta_map
254
+ . get_mut ( "tiles" )
255
+ . unwrap ( )
256
+ . as_array_mut ( )
257
+ . unwrap ( ) ;
258
+ for tile in tiles {
259
+ let tile_map = tile. as_object_mut ( ) . unwrap ( ) ;
260
+ let visualization = tile_map
261
+ . get_mut ( "visualization" )
262
+ . unwrap ( )
263
+ . as_object_mut ( )
264
+ . unwrap ( ) ;
265
+ if visualization. get ( "graph_config" ) . is_some ( )
266
+ && !visualization. get ( "graph_config" ) . unwrap ( ) . is_null ( )
267
+ {
268
+ let graph_config = visualization
269
+ . get_mut ( "graph_config" )
270
+ . unwrap ( )
271
+ . as_object_mut ( )
272
+ . unwrap ( ) ;
273
+ graph_config. insert ( "orientation" . to_owned ( ) , Value :: String ( "horizontal" . into ( ) ) ) ;
274
+ graph_config. insert ( "graph_type" . to_owned ( ) , Value :: String ( "default" . into ( ) ) ) ;
275
+ }
276
+ }
179
277
180
278
dashboard_meta
181
279
}
0 commit comments