Skip to content

Commit 4a7155e

Browse files
feat: dashboard implementation
1 parent a90ed13 commit 4a7155e

File tree

3 files changed

+63
-261
lines changed

3 files changed

+63
-261
lines changed

src/handlers/http/users/dashboards.rs

Lines changed: 32 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -21,39 +21,33 @@ use crate::{
2121
parseable::PARSEABLE,
2222
storage::{object_storage::dashboard_path, ObjectStorageError},
2323
users::dashboards::{Dashboard, CURRENT_DASHBOARD_VERSION, DASHBOARDS},
24-
utils::{actix::extract_session_key_from_req, get_hash, get_user_from_request},
24+
utils::{get_hash, get_user_from_request},
2525
};
2626
use actix_web::{
2727
http::header::ContentType,
2828
web::{self, Json, Path},
2929
HttpRequest, HttpResponse, Responder,
3030
};
3131
use bytes::Bytes;
32-
use rand::distributions::DistString;
3332

34-
use chrono::Utc;
3533
use http::StatusCode;
3634
use serde_json::Error as SerdeError;
35+
use ulid::Ulid;
3736

38-
pub async fn list(req: HttpRequest) -> Result<impl Responder, DashboardError> {
39-
let key =
40-
extract_session_key_from_req(&req).map_err(|e| DashboardError::Custom(e.to_string()))?;
41-
let dashboards = DASHBOARDS.list_dashboards(&key).await;
37+
pub async fn list() -> Result<impl Responder, DashboardError> {
38+
let dashboards = DASHBOARDS.list_dashboards().await;
4239

4340
Ok((web::Json(dashboards), StatusCode::OK))
4441
}
4542

46-
pub async fn get(
47-
req: HttpRequest,
48-
dashboard_id: Path<String>,
49-
) -> Result<impl Responder, DashboardError> {
50-
let user_id = get_user_from_request(&req)?;
51-
let dashboard_id = dashboard_id.into_inner();
43+
pub async fn get(dashboard_id: Path<String>) -> Result<impl Responder, DashboardError> {
44+
let dashboard_id = if let Ok(dashboard_id) = Ulid::from_string(&dashboard_id.into_inner()) {
45+
dashboard_id
46+
} else {
47+
return Err(DashboardError::Metadata("Invalid dashboard ID"));
48+
};
5249

53-
if let Some(dashboard) = DASHBOARDS
54-
.get_dashboard(&dashboard_id, &get_hash(&user_id))
55-
.await
56-
{
50+
if let Some(dashboard) = DASHBOARDS.get_dashboard(dashboard_id).await {
5751
return Ok((web::Json(dashboard), StatusCode::OK));
5852
}
5953

@@ -66,20 +60,13 @@ pub async fn post(
6660
) -> Result<impl Responder, DashboardError> {
6761
let mut user_id = get_user_from_request(&req)?;
6862
user_id = get_hash(&user_id);
69-
let dashboard_id = get_hash(Utc::now().timestamp_micros().to_string().as_str());
70-
dashboard.dashboard_id = Some(dashboard_id.clone());
63+
let dashboard_id = Ulid::new();
64+
dashboard.dashboard_id = dashboard_id;
7165
dashboard.version = Some(CURRENT_DASHBOARD_VERSION.to_string());
7266

73-
dashboard.user_id = Some(user_id.clone());
67+
dashboard.author = user_id.clone();
7468
for tile in dashboard.tiles.iter_mut() {
75-
tile.tile_id = Some(get_hash(
76-
format!(
77-
"{}{}",
78-
rand::distributions::Alphanumeric.sample_string(&mut rand::thread_rng(), 8),
79-
Utc::now().timestamp_micros()
80-
)
81-
.as_str(),
82-
));
69+
tile.tile_id = Ulid::new();
8370
}
8471
DASHBOARDS.update(&dashboard).await;
8572

@@ -101,21 +88,21 @@ pub async fn update(
10188
) -> Result<impl Responder, DashboardError> {
10289
let mut user_id = get_user_from_request(&req)?;
10390
user_id = get_hash(&user_id);
104-
let dashboard_id = dashboard_id.into_inner();
91+
let dashboard_id = if let Ok(dashboard_id) = Ulid::from_string(&dashboard_id.into_inner()) {
92+
dashboard_id
93+
} else {
94+
return Err(DashboardError::Metadata("Invalid dashboard ID"));
95+
};
10596

106-
if DASHBOARDS
107-
.get_dashboard(&dashboard_id, &user_id)
108-
.await
109-
.is_none()
110-
{
97+
if DASHBOARDS.get_dashboard(dashboard_id).await.is_none() {
11198
return Err(DashboardError::Metadata("Dashboard does not exist"));
11299
}
113-
dashboard.dashboard_id = Some(dashboard_id.to_string());
114-
dashboard.user_id = Some(user_id.clone());
100+
dashboard.dashboard_id = dashboard_id;
101+
dashboard.author = user_id.clone();
115102
dashboard.version = Some(CURRENT_DASHBOARD_VERSION.to_string());
116103
for tile in dashboard.tiles.iter_mut() {
117-
if tile.tile_id.is_none() {
118-
tile.tile_id = Some(get_hash(Utc::now().timestamp_micros().to_string().as_str()));
104+
if tile.tile_id.is_nil() {
105+
tile.tile_id = Ulid::new();
119106
}
120107
}
121108
DASHBOARDS.update(&dashboard).await;
@@ -137,19 +124,19 @@ pub async fn delete(
137124
) -> Result<HttpResponse, DashboardError> {
138125
let mut user_id = get_user_from_request(&req)?;
139126
user_id = get_hash(&user_id);
140-
let dashboard_id = dashboard_id.into_inner();
141-
if DASHBOARDS
142-
.get_dashboard(&dashboard_id, &user_id)
143-
.await
144-
.is_none()
145-
{
127+
let dashboard_id = if let Ok(dashboard_id) = Ulid::from_string(&dashboard_id.into_inner()) {
128+
dashboard_id
129+
} else {
130+
return Err(DashboardError::Metadata("Invalid dashboard ID"));
131+
};
132+
if DASHBOARDS.get_dashboard(dashboard_id).await.is_none() {
146133
return Err(DashboardError::Metadata("Dashboard does not exist"));
147134
}
148135
let path = dashboard_path(&user_id, &format!("{}.json", dashboard_id));
149136
let store = PARSEABLE.storage.get_object_store();
150137
store.delete_object(&path).await?;
151138

152-
DASHBOARDS.delete_dashboard(&dashboard_id).await;
139+
DASHBOARDS.delete_dashboard(dashboard_id).await;
153140

154141
Ok(HttpResponse::Ok().finish())
155142
}

src/prism/home/mod.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ pub async fn generate_home_response(key: &SessionKey) -> Result<HomeResponse, Pr
103103
get_stream_titles(key),
104104
get_alert_titles(key),
105105
get_correlation_titles(key),
106-
get_dashboard_titles(key),
106+
get_dashboard_titles(),
107107
get_filter_titles(key),
108108
get_alerts_info()
109109
);
@@ -239,19 +239,14 @@ async fn get_correlation_titles(key: &SessionKey) -> Result<Vec<TitleAndId>, Pri
239239
Ok(correlation_titles)
240240
}
241241

242-
async fn get_dashboard_titles(key: &SessionKey) -> Result<Vec<TitleAndId>, PrismHomeError> {
242+
async fn get_dashboard_titles() -> Result<Vec<TitleAndId>, PrismHomeError> {
243243
let dashboard_titles = DASHBOARDS
244-
.list_dashboards(key)
244+
.list_dashboards()
245245
.await
246246
.iter()
247247
.map(|dashboard| TitleAndId {
248-
title: dashboard.name.clone(),
249-
id: dashboard
250-
.dashboard_id
251-
.as_ref()
252-
.ok_or_else(|| anyhow::Error::msg("Dashboard ID is null"))
253-
.unwrap()
254-
.clone(),
248+
title: dashboard.title.clone(),
249+
id: dashboard.dashboard_id.to_string(),
255250
})
256251
.collect_vec();
257252

0 commit comments

Comments
 (0)