@@ -20,13 +20,17 @@ use std::sync::RwLock;
2020
2121use once_cell:: sync:: Lazy ;
2222use serde:: { Deserialize , Serialize } ;
23+ use serde_json:: Value ;
2324
24- use crate :: { metadata:: LOCK_EXPECT , option:: CONFIG } ;
25+ use crate :: {
26+ metadata:: LOCK_EXPECT , migration:: to_bytes, option:: CONFIG ,
27+ storage:: object_storage:: dashboard_path, utils:: get_hash,
28+ } ;
2529
2630use super :: TimeFilter ;
2731
2832pub static DASHBOARDS : Lazy < Dashboards > = Lazy :: new ( Dashboards :: default) ;
29- pub const CURRENT_DASHBOARD_VERSION : & str = "v1 " ;
33+ pub const CURRENT_DASHBOARD_VERSION : & str = "v2 " ;
3034
3135#[ derive( Debug , Serialize , Deserialize , Default , Clone ) ]
3236pub struct Tiles {
@@ -94,8 +98,31 @@ impl Dashboards {
9498 let dashboards = store. get_all_dashboards ( ) . await . unwrap_or_default ( ) ;
9599
96100 for dashboard in dashboards {
97- if let Ok ( dashboard) = serde_json:: from_slice :: < Dashboard > ( & dashboard) {
98- this. push ( dashboard) ;
101+ if dashboard. is_empty ( ) {
102+ continue ;
103+ }
104+ let mut dashboard_value = serde_json:: from_slice :: < serde_json:: Value > ( & dashboard) ?;
105+ if let Some ( meta) = dashboard_value. clone ( ) . as_object ( ) {
106+ 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+ let dashboard_id = meta
109+ . get ( "dashboard_id" )
110+ . 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) ) ;
116+ let dashboard_bytes = to_bytes ( & dashboard_value) ;
117+ store. put_object ( & path, dashboard_bytes. clone ( ) ) . await ?;
118+ if let Ok ( dashboard) = serde_json:: from_slice :: < Dashboard > ( & dashboard_bytes)
119+ {
120+ this. push ( dashboard) ;
121+ }
122+ }
123+ } else if let Ok ( dashboard) = serde_json:: from_slice :: < Dashboard > ( & dashboard) {
124+ this. push ( dashboard) ;
125+ }
99126 }
100127 }
101128
@@ -135,3 +162,17 @@ impl Dashboards {
135162 . collect ( )
136163 }
137164}
165+
166+ fn migrate_v1_v2 ( mut dashboard_meta : Value ) -> Value {
167+ let dashboard_meta_map = dashboard_meta. as_object_mut ( ) . unwrap ( ) ;
168+ let user_id = dashboard_meta_map. get ( "user_id" ) . unwrap ( ) . clone ( ) ;
169+ let str_user_id = user_id. as_str ( ) . unwrap ( ) ;
170+ let user_id_hash = get_hash ( str_user_id) ;
171+ dashboard_meta_map. insert ( "user_id" . to_owned ( ) , Value :: String ( user_id_hash) ) ;
172+ dashboard_meta_map. insert (
173+ "version" . to_owned ( ) ,
174+ Value :: String ( CURRENT_DASHBOARD_VERSION . into ( ) ) ,
175+ ) ;
176+
177+ dashboard_meta
178+ }
0 commit comments