Skip to content

Commit cd58a46

Browse files
add dashboard type, refactor
1 parent 4e4b760 commit cd58a46

File tree

2 files changed

+88
-63
lines changed

2 files changed

+88
-63
lines changed

src/handlers/http/users/dashboards.rs

Lines changed: 8 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,15 @@
1818

1919
use crate::{
2020
handlers::http::rbac::RBACError,
21-
parseable::PARSEABLE,
22-
storage::{object_storage::dashboard_path, ObjectStorageError},
23-
users::dashboards::{Dashboard, Tile, CURRENT_DASHBOARD_VERSION, DASHBOARDS},
21+
storage::ObjectStorageError,
22+
users::dashboards::{Dashboard, Tile, DASHBOARDS},
2423
utils::{get_hash, get_user_from_request},
2524
};
2625
use actix_web::{
2726
http::header::ContentType,
2827
web::{self, Json, Path},
2928
HttpRequest, HttpResponse, Responder,
3029
};
31-
use bytes::Bytes;
32-
33-
use chrono::Utc;
3430
use http::StatusCode;
3531
use serde_json::{Error as SerdeError, Map};
3632
use ulid::Ulid;
@@ -80,24 +76,9 @@ pub async fn post(
8076
) -> Result<impl Responder, DashboardError> {
8177
let mut user_id = get_user_from_request(&req)?;
8278
user_id = get_hash(&user_id);
83-
let dashboard_id = Ulid::new();
84-
dashboard.dashboard_id = Some(dashboard_id);
85-
dashboard.version = Some(CURRENT_DASHBOARD_VERSION.to_string());
86-
dashboard.modified = Some(Utc::now());
8779
dashboard.author = Some(user_id.clone());
88-
for tile in dashboard.tiles.iter_mut() {
89-
tile.tile_id = Ulid::new();
90-
}
91-
DASHBOARDS.update(&dashboard).await;
92-
93-
let path = dashboard_path(&user_id, &format!("{}.json", dashboard_id));
94-
95-
let store = PARSEABLE.storage.get_object_store();
96-
let dashboard_bytes = serde_json::to_vec(&dashboard)?;
97-
store
98-
.put_object(&path, Bytes::from(dashboard_bytes))
99-
.await?;
10080

81+
DASHBOARDS.create(&user_id, &mut dashboard).await?;
10182
Ok((web::Json(dashboard), StatusCode::OK))
10283
}
10384

@@ -113,29 +94,11 @@ pub async fn update(
11394
} else {
11495
return Err(DashboardError::Metadata("Invalid dashboard ID"));
11596
};
116-
117-
if DASHBOARDS.get_dashboard(dashboard_id).await.is_none() {
118-
return Err(DashboardError::Metadata("Dashboard does not exist"));
119-
}
120-
dashboard.dashboard_id = Some(dashboard_id);
12197
dashboard.author = Some(user_id.clone());
122-
dashboard.modified = Some(Utc::now());
123-
dashboard.version = Some(CURRENT_DASHBOARD_VERSION.to_string());
124-
for tile in dashboard.tiles.iter_mut() {
125-
if tile.tile_id.is_nil() {
126-
tile.tile_id = Ulid::new();
127-
}
128-
}
129-
DASHBOARDS.update(&dashboard).await;
13098

131-
let path = dashboard_path(&user_id, &format!("{}.json", dashboard_id));
132-
133-
let store = PARSEABLE.storage.get_object_store();
134-
let dashboard_bytes = serde_json::to_vec(&dashboard)?;
135-
store
136-
.put_object(&path, Bytes::from(dashboard_bytes))
99+
DASHBOARDS
100+
.update(&user_id, dashboard_id, &mut dashboard)
137101
.await?;
138-
139102
Ok((web::Json(dashboard), StatusCode::OK))
140103
}
141104

@@ -150,14 +113,7 @@ pub async fn delete(
150113
} else {
151114
return Err(DashboardError::Metadata("Invalid dashboard ID"));
152115
};
153-
if DASHBOARDS.get_dashboard(dashboard_id).await.is_none() {
154-
return Err(DashboardError::Metadata("Dashboard does not exist"));
155-
}
156-
let path = dashboard_path(&user_id, &format!("{}.json", dashboard_id));
157-
let store = PARSEABLE.storage.get_object_store();
158-
store.delete_object(&path).await?;
159-
160-
DASHBOARDS.delete_dashboard(dashboard_id).await;
116+
DASHBOARDS.delete_dashboard(&user_id, dashboard_id).await?;
161117

162118
Ok(HttpResponse::Ok().finish())
163119
}
@@ -183,16 +139,8 @@ pub async fn add_tile(
183139
tile.tile_id = Ulid::new();
184140
}
185141
dashboard.tiles.push(tile.clone());
186-
dashboard.modified = Some(Utc::now());
187-
dashboard.version = Some(CURRENT_DASHBOARD_VERSION.to_string());
188-
DASHBOARDS.update(&dashboard).await;
189-
190-
let path = dashboard_path(&user_id, &format!("{}.json", dashboard_id));
191-
192-
let store = PARSEABLE.storage.get_object_store();
193-
let dashboard_bytes = serde_json::to_vec(&dashboard)?;
194-
store
195-
.put_object(&path, Bytes::from(dashboard_bytes))
142+
DASHBOARDS
143+
.update(&user_id, dashboard_id, &mut dashboard)
196144
.await?;
197145

