17
17
*/
18
18
19
19
use crate :: {
20
- handlers:: http:: ingest :: PostError ,
20
+ handlers:: http:: rbac :: RBACError ,
21
21
option:: CONFIG ,
22
22
storage:: { object_storage:: dashboard_path, ObjectStorageError } ,
23
23
users:: dashboards:: { Dashboard , CURRENT_DASHBOARD_VERSION , DASHBOARDS } ,
24
+ utils:: { get_hash, get_user_from_request} ,
24
25
} ;
25
26
use actix_web:: { http:: header:: ContentType , web, HttpRequest , HttpResponse , Responder } ;
26
27
use bytes:: Bytes ;
@@ -30,43 +31,39 @@ use http::StatusCode;
30
31
use serde_json:: Error as SerdeError ;
31
32
32
33
pub 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) ) ;
38
36
39
37
Ok ( ( web:: Json ( dashboards) , StatusCode :: OK ) )
40
38
}
41
39
42
40
pub async fn get ( req : HttpRequest ) -> Result < impl Responder , DashboardError > {
41
+ let user_id = get_user_from_request ( & req) ?;
43
42
let dashboard_id = req
44
43
. match_info ( )
45
44
. get ( "dashboard_id" )
46
45
. ok_or ( DashboardError :: Metadata ( "No Dashboard Id Provided" ) ) ?;
47
46
48
- if let Some ( dashboard) = DASHBOARDS . get_dashboard ( dashboard_id) {
47
+ if let Some ( dashboard) = DASHBOARDS . get_dashboard ( dashboard_id, & get_hash ( & user_id ) ) {
49
48
return Ok ( ( web:: Json ( dashboard) , StatusCode :: OK ) ) ;
50
49
}
51
50
52
51
Err ( DashboardError :: Metadata ( "Dashboard does not exist" ) )
53
52
}
54
53
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) ?;
56
56
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 ( ) ) ;
58
58
dashboard. dashboard_id = Some ( dashboard_id. clone ( ) ) ;
59
59
dashboard. version = Some ( CURRENT_DASHBOARD_VERSION . to_string ( ) ) ;
60
+ dashboard. user_id = Some ( get_hash ( & user_id) ) ;
60
61
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 ( ) ) ) ;
66
63
}
67
64
DASHBOARDS . update ( & dashboard) ;
68
65
69
- let path = dashboard_path ( & dashboard . user_id , & format ! ( "{}.json" , dashboard_id) ) ;
66
+ let path = dashboard_path ( & user_id, & format ! ( "{}.json" , dashboard_id) ) ;
70
67
71
68
let store = CONFIG . storage ( ) . get_object_store ( ) ;
72
69
let dashboard_bytes = serde_json:: to_vec ( & dashboard) ?;
@@ -77,31 +74,29 @@ pub async fn post(body: Bytes) -> Result<impl Responder, PostError> {
77
74
Ok ( ( web:: Json ( dashboard) , StatusCode :: OK ) )
78
75
}
79
76
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) ?;
81
79
let dashboard_id = req
82
80
. match_info ( )
83
81
. get ( "dashboard_id" )
84
82
. 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" ) ) ;
89
88
}
90
89
let mut dashboard: Dashboard = serde_json:: from_slice ( & body) ?;
91
90
dashboard. dashboard_id = Some ( dashboard_id. to_string ( ) ) ;
92
91
dashboard. version = Some ( CURRENT_DASHBOARD_VERSION . to_string ( ) ) ;
93
92
for tile in dashboard. tiles . iter_mut ( ) {
94
93
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 ( ) ) ) ;
100
95
}
101
96
}
102
97
DASHBOARDS . update ( & dashboard) ;
103
98
104
- let path = dashboard_path ( & dashboard . user_id , & format ! ( "{}.json" , dashboard_id) ) ;
99
+ let path = dashboard_path ( & user_id, & format ! ( "{}.json" , dashboard_id) ) ;
105
100
106
101
let store = CONFIG . storage ( ) . get_object_store ( ) ;
107
102
let dashboard_bytes = serde_json:: to_vec ( & dashboard) ?;
@@ -112,16 +107,19 @@ pub async fn update(req: HttpRequest, body: Bytes) -> Result<impl Responder, Pos
112
107
Ok ( ( web:: Json ( dashboard) , StatusCode :: OK ) )
113
108
}
114
109
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) ?;
116
112
let dashboard_id = req
117
113
. match_info ( )
118
114
. get ( "dashboard_id" )
119
115
. 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) ) ;
125
123
let store = CONFIG . storage ( ) . get_object_store ( ) ;
126
124
store. delete_object ( & path) . await ?;
127
125
@@ -138,6 +136,8 @@ pub enum DashboardError {
138
136
Serde ( #[ from] SerdeError ) ,
139
137
#[ error( "Cannot perform this operation: {0}" ) ]
140
138
Metadata ( & ' static str ) ,
139
+ #[ error( "User does not exist" ) ]
140
+ UserDoesNotExist ( #[ from] RBACError ) ,
141
141
}
142
142
143
143
impl actix_web:: ResponseError for DashboardError {
@@ -146,6 +146,7 @@ impl actix_web::ResponseError for DashboardError {
146
146
Self :: ObjectStorage ( _) => StatusCode :: INTERNAL_SERVER_ERROR ,
147
147
Self :: Serde ( _) => StatusCode :: BAD_REQUEST ,
148
148
Self :: Metadata ( _) => StatusCode :: BAD_REQUEST ,
149
+ Self :: UserDoesNotExist ( _) => StatusCode :: NOT_FOUND ,
149
150
}
150
151
}
151
152
0 commit comments