aboutsummaryrefslogtreecommitdiffstats
path: root/src/server/state/mod.rs
blob: 0726689988f40dfb8909014fd79f014d0be0bf00 (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
pub mod database;

use sellershut_auth::{ClientOptions, OauthClient};
use sqlx::PgPool;
#[cfg(feature = "oauth-discord")]
use url::Url;

use crate::config::Config;
#[cfg(feature = "oauth-discord")]
use crate::config::DiscordOauth;

pub struct AppState {
    database: PgPool,
    #[cfg(feature = "oauth-discord")]
    oauth_discord: OauthClient,
}

impl AppState {
    pub async fn new(config: &Config) -> anyhow::Result<Self> {
        let database = database::connect(&config.database).await?;

        Ok(Self {
            database,
            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> {
    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(sellershut_auth::oauth_client(&discord_opts)?)
}