Skip to content

Commit 886c1e0

Browse files
fix write lock issue, remove tile id generation
1 parent 4f3d432 commit 886c1e0

File tree

3 files changed

+71
-48
lines changed

3 files changed

+71
-48
lines changed

src/handlers/http/modal/server.rs

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,6 @@ impl Server {
241241
)
242242
}
243243

244-
// get the dashboards web scope
245244
pub fn get_dashboards_webscope() -> Scope {
246245
web::scope("/dashboards")
247246
.service(
@@ -258,30 +257,33 @@ impl Server {
258257
),
259258
)
260259
.service(
261-
web::resource("/{dashboard_id}")
262-
.route(
263-
web::get()
264-
.to(dashboards::get)
265-
.authorize(Action::GetDashboard),
266-
)
267-
.route(
268-
web::delete()
269-
.to(dashboards::delete)
270-
.authorize(Action::DeleteDashboard),
260+
web::scope("/{dashboard_id}")
261+
.service(
262+
web::resource("")
263+
.route(
264+
web::get()
265+
.to(dashboards::get)
266+
.authorize(Action::GetDashboard),
267+
)
268+
.route(
269+
web::delete()
270+
.to(dashboards::delete)
271+
.authorize(Action::DeleteDashboard),
272+
)
273+
.route(
274+
web::put()
275+
.to(dashboards::update)
276+
.authorize(Action::CreateDashboard),
277+
),
271278
)
272-
.route(
273-
web::put()
274-
.to(dashboards::update)
275-
.authorize(Action::CreateDashboard),
279+
.service(
280+
web::resource("/add_tile").route(
281+
web::put()
282+
.to(dashboards::add_tile)
283+
.authorize(Action::CreateDashboard),
284+
),
276285
),
277286
)
278-
.service(
279-
web::resource("/add_tile").route(
280-
web::post()
281-
.to(dashboards::add_tile)
282-
.authorize(Action::CreateDashboard),
283-
),
284-
)
285287
}
286288

287289
// get the filters web scope

src/handlers/http/users/dashboards.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ pub async fn delete(
125125
pub async fn add_tile(
126126
req: HttpRequest,
127127
dashboard_id: Path<String>,
128-
Json(mut tile): Json<Tile>,
128+
Json(tile): Json<Tile>,
129129
) -> Result<impl Responder, DashboardError> {
130130
let mut user_id = get_user_from_request(&req)?;
131131
user_id = get_hash(&user_id);
@@ -139,10 +139,7 @@ pub async fn add_tile(
139139
.get_dashboard(dashboard_id)
140140
.await
141141
.ok_or(DashboardError::Metadata("Dashboard does not exist"))?;
142-
if tile.tile_id.is_nil() {
143-
tile.tile_id = Ulid::new();
144-
}
145-
dashboard.tiles.push(tile.clone());
142+
dashboard.tiles.as_mut().unwrap().push(tile.clone());
146143
DASHBOARDS
147144
.update(&user_id, dashboard_id, &mut dashboard)
148145
.await?;

src/users/dashboards.rs

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ pub struct Dashboard {
5353
pub dashboard_id: Option<Ulid>,
5454
pub modified: Option<DateTime<Utc>>,
5555
dashboard_type: Option<DashboardType>,
56-
pub tiles: Vec<Tile>,
56+
pub tiles: Option<Vec<Tile>>,
5757
}
5858

5959
#[derive(Default, Debug)]
@@ -88,25 +88,22 @@ impl Dashboards {
8888
user_id: &str,
8989
dashboard: &mut Dashboard,
9090
) -> Result<(), DashboardError> {
91-
let mut s = self.0.write().await;
9291
let dashboard_id = Ulid::new();
9392
dashboard.author = Some(user_id.to_string());
9493
dashboard.dashboard_id = Some(dashboard_id);
9594
dashboard.version = Some(CURRENT_DASHBOARD_VERSION.to_string());
9695
dashboard.modified = Some(Utc::now());
9796
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-
10397
let path = dashboard_path(user_id, &format!("{}.json", dashboard_id));
10498

10599
let store = PARSEABLE.storage.get_object_store();
106100
let dashboard_bytes = serde_json::to_vec(&dashboard)?;
107101
store
108102
.put_object(&path, Bytes::from(dashboard_bytes))
109103
.await?;
104+
105+
self.0.write().await.push(dashboard.clone());
106+
110107
Ok(())
111108
}
112109

@@ -116,20 +113,18 @@ impl Dashboards {
116113
dashboard_id: Ulid,
117114
dashboard: &mut Dashboard,
118115
) -> Result<(), DashboardError> {
119-
let mut s = self.0.write().await;
120-
if self.get_dashboard(dashboard_id).await.is_none() {
116+
if self
117+
.get_dashboard_by_user(dashboard_id, user_id)
118+
.await
119+
.is_none()
120+
{
121121
return Err(DashboardError::Metadata("Dashboard does not exist"));
122122
}
123+
dashboard.author = Some(user_id.to_string());
123124
dashboard.dashboard_id = Some(dashboard_id);
124-
dashboard.modified = Some(Utc::now());
125125
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-
}
131-
s.retain(|d| d.dashboard_id != dashboard.dashboard_id);
132-
s.push(dashboard.clone());
126+
dashboard.modified = Some(Utc::now());
127+
dashboard.dashboard_type = Some(DashboardType::Dashboard);
133128

134129
let path = dashboard_path(user_id, &format!("{}.json", dashboard_id));
135130

@@ -138,6 +133,13 @@ impl Dashboards {
138133
store
139134
.put_object(&path, Bytes::from(dashboard_bytes))
140135
.await?;
136+
137+
self.0
138+
.write()
139+
.await
140+
.retain(|d| d.dashboard_id != dashboard.dashboard_id);
141+
self.0.write().await.push(dashboard.clone());
142+
141143
Ok(())
142144
}
143145

@@ -146,15 +148,21 @@ impl Dashboards {
146148
user_id: &str,
147149
dashboard_id: Ulid,
148150
) -> Result<(), DashboardError> {
149-
let mut s = self.0.write().await;
150-
151-
if self.get_dashboard(dashboard_id).await.is_none() {
151+
if self
152+
.get_dashboard_by_user(dashboard_id, user_id)
153+
.await
154+
.is_none()
155+
{
152156
return Err(DashboardError::Metadata("Dashboard does not exist"));
153157
}
154-
s.retain(|d| *d.dashboard_id.as_ref().unwrap() != dashboard_id);
158+
155159
let path = dashboard_path(user_id, &format!("{}.json", dashboard_id));
156160
let store = PARSEABLE.storage.get_object_store();
157161
store.delete_object(&path).await?;
162+
self.0
163+
.write()
164+
.await
165+
.retain(|d| *d.dashboard_id.as_ref().unwrap() != dashboard_id);
158166

159167
Ok(())
160168
}
@@ -168,6 +176,22 @@ impl Dashboards {
168176
.cloned()
169177
}
170178

179+
pub async fn get_dashboard_by_user(
180+
&self,
181+
dashboard_id: Ulid,
182+
user_id: &str,
183+
) -> Option<Dashboard> {
184+
self.0
185+
.read()
186+
.await
187+
.iter()
188+
.find(|d| {
189+
*d.dashboard_id.as_ref().unwrap() == dashboard_id
190+
&& d.author == Some(user_id.to_string())
191+
})
192+
.cloned()
193+
}
194+
171195
pub async fn list_dashboards(&self) -> Vec<Dashboard> {
172196
let read = self.0.read().await;
173197

0 commit comments

Comments
 (0)