@@ -12,36 +12,45 @@ use aw_models::Event;
1212
1313use rocket:: http:: Header ;
1414use rocket:: http:: Status ;
15- use rocket:: response:: status;
1615use rocket:: response:: Response ;
1716use rocket:: State ;
1817
19- use crate :: endpoints:: { http_err , http_ok , HttpResponse , ServerState } ;
18+ use crate :: endpoints:: { HttpErrorJson , ServerState } ;
2019
2120use aw_datastore:: DatastoreError ;
2221
2322#[ get( "/" ) ]
24- pub fn buckets_get ( state : State < ServerState > ) -> Result < Json < HashMap < String , Bucket > > , Status > {
23+ pub fn buckets_get (
24+ state : State < ServerState > ,
25+ ) -> Result < Json < HashMap < String , Bucket > > , HttpErrorJson > {
2526 let datastore = endpoints_get_lock ! ( state. datastore) ;
2627 match datastore. get_buckets ( ) {
2728 Ok ( bucketlist) => Ok ( Json ( bucketlist) ) ,
2829 Err ( e) => {
29- warn ! ( "Unexpected error: {:?}" , e) ;
30- Err ( Status :: InternalServerError )
30+ let err_msg = format ! ( "Unexpected error: {:?}" , e) ;
31+ warn ! ( "{}" , err_msg) ;
32+ Err ( HttpErrorJson :: new ( Status :: InternalServerError , err_msg) )
3133 }
3234 }
3335}
3436
3537#[ get( "/<bucket_id>" ) ]
36- pub fn bucket_get ( bucket_id : String , state : State < ServerState > ) -> Result < Json < Bucket > , Status > {
38+ pub fn bucket_get (
39+ bucket_id : String ,
40+ state : State < ServerState > ,
41+ ) -> Result < Json < Bucket > , HttpErrorJson > {
3742 let datastore = endpoints_get_lock ! ( state. datastore) ;
3843 match datastore. get_bucket ( & bucket_id) {
3944 Ok ( bucket) => Ok ( Json ( bucket) ) ,
4045 Err ( e) => match e {
41- DatastoreError :: NoSuchBucket => Err ( Status :: NotFound ) ,
46+ DatastoreError :: NoSuchBucket => Err ( HttpErrorJson :: new (
47+ Status :: NotFound ,
48+ "The requested bucket does not exist" . to_string ( ) ,
49+ ) ) ,
4250 _ => {
43- warn ! ( "Unexpected error: {:?}" , e) ;
44- Err ( Status :: InternalServerError )
51+ let err_msg = format ! ( "Unexpected error: {:?}" , e) ;
52+ warn ! ( "{}" , err_msg) ;
53+ Err ( HttpErrorJson :: new ( Status :: InternalServerError , err_msg) )
4554 }
4655 } ,
4756 }
@@ -52,7 +61,7 @@ pub fn bucket_new(
5261 bucket_id : String ,
5362 message : Json < Bucket > ,
5463 state : State < ServerState > ,
55- ) -> HttpResponse {
64+ ) -> Result < ( ) , HttpErrorJson > {
5665 let mut bucket = message. into_inner ( ) ;
5766 if bucket. id != bucket_id {
5867 bucket. id = bucket_id;
@@ -63,22 +72,26 @@ pub fn bucket_new(
6372 Ok ( ds) => ds,
6473 Err ( e) => {
6574 warn ! ( "Taking datastore lock failed, returning 504: {}" , e) ;
66- return http_err (
75+ return Err ( HttpErrorJson :: new (
6776 Status :: ServiceUnavailable ,
6877 "Takind datastore lock failed" . to_string ( ) ,
69- ) ;
78+ ) ) ;
7079 }
7180 } ;
7281 let ret = datastore. create_bucket ( & bucket) ;
7382 match ret {
74- Ok ( _) => http_ok ( json ! ( null ) ) ,
83+ Ok ( _) => Ok ( ( ) ) ,
7584 Err ( err) => match err {
76- DatastoreError :: BucketAlreadyExists => {
77- http_err ( Status :: NotModified , "Bucket already exists" . to_string ( ) )
78- }
85+ DatastoreError :: BucketAlreadyExists => Err ( HttpErrorJson :: new (
86+ Status :: NotModified ,
87+ "Bucket already exists" . to_string ( ) ,
88+ ) ) ,
7989 _ => {
8090 warn ! ( "Unexpected error: {:?}" , err) ;
81- http_err ( Status :: InternalServerError , format ! ( "{:?}" , err) )
91+ Err ( HttpErrorJson :: new (
92+ Status :: InternalServerError ,
93+ format ! ( "{:?}" , err) ,
94+ ) )
8295 }
8396 } ,
8497 }
@@ -91,16 +104,17 @@ pub fn bucket_events_get(
91104 end : Option < String > ,
92105 limit : Option < u64 > ,
93106 state : State < ServerState > ,
94- ) -> Result < Json < Vec < Event > > , Status > {
107+ ) -> Result < Json < Vec < Event > > , HttpErrorJson > {
95108 let starttime: Option < DateTime < Utc > > = match start {
96109 Some ( dt_str) => match DateTime :: parse_from_rfc3339 ( & dt_str) {
97110 Ok ( dt) => Some ( dt. with_timezone ( & Utc ) ) ,
98111 Err ( e) => {
99- warn ! (
112+ let err_msg = format ! (
100113 "Failed to parse starttime, datetime needs to be in rfc3339 format: {}" ,
101114 e
102115 ) ;
103- return Err ( Status :: BadRequest ) ;
116+ warn ! ( "{}" , err_msg) ;
117+ return Err ( HttpErrorJson :: new ( Status :: BadRequest , err_msg) ) ;
104118 }
105119 } ,
106120 None => None ,
@@ -109,11 +123,12 @@ pub fn bucket_events_get(
109123 Some ( dt_str) => match DateTime :: parse_from_rfc3339 ( & dt_str) {
110124 Ok ( dt) => Some ( dt. with_timezone ( & Utc ) ) ,
111125 Err ( e) => {
112- warn ! (
126+ let err_msg = format ! (
113127 "Failed to parse endtime, datetime needs to be in rfc3339 format: {}" ,
114128 e
115129 ) ;
116- return Err ( Status :: BadRequest ) ;
130+ warn ! ( "{}" , err_msg) ;
131+ return Err ( HttpErrorJson :: new ( Status :: BadRequest , err_msg) ) ;
117132 }
118133 } ,
119134 None => None ,
@@ -123,10 +138,14 @@ pub fn bucket_events_get(
123138 match res {
124139 Ok ( events) => Ok ( Json ( events) ) ,
125140 Err ( err) => match err {
126- DatastoreError :: NoSuchBucket => Err ( Status :: NotFound ) ,
141+ DatastoreError :: NoSuchBucket => Err ( HttpErrorJson :: new (
142+ Status :: NotFound ,
143+ "The requested bucket does not exist" . to_string ( ) ,
144+ ) ) ,
127145 e => {
128- warn ! ( "Failed to fetch events: {:?}" , e) ;
129- Err ( Status :: InternalServerError )
146+ let err_msg = format ! ( "Failed to fetch events: {:?}" , e) ;
147+ warn ! ( "{}" , err_msg) ;
148+ Err ( HttpErrorJson :: new ( Status :: InternalServerError , err_msg) )
130149 }
131150 } ,
132151 }
@@ -137,16 +156,20 @@ pub fn bucket_events_create(
137156 bucket_id : String ,
138157 events : Json < Vec < Event > > ,
139158 state : State < ServerState > ,
140- ) -> Result < Json < Vec < Event > > , Status > {
159+ ) -> Result < Json < Vec < Event > > , HttpErrorJson > {
141160 let datastore = endpoints_get_lock ! ( state. datastore) ;
142161 let res = datastore. insert_events ( & bucket_id, & events) ;
143162 match res {
144163 Ok ( events) => Ok ( Json ( events) ) ,
145164 Err ( e) => match e {
146- DatastoreError :: NoSuchBucket => Err ( Status :: NotFound ) ,
165+ DatastoreError :: NoSuchBucket => Err ( HttpErrorJson :: new (
166+ Status :: NotFound ,
167+ "The requested bucket does not exist" . to_string ( ) ,
168+ ) ) ,
147169 e => {
148- warn ! ( "Failed to create event(s): {:?}" , e) ;
149- Err ( Status :: InternalServerError )
170+ let err_msg = format ! ( "Failed to create event(s): {:?}" , e) ;
171+ warn ! ( "{}" , err_msg) ;
172+ Err ( HttpErrorJson :: new ( Status :: InternalServerError , err_msg) )
150173 }
151174 } ,
152175 }
@@ -162,16 +185,20 @@ pub fn bucket_events_heartbeat(
162185 heartbeat_json : Json < Event > ,
163186 pulsetime : f64 ,
164187 state : State < ServerState > ,
165- ) -> Result < Json < Event > , Status > {
188+ ) -> Result < Json < Event > , HttpErrorJson > {
166189 let heartbeat = heartbeat_json. into_inner ( ) ;
167190 let datastore = endpoints_get_lock ! ( state. datastore) ;
168191 match datastore. heartbeat ( & bucket_id, heartbeat, pulsetime) {
169192 Ok ( e) => Ok ( Json ( e) ) ,
170193 Err ( err) => match err {
171- DatastoreError :: NoSuchBucket => Err ( Status :: NotFound ) ,
194+ DatastoreError :: NoSuchBucket => Err ( HttpErrorJson :: new (
195+ Status :: NotFound ,
196+ "The requested bucket does not exist" . to_string ( ) ,
197+ ) ) ,
172198 err => {
173- warn ! ( "Heartbeat failed: {:?}" , err) ;
174- Err ( Status :: InternalServerError )
199+ let err_msg = format ! ( "Heartbeat failed: {:?}" , err) ;
200+ warn ! ( "{}" , err_msg) ;
201+ Err ( HttpErrorJson :: new ( Status :: InternalServerError , err_msg) )
175202 }
176203 } ,
177204 }
@@ -181,16 +208,20 @@ pub fn bucket_events_heartbeat(
181208pub fn bucket_event_count (
182209 bucket_id : String ,
183210 state : State < ServerState > ,
184- ) -> Result < Json < u64 > , Status > {
211+ ) -> Result < Json < u64 > , HttpErrorJson > {
185212 let datastore = endpoints_get_lock ! ( state. datastore) ;
186213 let res = datastore. get_event_count ( & bucket_id, None , None ) ;
187214 match res {
188215 Ok ( eventcount) => Ok ( Json ( eventcount as u64 ) ) ,
189216 Err ( e) => match e {
190- DatastoreError :: NoSuchBucket => Err ( Status :: NotFound ) ,
217+ DatastoreError :: NoSuchBucket => Err ( HttpErrorJson :: new (
218+ Status :: NotFound ,
219+ "The requested bucket does not exist" . to_string ( ) ,
220+ ) ) ,
191221 e => {
192- warn ! ( "Failed to count events: {:?}" , e) ;
193- Err ( Status :: InternalServerError )
222+ let err_msg = format ! ( "Failed to count events: {:?}" , e) ;
223+ warn ! ( "{}" , err_msg) ;
224+ Err ( HttpErrorJson :: new ( Status :: InternalServerError , err_msg) )
194225 }
195226 } ,
196227 }
@@ -201,33 +232,46 @@ pub fn bucket_events_delete_by_id(
201232 bucket_id : String ,
202233 event_id : i64 ,
203234 state : State < ServerState > ,
204- ) -> Result < ( ) , Status > {
235+ ) -> Result < ( ) , HttpErrorJson > {
205236 let datastore = endpoints_get_lock ! ( state. datastore) ;
206237 match datastore. delete_events_by_id ( & bucket_id, vec ! [ event_id] ) {
207238 Ok ( _) => Ok ( ( ) ) ,
208239 Err ( err) => match err {
209- DatastoreError :: NoSuchBucket => Err ( Status :: NotFound ) ,
240+ DatastoreError :: NoSuchBucket => Err ( HttpErrorJson :: new (
241+ Status :: NotFound ,
242+ "The requested bucket does not exist" . to_string ( ) ,
243+ ) ) ,
210244 err => {
211- warn ! ( "Delete events by id failed: {:?}" , err) ;
212- Err ( Status :: InternalServerError )
245+ let err_msg = format ! ( "Delete events by id failed: {:?}" , err) ;
246+ warn ! ( "{}" , err_msg) ;
247+ Err ( HttpErrorJson :: new ( Status :: InternalServerError , err_msg) )
213248 }
214249 } ,
215250 }
216251}
217252
218253#[ get( "/<bucket_id>/export" ) ]
219- pub fn bucket_export ( bucket_id : String , state : State < ServerState > ) -> Result < Response , Status > {
254+ pub fn bucket_export (
255+ bucket_id : String ,
256+ state : State < ServerState > ,
257+ ) -> Result < Response , HttpErrorJson > {
220258 let datastore = endpoints_get_lock ! ( state. datastore) ;
221259 let mut export = BucketsExport {
222260 buckets : HashMap :: new ( ) ,
223261 } ;
224262 let mut bucket = match datastore. get_bucket ( & bucket_id) {
225263 Ok ( bucket) => bucket,
226264 Err ( err) => match err {
227- DatastoreError :: NoSuchBucket => return Err ( Status :: NotFound ) ,
265+ DatastoreError :: NoSuchBucket => {
266+ return Err ( HttpErrorJson :: new (
267+ Status :: NotFound ,
268+ "The requested bucket does not exist" . to_string ( ) ,
269+ ) )
270+ }
228271 e => {
229- warn ! ( "Failed to fetch events: {:?}" , e) ;
230- return Err ( Status :: InternalServerError ) ;
272+ let err_msg = format ! ( "Failed to fetch events: {:?}" , e) ;
273+ warn ! ( "{}" , err_msg) ;
274+ return Err ( HttpErrorJson :: new ( Status :: InternalServerError , err_msg) ) ;
231275 }
232276 } ,
233277 } ;
@@ -250,15 +294,19 @@ pub fn bucket_export(bucket_id: String, state: State<ServerState>) -> Result<Res
250294}
251295
252296#[ delete( "/<bucket_id>" ) ]
253- pub fn bucket_delete ( bucket_id : String , state : State < ServerState > ) -> Result < ( ) , Status > {
297+ pub fn bucket_delete ( bucket_id : String , state : State < ServerState > ) -> Result < ( ) , HttpErrorJson > {
254298 let datastore = endpoints_get_lock ! ( state. datastore) ;
255299 match datastore. delete_bucket ( & bucket_id) {
256300 Ok ( _) => Ok ( ( ) ) ,
257301 Err ( e) => match e {
258- DatastoreError :: NoSuchBucket => Err ( Status :: NotFound ) ,
302+ DatastoreError :: NoSuchBucket => Err ( HttpErrorJson :: new (
303+ Status :: NotFound ,
304+ "The requested bucket does not exist" . to_string ( ) ,
305+ ) ) ,
259306 e => {
260- warn ! ( "Failed to delete bucket: {:?}" , e) ;
261- Err ( Status :: InternalServerError )
307+ let err_msg = format ! ( "Failed to delete bucket: {:?}" , e) ;
308+ warn ! ( "{}" , err_msg) ;
309+ Err ( HttpErrorJson :: new ( Status :: InternalServerError , err_msg) )
262310 }
263311 } ,
264312 }
0 commit comments