1717 */
1818
1919use crate :: {
20- handlers:: http:: ingest :: PostError ,
20+ handlers:: http:: rbac :: RBACError ,
2121 option:: CONFIG ,
2222 storage:: { object_storage:: dashboard_path, ObjectStorageError } ,
2323 users:: dashboards:: { Dashboard , CURRENT_DASHBOARD_VERSION , DASHBOARDS } ,
24+ utils:: { get_hash, get_user_from_request} ,
2425} ;
2526use actix_web:: { http:: header:: ContentType , web, HttpRequest , HttpResponse , Responder } ;
2627use bytes:: Bytes ;
@@ -30,11 +31,8 @@ use http::StatusCode;
3031use serde_json:: Error as SerdeError ;
3132
3233pub async fn list ( req : HttpRequest ) -> Result < impl Responder , DashboardError > {
33- let user_id = req
34- . match_info ( )
35- . get ( "user_id" )
36- . ok_or ( DashboardError :: Metadata ( "No User Id Provided" ) ) ?;
37- let dashboards = DASHBOARDS . list_dashboards_by_user ( user_id) ;
34+ let user_id = get_user_from_request ( & req) ?;
35+ let dashboards = DASHBOARDS . list_dashboards_by_user ( & get_hash ( & user_id) ) ;
3836
3937 Ok ( ( web:: Json ( dashboards) , StatusCode :: OK ) )
4038}
@@ -52,21 +50,19 @@ pub async fn get(req: HttpRequest) -> Result<impl Responder, DashboardError> {
5250 Err ( DashboardError :: Metadata ( "Dashboard does not exist" ) )
5351}
5452
55- pub async fn post ( body : Bytes ) -> Result < impl Responder , PostError > {
53+ pub async fn post ( req : HttpRequest , body : Bytes ) -> Result < impl Responder , DashboardError > {
54+ let user_id = get_user_from_request ( & req) ?;
5655 let mut dashboard: Dashboard = serde_json:: from_slice ( & body) ?;
57- let dashboard_id = format ! ( "{}.{}" , & dashboard . user_id , Utc :: now( ) . timestamp_millis ( ) ) ;
56+ let dashboard_id = get_hash ( Utc :: now ( ) . timestamp_micros ( ) . to_string ( ) . as_str ( ) ) ;
5857 dashboard. dashboard_id = Some ( dashboard_id. clone ( ) ) ;
5958 dashboard. version = Some ( CURRENT_DASHBOARD_VERSION . to_string ( ) ) ;
59+ dashboard. user_id = Some ( get_hash ( & user_id) ) ;
6060 for tile in dashboard. tiles . iter_mut ( ) {
61- tile. tile_id = Some ( format ! (
62- "{}.{}" ,
63- & dashboard. user_id,
64- Utc :: now( ) . timestamp_micros( )
65- ) ) ;
61+ tile. tile_id = Some ( get_hash ( Utc :: now ( ) . timestamp_micros ( ) . to_string ( ) . as_str ( ) ) ) ;
6662 }
6763 DASHBOARDS . update ( & dashboard) ;
6864
69- let path = dashboard_path ( & dashboard . user_id , & format ! ( "{}.json" , dashboard_id) ) ;
65+ let path = dashboard_path ( & user_id, & format ! ( "{}.json" , dashboard_id) ) ;
7066
7167 let store = CONFIG . storage ( ) . get_object_store ( ) ;
7268 let dashboard_bytes = serde_json:: to_vec ( & dashboard) ?;
@@ -77,31 +73,26 @@ pub async fn post(body: Bytes) -> Result<impl Responder, PostError> {
7773 Ok ( ( web:: Json ( dashboard) , StatusCode :: OK ) )
7874}
7975
80- pub async fn update ( req : HttpRequest , body : Bytes ) -> Result < impl Responder , PostError > {
76+ pub async fn update ( req : HttpRequest , body : Bytes ) -> Result < impl Responder , DashboardError > {
77+ let user_id = get_user_from_request ( & req) ?;
8178 let dashboard_id = req
8279 . match_info ( )
8380 . get ( "dashboard_id" )
8481 . ok_or ( DashboardError :: Metadata ( "No Dashboard Id Provided" ) ) ?;
8582 if DASHBOARDS . get_dashboard ( dashboard_id) . is_none ( ) {
86- return Err ( PostError :: DashboardError ( DashboardError :: Metadata (
87- "Dashboard does not exist" ,
88- ) ) ) ;
83+ return Err ( DashboardError :: Metadata ( "Dashboard does not exist" ) ) ;
8984 }
9085 let mut dashboard: Dashboard = serde_json:: from_slice ( & body) ?;
9186 dashboard. dashboard_id = Some ( dashboard_id. to_string ( ) ) ;
9287 dashboard. version = Some ( CURRENT_DASHBOARD_VERSION . to_string ( ) ) ;
9388 for tile in dashboard. tiles . iter_mut ( ) {
9489 if tile. tile_id . is_none ( ) {
95- tile. tile_id = Some ( format ! (
96- "{}.{}" ,
97- & dashboard. user_id,
98- Utc :: now( ) . timestamp_micros( )
99- ) ) ;
90+ tile. tile_id = Some ( get_hash ( Utc :: now ( ) . timestamp_micros ( ) . to_string ( ) . as_str ( ) ) ) ;
10091 }
10192 }
10293 DASHBOARDS . update ( & dashboard) ;
10394
104- let path = dashboard_path ( & dashboard . user_id , & format ! ( "{}.json" , dashboard_id) ) ;
95+ let path = dashboard_path ( & user_id, & format ! ( "{}.json" , dashboard_id) ) ;
10596
10697 let store = CONFIG . storage ( ) . get_object_store ( ) ;
10798 let dashboard_bytes = serde_json:: to_vec ( & dashboard) ?;
@@ -112,16 +103,13 @@ pub async fn update(req: HttpRequest, body: Bytes) -> Result<impl Responder, Pos
112103 Ok ( ( web:: Json ( dashboard) , StatusCode :: OK ) )
113104}
114105
115- pub async fn delete ( req : HttpRequest ) -> Result < HttpResponse , PostError > {
106+ pub async fn delete ( req : HttpRequest ) -> Result < HttpResponse , DashboardError > {
107+ let user_id = get_user_from_request ( & req) ?;
116108 let dashboard_id = req
117109 . match_info ( )
118110 . get ( "dashboard_id" )
119111 . ok_or ( DashboardError :: Metadata ( "No Dashboard Id Provided" ) ) ?;
120- let dashboard = DASHBOARDS
121- . get_dashboard ( dashboard_id)
122- . ok_or ( DashboardError :: Metadata ( "Dashboard does not exist" ) ) ?;
123-
124- let path = dashboard_path ( & dashboard. user_id , & format ! ( "{}.json" , dashboard_id) ) ;
112+ let path = dashboard_path ( & user_id, & format ! ( "{}.json" , dashboard_id) ) ;
125113 let store = CONFIG . storage ( ) . get_object_store ( ) ;
126114 store. delete_object ( & path) . await ?;
127115
@@ -138,6 +126,8 @@ pub enum DashboardError {
138126 Serde ( #[ from] SerdeError ) ,
139127 #[ error( "Cannot perform this operation: {0}" ) ]
140128 Metadata ( & ' static str ) ,
129+ #[ error( "User does not exist" ) ]
130+ UserDoesNotExist ( #[ from] RBACError ) ,
141131}
142132
143133impl actix_web:: ResponseError for DashboardError {
@@ -146,6 +136,7 @@ impl actix_web::ResponseError for DashboardError {
146136 Self :: ObjectStorage ( _) => StatusCode :: INTERNAL_SERVER_ERROR ,
147137 Self :: Serde ( _) => StatusCode :: BAD_REQUEST ,
148138 Self :: Metadata ( _) => StatusCode :: BAD_REQUEST ,
139+ Self :: UserDoesNotExist ( _) => StatusCode :: NOT_FOUND ,
149140 }
150141 }
151142
0 commit comments