Skip to content

Commit e315eaf

Browse files
migration of existing dashboards and filters from v1 to v2
1 parent a16309a commit e315eaf

File tree

2 files changed

+96
-8
lines changed

2 files changed

+96
-8
lines changed

server/src/users/dashboards.rs

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,17 @@ use std::sync::RwLock;
2020

2121
use once_cell::sync::Lazy;
2222
use 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

2630
use super::TimeFilter;
2731

2832
pub 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)]
3236
pub 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+
}

server/src/users/filters.rs

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,17 @@
1818

1919
use once_cell::sync::Lazy;
2020
use serde::{Deserialize, Serialize};
21+
use serde_json::Value;
2122
use std::sync::RwLock;
2223

2324
use super::TimeFilter;
24-
use crate::{metadata::LOCK_EXPECT, option::CONFIG};
25+
use crate::{
26+
metadata::LOCK_EXPECT, migration::to_bytes, option::CONFIG,
27+
storage::object_storage::filter_path, utils::get_hash,
28+
};
2529

2630
pub static FILTERS: Lazy<Filters> = Lazy::new(Filters::default);
27-
pub const CURRENT_FILTER_VERSION: &str = "v1";
31+
pub const CURRENT_FILTER_VERSION: &str = "v2";
2832
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
2933
pub struct Filter {
3034
pub version: Option<String>,
@@ -75,8 +79,37 @@ impl Filters {
7579
let filters = store.get_all_saved_filters().await.unwrap_or_default();
7680

7781
for filter in filters {
78-
if let Ok(filter) = serde_json::from_slice::<Filter>(&filter) {
79-
this.push(filter);
82+
if filter.is_empty() {
83+
continue;
84+
}
85+
86+
let mut filter_value = serde_json::from_slice::<serde_json::Value>(&filter)?;
87+
if let Some(meta) = filter_value.clone().as_object() {
88+
let version = meta.get("version").and_then(|version| version.as_str());
89+
let user_id = meta.get("user_id").and_then(|user_id| user_id.as_str());
90+
let filter_id = meta
91+
.get("filter_id")
92+
.and_then(|filter_id| filter_id.as_str());
93+
let stream_name = meta
94+
.get("stream_name")
95+
.and_then(|stream_name| stream_name.as_str());
96+
97+
if version == Some("v1") {
98+
filter_value = migrate_v1_v2(filter_value);
99+
if let (Some(user_id), Some(stream_name), Some(filter_id)) =
100+
(user_id, stream_name, filter_id)
101+
{
102+
let path =
103+
filter_path(user_id, stream_name, &format!("{}.json", filter_id));
104+
let filter_bytes = to_bytes(&filter_value);
105+
store.put_object(&path, filter_bytes.clone()).await?;
106+
if let Ok(filter) = serde_json::from_slice::<Filter>(&filter_bytes) {
107+
this.push(filter);
108+
}
109+
}
110+
} else if let Ok(filter) = serde_json::from_slice::<Filter>(&filter) {
111+
this.push(filter);
112+
}
80113
}
81114
}
82115

@@ -116,3 +149,17 @@ impl Filters {
116149
.collect()
117150
}
118151
}
152+
153+
fn migrate_v1_v2(mut filter_meta: Value) -> Value {
154+
let filter_meta_map = filter_meta.as_object_mut().unwrap();
155+
let user_id = filter_meta_map.get("user_id").unwrap().clone();
156+
let str_user_id = user_id.as_str().unwrap();
157+
let user_id_hash = get_hash(str_user_id);
158+
filter_meta_map.insert("user_id".to_owned(), Value::String(user_id_hash));
159+
filter_meta_map.insert(
160+
"version".to_owned(),
161+
Value::String(CURRENT_FILTER_VERSION.into()),
162+
);
163+
164+
filter_meta
165+
}

0 commit comments

Comments
 (0)