pgml_dashboard/
guards.rs

1use rocket::http::{CookieJar, Status};
2use rocket::request::{FromRequest, Outcome, Request};
3use rocket::State;
4use sqlx::PgPool;
5
6use std::env::var;
7
8use crate::Clusters;
9
10#[derive(Debug)]
11pub struct Cluster {
12    pool: PgPool,
13}
14
15impl<'a> Cluster {
16    pub fn pool(&'a self) -> &'a PgPool {
17        &self.pool
18    }
19}
20
21#[rocket::async_trait]
22impl<'r> FromRequest<'r> for Cluster {
23    type Error = ();
24
25    async fn from_request(request: &'r Request<'_>) -> Outcome<Cluster, ()> {
26        // Using `State` as a request guard. Use `inner()` to get an `'r`.
27        let cookies = match request.guard::<&CookieJar<'r>>().await {
28            Outcome::Success(cookies) => cookies,
29            _ => return Outcome::Forward(()),
30        };
31
32        let cluster_id = match cookies.get_private("cluster_id") {
33            Some(cluster_id) => match cluster_id.value().parse::<i64>() {
34                Ok(cluster_id) => cluster_id,
35                Err(_) => -1,
36            },
37
38            None => -1,
39        };
40
41        let pools = match request.guard::<&State<Clusters>>().await {
42            Outcome::Success(pool) => pool,
43            _ => return Outcome::Forward(()),
44        };
45
46        let pool = match pools.get(cluster_id) {
47            Some(pool) => pool,
48            None => return Outcome::Failure((Status::BadRequest, ())),
49        };
50
51        Outcome::Success(Cluster { pool })
52    }
53}
54
55pub fn default_database_url() -> String {
56    match var("DATABASE_URL") {
57        Ok(val) => val,
58        Err(_) => "postgres:///dashboard".to_string(),
59    }
60}