@@ -20,7 +20,7 @@ use crate::{
20
20
handlers:: http:: rbac:: RBACError ,
21
21
parseable:: PARSEABLE ,
22
22
storage:: { object_storage:: dashboard_path, ObjectStorageError } ,
23
- users:: dashboards:: { Dashboard , CURRENT_DASHBOARD_VERSION , DASHBOARDS } ,
23
+ users:: dashboards:: { Dashboard , Tile , CURRENT_DASHBOARD_VERSION , DASHBOARDS } ,
24
24
utils:: { get_hash, get_user_from_request} ,
25
25
} ;
26
26
use actix_web:: {
@@ -30,13 +30,33 @@ use actix_web::{
30
30
} ;
31
31
use bytes:: Bytes ;
32
32
33
+ use chrono:: Utc ;
33
34
use http:: StatusCode ;
34
- use serde_json:: Error as SerdeError ;
35
+ use serde_json:: { Error as SerdeError , Map } ;
35
36
use ulid:: Ulid ;
36
37
37
38
pub async fn list ( ) -> Result < impl Responder , DashboardError > {
38
39
let dashboards = DASHBOARDS . list_dashboards ( ) . await ;
39
-
40
+ //dashboards list should contain the title, author and modified date
41
+ let dashboards: Vec < Map < String , serde_json:: Value > > = dashboards
42
+ . iter ( )
43
+ . map ( |dashboard| {
44
+ let mut map = Map :: new ( ) ;
45
+ map. insert (
46
+ "title" . to_string ( ) ,
47
+ serde_json:: Value :: String ( dashboard. title . clone ( ) ) ,
48
+ ) ;
49
+ map. insert (
50
+ "author" . to_string ( ) ,
51
+ serde_json:: Value :: String ( dashboard. author . clone ( ) ) ,
52
+ ) ;
53
+ map. insert (
54
+ "modified" . to_string ( ) ,
55
+ serde_json:: Value :: String ( dashboard. modified . unwrap ( ) . to_string ( ) ) ,
56
+ ) ;
57
+ map
58
+ } )
59
+ . collect ( ) ;
40
60
Ok ( ( web:: Json ( dashboards) , StatusCode :: OK ) )
41
61
}
42
62
@@ -63,7 +83,7 @@ pub async fn post(
63
83
let dashboard_id = Ulid :: new ( ) ;
64
84
dashboard. dashboard_id = dashboard_id;
65
85
dashboard. version = Some ( CURRENT_DASHBOARD_VERSION . to_string ( ) ) ;
66
-
86
+ dashboard . modified = Some ( Utc :: now ( ) ) ;
67
87
dashboard. author = user_id. clone ( ) ;
68
88
for tile in dashboard. tiles . iter_mut ( ) {
69
89
tile. tile_id = Ulid :: new ( ) ;
@@ -99,6 +119,7 @@ pub async fn update(
99
119
}
100
120
dashboard. dashboard_id = dashboard_id;
101
121
dashboard. author = user_id. clone ( ) ;
122
+ dashboard. modified = Some ( Utc :: now ( ) ) ;
102
123
dashboard. version = Some ( CURRENT_DASHBOARD_VERSION . to_string ( ) ) ;
103
124
for tile in dashboard. tiles . iter_mut ( ) {
104
125
if tile. tile_id . is_nil ( ) {
@@ -141,6 +162,42 @@ pub async fn delete(
141
162
Ok ( HttpResponse :: Ok ( ) . finish ( ) )
142
163
}
143
164
165
+ pub async fn add_tile (
166
+ req : HttpRequest ,
167
+ dashboard_id : Path < String > ,
168
+ Json ( mut tile) : Json < Tile > ,
169
+ ) -> Result < impl Responder , DashboardError > {
170
+ let mut user_id = get_user_from_request ( & req) ?;
171
+ user_id = get_hash ( & user_id) ;
172
+ let dashboard_id = if let Ok ( dashboard_id) = Ulid :: from_string ( & dashboard_id. into_inner ( ) ) {
173
+ dashboard_id
174
+ } else {
175
+ return Err ( DashboardError :: Metadata ( "Invalid dashboard ID" ) ) ;
176
+ } ;
177
+
178
+ let mut dashboard = DASHBOARDS
179
+ . get_dashboard ( dashboard_id)
180
+ . await
181
+ . ok_or ( DashboardError :: Metadata ( "Dashboard does not exist" ) ) ?;
182
+ if tile. tile_id . is_nil ( ) {
183
+ tile. tile_id = Ulid :: new ( ) ;
184
+ }
185
+ 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) )
196
+ . await ?;
197
+
198
+ Ok ( ( web:: Json ( dashboard) , StatusCode :: OK ) )
199
+ }
200
+
144
201
#[ derive( Debug , thiserror:: Error ) ]
145
202
pub enum DashboardError {
146
203
#[ error( "Failed to connect to storage: {0}" ) ]
0 commit comments