1
+ use std:: collections:: HashMap ;
1
2
use std:: env:: var;
2
3
3
- use rocket:: http:: CookieJar ;
4
- use rocket:: request:: { FromRequest , Outcome , Request } ;
5
- use rocket:: State ;
6
- use sqlx:: PgPool ;
4
+ use rocket:: request:: { self , FromRequest , Request } ;
5
+ use sqlx:: { postgres:: PgPoolOptions , Executor , PgPool } ;
7
6
8
- use crate :: models:: User ;
9
- use crate :: { Clusters , Context } ;
7
+ use crate :: models;
8
+ use crate :: { ClustersSettings , Context } ;
10
9
11
10
pub fn default_database_url ( ) -> String {
12
11
match var ( "DATABASE_URL" ) {
@@ -17,63 +16,58 @@ pub fn default_database_url() -> String {
17
16
18
17
#[ derive( Debug ) ]
19
18
pub struct Cluster {
20
- pool : Option < PgPool > ,
19
+ pub pool : Option < PgPool > ,
21
20
pub context : Context ,
22
21
}
23
22
24
- impl < ' a > Cluster {
25
- pub fn pool ( & ' a self ) -> & ' a PgPool {
26
- self . pool . as_ref ( ) . unwrap ( )
27
- }
28
- }
29
-
30
- #[ rocket:: async_trait]
31
- impl < ' r > FromRequest < ' r > for Cluster {
32
- type Error = ( ) ;
23
+ impl Default for Cluster {
24
+ fn default ( ) -> Self {
25
+ let max_connections = 5 ;
26
+ let min_connections = 1 ;
27
+ let idle_timeout = 15_000 ;
33
28
34
- async fn from_request ( request : & ' r Request < ' _ > ) -> Outcome < Cluster , ( ) > {
35
- // Using `State` as a request guard. Use `inner()` to get an `'r`.
36
- let cookies = match request. guard :: < & CookieJar < ' r > > ( ) . await {
37
- Outcome :: Success ( cookies) => cookies,
38
- _ => return Outcome :: Forward ( ( ) ) ,
29
+ let settings = ClustersSettings {
30
+ max_connections,
31
+ idle_timeout,
32
+ min_connections,
39
33
} ;
40
34
41
- let cluster_id = match cookies. get_private ( "cluster_id" ) {
42
- Some ( cluster_id) => match cluster_id. value ( ) . parse :: < i64 > ( ) {
43
- Ok ( cluster_id) => cluster_id,
44
- Err ( _) => -1 ,
35
+ Cluster {
36
+ pool : Some (
37
+ PgPoolOptions :: new ( )
38
+ . max_connections ( settings. max_connections )
39
+ . idle_timeout ( std:: time:: Duration :: from_millis ( settings. idle_timeout ) )
40
+ . min_connections ( settings. min_connections )
41
+ . after_connect ( |conn, _meta| {
42
+ Box :: pin ( async move {
43
+ conn. execute ( "SET application_name = 'pgml_dashboard';" )
44
+ . await ?;
45
+ Ok ( ( ) )
46
+ } )
47
+ } )
48
+ . connect_lazy ( & default_database_url ( ) )
49
+ . expect ( "Default database URL is alformed" ) ,
50
+ ) ,
51
+ context : Context {
52
+ user : models:: User :: default ( ) ,
53
+ cluster : models:: Cluster :: default ( ) ,
54
+ visible_clusters : HashMap :: default ( ) ,
45
55
} ,
56
+ }
57
+ }
58
+ }
46
59
47
- None => -1 ,
48
- } ;
49
-
50
- let user_id: i64 = match cookies. get_private ( "user_id" ) {
51
- Some ( user_id) => match user_id. value ( ) . parse :: < i64 > ( ) {
52
- Ok ( user_id) => user_id,
53
- Err ( _) => -1 ,
54
- } ,
55
-
56
- None => -1 ,
57
- } ;
58
-
59
- let clusters_shared_state = match request. guard :: < & State < Clusters > > ( ) . await {
60
- Outcome :: Success ( pool) => pool,
61
- _ => return Outcome :: Forward ( ( ) ) ,
62
- } ;
63
-
64
- let pool = clusters_shared_state. get ( cluster_id) ;
60
+ #[ rocket:: async_trait]
61
+ impl < ' r > FromRequest < ' r > for & ' r Cluster {
62
+ type Error = ( ) ;
65
63
66
- let context = Context {
67
- user : User {
68
- id : user_id,
69
- email : "" . to_string ( ) ,
70
- } ,
71
- cluster : clusters_shared_state. get_context ( cluster_id) . cluster ,
72
- visible_clusters : clusters_shared_state
73
- . get_context ( cluster_id)
74
- . visible_clusters ,
75
- } ;
64
+ async fn from_request ( request : & ' r Request < ' _ > ) -> request:: Outcome < Self , Self :: Error > {
65
+ request:: Outcome :: Success ( request. local_cache ( || Cluster :: default ( ) ) )
66
+ }
67
+ }
76
68
77
- Outcome :: Success ( Cluster { pool, context } )
69
+ impl < ' a > Cluster {
70
+ pub fn pool ( & ' a self ) -> & ' a PgPool {
71
+ self . pool . as_ref ( ) . unwrap ( )
78
72
}
79
73
}
0 commit comments