aboutsummaryrefslogtreecommitdiffstats
path: root/src/server/state/mod.rs
blob: c86052d8bcb0a398a44641025288712bec1c795b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
pub mod database;
pub mod federation;

use std::sync::Arc;

#[cfg(feature = "oauth-discord")]
use url::Url;

use crate::{config::Config, server::driver::SellershutDriver};
#[cfg(feature = "oauth-discord")]
use crate::{config::DiscordOauth, server::driver::auth::OauthClient};

#[derive(Clone)]
pub struct AppState {
    pub driver: Arc<dyn SellershutDriver>,
    #[cfg(feature = "oauth-discord")]
    pub oauth_discord: OauthClient,
}

impl AppState {
    pub async fn new(config: &Config, driver: impl SellershutDriver) -> anyhow::Result<Self> {
        dbg!(&config);
        Ok(Self {
            driver: Arc::new(driver),
            #[cfg(feature = "oauth-discord")]
            oauth_discord: discord_client(&config.oauth.discord, &config.oauth.oauth_redirect_url)?,
        })
    }
}

#[cfg(feature = "oauth-discord")]
fn discord_client(disc: &DiscordOauth, redirect: &Url) -> anyhow::Result<OauthClient> {
    use crate::server::driver::{self, auth::ClientOptions};
    dbg!(&disc);

    let discord_opts = ClientOptions::builder()
        .client_id(disc.client_id.to_owned())
        .redirect_url(redirect.to_string())
        .auth_url(disc.auth_url.to_string())
        .client_secret(disc.client_secret.clone())
        .token_url(disc.token_url.to_string())
        .build();

    Ok(driver::auth::oauth_client(&discord_opts)?)
}