From 19c25138f88acf19c9a959a58de4f58e54026ebc Mon Sep 17 00:00:00 2001 From: rtkay123 Date: Sat, 4 Apr 2026 10:51:18 +0200 Subject: feat: connect to db --- crates/api-auth/src/lib.rs | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 crates/api-auth/src/lib.rs (limited to 'crates/api-auth/src/lib.rs') diff --git a/crates/api-auth/src/lib.rs b/crates/api-auth/src/lib.rs new file mode 100644 index 0000000..284b772 --- /dev/null +++ b/crates/api-auth/src/lib.rs @@ -0,0 +1,69 @@ +#[cfg(feature = "discord")] +pub mod discord; + +mod error; +use api_core::auth::AuthClientConfig; +use api_core::auth::provider::OauthProvider; +use api_core::models::user::User; +pub use error::AuthClientError; + +use oauth2::{EndpointNotSet, EndpointSet}; + +type C = oauth2::basic::BasicClient< + EndpointSet, + EndpointNotSet, + EndpointNotSet, + EndpointNotSet, + EndpointSet, +>; + +#[derive(Clone, Debug)] +pub struct BasicClient(C); + +#[async_trait::async_trait] +pub trait OauthDriver: Send + Sync + std::fmt::Debug { + async fn get_auth_token(&self) -> Result; + async fn get_user(&self) -> Result; + async fn create_session(&self, user: &User); +} + +use oauth2::{AuthUrl, ClientId, ClientSecret, RedirectUrl, TokenUrl}; +use sqlx::PgPool; +use std::collections::HashMap; +use std::sync::Arc; +use std::{convert::TryFrom, ops::Deref}; + +use crate::error::AuthError; + +pub struct OauthService { + clients: HashMap>, +} + +impl Deref for BasicClient { + type Target = C; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl TryFrom for BasicClient { + type Error = AuthClientError; + + fn try_from(value: AuthClientConfig) -> Result { + let auth_url = AuthUrl::new(value.auth_url).map_err(AuthClientError::InvalidAuthUrl)?; + + let token_url = TokenUrl::new(value.token_uri).map_err(AuthClientError::InvalidTokenUrl)?; + + let redirect_url = + RedirectUrl::new(value.redirect_uri).map_err(AuthClientError::InvalidRedirectUrl)?; + + Ok(Self( + oauth2::basic::BasicClient::new(ClientId::new(value.client_id)) + .set_client_secret(ClientSecret::new(value.client_secret)) + .set_auth_uri(auth_url) + .set_token_uri(token_url) + .set_redirect_uri(redirect_url), + )) + } +} -- cgit v1.2.3