Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit af0058e

Browse filesBrowse files
authored
Local state (#728)
1 parent e4f3097 commit af0058e
Copy full SHA for af0058e

File tree

7 files changed

+97
-203
lines changed
Filter options

7 files changed

+97
-203
lines changed

‎pgml-dashboard/src/api/docs.rs

Copy file name to clipboardExpand all lines: pgml-dashboard/src/api/docs.rs
+4-4Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ async fn search(query: &str, index: &State<markdown::SearchIndex>) -> ResponseOk
2525
}
2626

2727
#[get("/docs/<path..>", rank = 10)]
28-
async fn doc_handler<'a>(path: PathBuf, cluster: Cluster) -> Result<ResponseOk, Status> {
28+
async fn doc_handler<'a>(path: PathBuf, cluster: &Cluster) -> Result<ResponseOk, Status> {
2929
let guides = vec![
3030
NavLink::new("Setup").children(vec![
3131
NavLink::new("Installation").children(vec![
@@ -75,7 +75,7 @@ async fn doc_handler<'a>(path: PathBuf, cluster: Cluster) -> Result<ResponseOk,
7575
}
7676

7777
#[get("/blog/<path..>", rank = 10)]
78-
async fn blog_handler<'a>(path: PathBuf, cluster: Cluster) -> Result<ResponseOk, Status> {
78+
async fn blog_handler<'a>(path: PathBuf, cluster: &Cluster) -> Result<ResponseOk, Status> {
7979
render(
8080
cluster,
8181
&path,
@@ -123,7 +123,7 @@ async fn blog_handler<'a>(path: PathBuf, cluster: Cluster) -> Result<ResponseOk,
123123
}
124124

125125
async fn render<'a>(
126-
cluster: Cluster,
126+
cluster: &Cluster,
127127
path: &'a PathBuf,
128128
mut nav_links: Vec<NavLink>,
129129
nav_title: &'a str,
@@ -201,7 +201,7 @@ async fn render<'a>(
201201
let user = if cluster.context.user.is_anonymous() {
202202
None
203203
} else {
204-
Some(cluster.context.user)
204+
Some(cluster.context.user.clone())
205205
};
206206

207207
let mut layout = crate::templates::Layout::new(&title);

‎pgml-dashboard/src/guards.rs

Copy file name to clipboard
+48-54Lines changed: 48 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1+
use std::collections::HashMap;
12
use std::env::var;
23

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};
76

8-
use crate::models::User;
9-
use crate::{Clusters, Context};
7+
use crate::models;
8+
use crate::{ClustersSettings, Context};
109

1110
pub fn default_database_url() -> String {
1211
match var("DATABASE_URL") {
@@ -17,63 +16,58 @@ pub fn default_database_url() -> String {
1716

1817
#[derive(Debug)]
1918
pub struct Cluster {
20-
pool: Option<PgPool>,
19+
pub pool: Option<PgPool>,
2120
pub context: Context,
2221
}
2322

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;
3328

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,
3933
};
4034

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(),
4555
},
56+
}
57+
}
58+
}
4659

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 = ();
6563

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+
}
7668

77-
Outcome::Success(Cluster { pool, context })
69+
impl<'a> Cluster {
70+
pub fn pool(&'a self) -> &'a PgPool {
71+
self.pool.as_ref().unwrap()
7872
}
7973
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.