198146
Ok((web::Json(dashboard), StatusCode::OK))

src/users/dashboards.rs

Lines changed: 80 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,29 @@
1616
*
1717
*/
1818

19+
use bytes::Bytes;
1920
use chrono::{DateTime, Utc};
2021
use once_cell::sync::Lazy;
2122
use serde::{Deserialize, Serialize};
2223
use serde_json::Value;
2324
use tokio::sync::RwLock;
2425
use ulid::Ulid;
2526

26-
use crate::parseable::PARSEABLE;
27+
use crate::{
28+
handlers::http::users::dashboards::DashboardError, parseable::PARSEABLE,
29+
storage::object_storage::dashboard_path,
30+
};
2731

2832
pub static DASHBOARDS: Lazy<Dashboards> = Lazy::new(Dashboards::default);
2933
pub const CURRENT_DASHBOARD_VERSION: &str = "v1";
3034

35+
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Default)]
36+
pub enum DashboardType {
37+
#[default]
38+
Dashboard,
39+
Report,
40+
}
41+
3142
#[derive(Debug, Serialize, Deserialize, Default, Clone)]
3243
pub struct Tile {
3344
pub tile_id: Ulid,
@@ -41,6 +52,7 @@ pub struct Dashboard {
4152
pub author: Option<String>,
4253
pub dashboard_id: Option<Ulid>,
4354
pub modified: Option<DateTime<Utc>>,
55+
dashboard_type: Option<DashboardType>,
4456
pub tiles: Vec<Tile>,
4557
}
4658

@@ -71,15 +83,80 @@ impl Dashboards {
7183
Ok(())
7284
}
7385

74-
pub async fn update(&self, dashboard: &Dashboard) {
86+
pub async fn create(
87+
&self,
88+
user_id: &str,
89+
dashboard: &mut Dashboard,
90+
) -> Result<(), DashboardError> {
91+
let mut s = self.0.write().await;
92+
let dashboard_id = Ulid::new();
93+
dashboard.author = Some(user_id.to_string());
94+
dashboard.dashboard_id = Some(dashboard_id);
95+
dashboard.version = Some(CURRENT_DASHBOARD_VERSION.to_string());
96+
dashboard.modified = Some(Utc::now());
97+
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+
103+
let path = dashboard_path(user_id, &format!("{}.json", dashboard_id));
104+
105+
let store = PARSEABLE.storage.get_object_store();
106+
let dashboard_bytes = serde_json::to_vec(&dashboard)?;
107+
store
108+
.put_object(&path, Bytes::from(dashboard_bytes))
109+
.await?;
110+
Ok(())
111+
}
112+
113+
pub async fn update(
114+
&self,
115+
user_id: &str,
116+
dashboard_id: Ulid,
117+
dashboard: &mut Dashboard,
118+
) -> Result<(), DashboardError> {
75119
let mut s = self.0.write().await;
120+
if self.get_dashboard(dashboard_id).await.is_none() {
121+
return Err(DashboardError::Metadata("Dashboard does not exist"));
122+
}
123+
dashboard.dashboard_id = Some(dashboard_id);
124+
dashboard.modified = Some(Utc::now());
125+
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+
}
76131
s.retain(|d| d.dashboard_id != dashboard.dashboard_id);
77132
s.push(dashboard.clone());
133+
134+
let path = dashboard_path(user_id, &format!("{}.json", dashboard_id));
135+
136+
let store = PARSEABLE.storage.get_object_store();
137+
let dashboard_bytes = serde_json::to_vec(&dashboard)?;
138+
store
139+
.put_object(&path, Bytes::from(dashboard_bytes))
140+
.await?;
141+
Ok(())
78142
}
79143

80-
pub async fn delete_dashboard(&self, dashboard_id: Ulid) {
144+
pub async fn delete_dashboard(
145+
&self,
146+
user_id: &str,
147+
dashboard_id: Ulid,
148+
) -> Result<(), DashboardError> {
81149
let mut s = self.0.write().await;
150+
151+
if self.get_dashboard(dashboard_id).await.is_none() {
152+
return Err(DashboardError::Metadata("Dashboard does not exist"));
153+
}
82154
s.retain(|d| *d.dashboard_id.as_ref().unwrap() != dashboard_id);
155+
let path = dashboard_path(user_id, &format!("{}.json", dashboard_id));
156+
let store = PARSEABLE.storage.get_object_store();
157+
store.delete_object(&path).await?;
158+
159+
Ok(())
83160
}
84161

85162
pub async fn get_dashboard(&self, dashboard_id: Ulid) -> Option<Dashboard> {

0 commit comments

Comments
 (0)