aboutsummaryrefslogtreecommitdiffstats
path: root/crates/api-auth/src/lib.rs
diff options
context:
space:
mode:
authorrtkay123 <dev@kanjala.com>2026-04-04 10:51:18 +0200
committerrtkay123 <dev@kanjala.com>2026-04-04 10:51:18 +0200
commit19c25138f88acf19c9a959a58de4f58e54026ebc (patch)
treebd854f20c539770a92fb451503b4c6d132c110a6 /crates/api-auth/src/lib.rs
parent41d90f42c37df06dabfd717d19f3dc72b5ba2d11 (diff)
downloadsellershut-19c25138f88acf19c9a959a58de4f58e54026ebc.tar.bz2
sellershut-19c25138f88acf19c9a959a58de4f58e54026ebc.zip
feat: connect to db
Diffstat (limited to 'crates/api-auth/src/lib.rs')
-rw-r--r--crates/api-auth/src/lib.rs69
1 files changed, 69 insertions, 0 deletions
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<String, AuthError>;
+ async fn get_user(&self) -> Result<User, AuthError>;
+ 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<OauthProvider, Arc<dyn OauthDriver>>,
+}
+
+impl Deref for BasicClient {
+ type Target = C;
+
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+
+impl TryFrom<AuthClientConfig> for BasicClient {
+ type Error = AuthClientError;
+
+ fn try_from(value: AuthClientConfig) -> Result<Self, Self::Error> {
+ 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),
+ ))
+ }
+}