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,43 +31,39 @@ 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}
4139
4240pub async fn get ( req : HttpRequest ) -> Result < impl Responder , DashboardError > {
41+ let user_id = get_user_from_request ( & req) ?;
4342 let dashboard_id = req
4443 . match_info ( )
4544 . get ( "dashboard_id" )
4645 . ok_or ( DashboardError :: Metadata ( "No Dashboard Id Provided" ) ) ?;
4746
48- if let Some ( dashboard) = DASHBOARDS . get_dashboard ( dashboard_id) {
47+ if let Some ( dashboard) = DASHBOARDS . get_dashboard ( dashboard_id, & get_hash ( & user_id ) ) {
4948 return Ok ( ( web:: Json ( dashboard) , StatusCode :: OK ) ) ;
5049 }
5150
5251 Err ( DashboardError :: Metadata ( "Dashboard does not exist" ) )
5352}
5453
55- pub async fn post ( body : Bytes ) -> Result < impl Responder , PostError > {
54+ pub async fn post ( req : HttpRequest , body : Bytes ) -> Result < impl Responder , DashboardError > {
55+ let user_id = get_user_from_request ( & req) ?;
5656 let mut dashboard: Dashboard = serde_json:: from_slice ( & body) ?;
57- let dashboard_id = format ! ( "{}.{}" , & dashboard . user_id , Utc :: now( ) . timestamp_millis ( ) ) ;
57+ let dashboard_id = get_hash ( Utc :: now ( ) . timestamp_micros ( ) . to_string ( ) . as_str ( ) ) ;
5858 dashboard. dashboard_id = Some ( dashboard_id. clone ( ) ) ;
5959 dashboard. version = Some ( CURRENT_DASHBOARD_VERSION . to_string ( ) ) ;
60+ dashboard. user_id = Some ( get_hash ( & user_id) ) ;
6061 for tile in dashboard. tiles . iter_mut ( ) {
61- tile. tile_id = Some ( format ! (
62- "{}.{}" ,
63- & dashboard. user_id,
64- Utc :: now( ) . timestamp_micros( )
65- ) ) ;
62+ tile. tile_id = Some ( get_hash ( Utc :: now ( ) . timestamp_micros ( ) . to_string ( ) . as_str ( ) ) ) ;
6663 }
6764 DASHBOARDS . update ( & dashboard) ;
6865
69- let path = dashboard_path ( & dashboard . user_id , & format ! ( "{}.json" , dashboard_id) ) ;
66+ let path = dashboard_path ( & user_id, & format ! ( "{}.json" , dashboard_id) ) ;
7067
7168 let store = CONFIG . storage ( ) . get_object_store ( ) ;
7269 let dashboard_bytes = serde_json:: to_vec ( & dashboard) ?;
@@ -77,31 +74,29 @@ pub async fn post(body: Bytes) -> Result<impl Responder, PostError> {
7774 Ok ( ( web:: Json ( dashboard) , StatusCode :: OK ) )
7875}
7976
80- pub async fn update ( req : HttpRequest , body : Bytes ) -> Result < impl Responder , PostError > {
77+ pub async fn update ( req : HttpRequest , body : Bytes ) -> Result < impl Responder , DashboardError > {
78+ let user_id = get_user_from_request ( & req) ?;
8179 let dashboard_id = req
8280 . match_info ( )
8381 . get ( "dashboard_id" )
8482 . ok_or ( DashboardError :: Metadata ( "No Dashboard Id Provided" ) ) ?;
85- if DASHBOARDS . get_dashboard ( dashboard_id) . is_none ( ) {
86- return Err ( PostError :: DashboardError ( DashboardError :: Metadata (
87- "Dashboard does not exist" ,
88- ) ) ) ;
83+ if DASHBOARDS
84+ . get_dashboard ( dashboard_id, & get_hash ( & user_id) )
85+ . is_none ( )
86+ {
87+ return Err ( DashboardError :: Metadata ( "Dashboard does not exist" ) ) ;
8988 }
9089 let mut dashboard: Dashboard = serde_json:: from_slice ( & body) ?;
9190 dashboard. dashboard_id = Some ( dashboard_id. to_string ( ) ) ;
9291 dashboard. version = Some ( CURRENT_DASHBOARD_VERSION . to_string ( ) ) ;
9392 for tile in dashboard. tiles . iter_mut ( ) {
9493 if tile. tile_id . is_none ( ) {
95- tile. tile_id = Some ( format ! (
96- "{}.{}" ,
97- & dashboard. user_id,
98- Utc :: now( ) . timestamp_micros( )
99- ) ) ;
94+ tile. tile_id = Some ( get_hash ( Utc :: now ( ) . timestamp_micros ( ) . to_string ( ) . as_str ( ) ) ) ;
10095 }
10196 }
10297 DASHBOARDS . update ( & dashboard) ;
10398
104- let path = dashboard_path ( & dashboard . user_id , & format ! ( "{}.json" , dashboard_id) ) ;
99+ let path = dashboard_path ( & user_id, & format ! ( "{}.json" , dashboard_id) ) ;
105100
106101 let store = CONFIG . storage ( ) . get_object_store ( ) ;
107102 let dashboard_bytes = serde_json:: to_vec ( & dashboard) ?;
@@ -112,16 +107,19 @@ pub async fn update(req: HttpRequest, body: Bytes) -> Result<impl Responder, Pos
112107 Ok ( ( web:: Json ( dashboard) , StatusCode :: OK ) )
113108}
114109
115- pub async fn delete ( req : HttpRequest ) -> Result < HttpResponse , PostError > {
110+ pub async fn delete ( req : HttpRequest ) -> Result < HttpResponse , DashboardError > {
111+ let user_id = get_user_from_request ( & req) ?;
116112 let dashboard_id = req
117113 . match_info ( )
118114 . get ( "dashboard_id" )
119115 . 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) ) ;
116+ if DASHBOARDS
117+ . get_dashboard ( dashboard_id, & get_hash ( & user_id) )
118+ . is_none ( )
119+ {
120+ return Err ( DashboardError :: Metadata ( "Dashboard does not exist" ) ) ;
121+ }
122+ let path = dashboard_path ( & user_id, & format ! ( "{}.json" , dashboard_id) ) ;
125123 let store = CONFIG . storage ( ) . get_object_store ( ) ;
126124 store. delete_object ( & path) . await ?;
127125
@@ -138,6 +136,8 @@ pub enum DashboardError {
138136 Serde ( #[ from] SerdeError ) ,
139137 #[ error( "Cannot perform this operation: {0}" ) ]
140138 Metadata ( & ' static str ) ,
139+ #[ error( "User does not exist" ) ]
140+ UserDoesNotExist ( #[ from] RBACError ) ,
141141}
142142
143143impl actix_web:: ResponseError for DashboardError {
@@ -146,6 +146,7 @@ impl actix_web::ResponseError for DashboardError {
146146 Self :: ObjectStorage ( _) => StatusCode :: INTERNAL_SERVER_ERROR ,
147147 Self :: Serde ( _) => StatusCode :: BAD_REQUEST ,
148148 Self :: Metadata ( _) => StatusCode :: BAD_REQUEST ,
149+ Self :: UserDoesNotExist ( _) => StatusCode :: NOT_FOUND ,
149150 }
150151 }
151152
0 commit comments