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