@@ -8,7 +8,7 @@ use adapter::client::Locked;
8
8
use hyper:: { Body , Request , Response } ;
9
9
use primitives:: analytics:: {
10
10
query:: { AllowedKey , ALLOWED_KEYS } ,
11
- AnalyticsQuery , AuthenticateAs , ANALYTICS_QUERY_LIMIT ,
11
+ AnalyticsQuery , AuthenticateAs ,
12
12
} ;
13
13
14
14
/// `GET /v5/analytics` request
@@ -21,7 +21,7 @@ pub async fn analytics<C: Locked + 'static>(
21
21
) -> Result < Response < Body > , ResponseError > {
22
22
let query = serde_urlencoded:: from_str :: < AnalyticsQuery > ( req. uri ( ) . query ( ) . unwrap_or ( "" ) ) ?;
23
23
24
- let applied_limit = query. limit . min ( ANALYTICS_QUERY_LIMIT ) ;
24
+ let applied_limit = query. limit . min ( app . config . analytics_find_limit ) ;
25
25
26
26
let route_allowed_keys: HashSet < AllowedKey > =
27
27
request_allowed. unwrap_or_else ( || ALLOWED_KEYS . clone ( ) ) ;
@@ -54,14 +54,30 @@ pub async fn analytics<C: Locked + 'static>(
54
54
) ) ) ;
55
55
}
56
56
57
- let analytics = get_analytics (
58
- & app. pool ,
59
- query. clone ( ) ,
60
- route_allowed_keys,
61
- authenticate_as,
62
- applied_limit,
57
+ let analytics_maxtime = std:: time:: Duration :: from_millis ( app. config . analytics_maxtime . into ( ) ) ;
58
+
59
+ let analytics = match tokio:: time:: timeout (
60
+ analytics_maxtime,
61
+ get_analytics (
62
+ & app. pool ,
63
+ query. clone ( ) ,
64
+ route_allowed_keys,
65
+ authenticate_as,
66
+ applied_limit,
67
+ ) ,
63
68
)
64
- . await ?;
69
+ . await
70
+ {
71
+ Ok ( Ok ( analytics) ) => analytics,
72
+ // Error getting the analytics
73
+ Ok ( Err ( err) ) => return Err ( err. into ( ) ) ,
74
+ // Timeout error
75
+ Err ( _elapsed) => {
76
+ return Err ( ResponseError :: BadRequest (
77
+ "Timeout when fetching analytics data" . into ( ) ,
78
+ ) )
79
+ }
80
+ } ;
65
81
66
82
Ok ( success_response ( serde_json:: to_string ( & analytics) ?) )
67
83
}
0 commit comments