diff options
| author | rtkay123 <dev@kanjala.com> | 2026-04-04 10:51:18 +0200 |
|---|---|---|
| committer | rtkay123 <dev@kanjala.com> | 2026-04-04 10:51:18 +0200 |
| commit | 19c25138f88acf19c9a959a58de4f58e54026ebc (patch) | |
| tree | bd854f20c539770a92fb451503b4c6d132c110a6 /crates/api-auth/src | |
| parent | 41d90f42c37df06dabfd717d19f3dc72b5ba2d11 (diff) | |
| download | sellershut-19c25138f88acf19c9a959a58de4f58e54026ebc.tar.bz2 sellershut-19c25138f88acf19c9a959a58de4f58e54026ebc.zip | |
feat: connect to db
Diffstat (limited to 'crates/api-auth/src')
| -rw-r--r-- | crates/api-auth/src/discord/mod.rs | 30 | ||||
| -rw-r--r-- | crates/api-auth/src/error.rs | 25 | ||||
| -rw-r--r-- | crates/api-auth/src/lib.rs | 69 |
3 files changed, 124 insertions, 0 deletions
diff --git a/crates/api-auth/src/discord/mod.rs b/crates/api-auth/src/discord/mod.rs new file mode 100644 index 0000000..a39722d --- /dev/null +++ b/crates/api-auth/src/discord/mod.rs @@ -0,0 +1,30 @@ +use api_core::models::user::User; +use async_trait::async_trait; +use sqlx::PgPool; + +use crate::{BasicClient, OauthDriver, error::AuthError}; + +#[derive(Clone, Debug)] +pub struct AuthServiceDiscord { + database: PgPool, + client: BasicClient, +} + +impl AuthServiceDiscord { + pub fn new(database: PgPool, client: BasicClient) -> Self { + Self { database, client } + } +} + +#[async_trait] +impl OauthDriver for AuthServiceDiscord { + async fn get_auth_token(&self) -> Result<String, AuthError> { + todo!() + } + async fn get_user(&self) -> Result<User, AuthError> { + todo!() + } + async fn create_session(&self, _user: &User) { + todo!() + } +} diff --git a/crates/api-auth/src/error.rs b/crates/api-auth/src/error.rs new file mode 100644 index 0000000..ec60e51 --- /dev/null +++ b/crates/api-auth/src/error.rs @@ -0,0 +1,25 @@ +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum AuthClientError { + #[error("missing field: {0}")] + MissingField(&'static str), + #[error("invalid auth url: {0}")] + InvalidAuthUrl(#[from] oauth2::url::ParseError), + #[error("invalid token url: {0}")] + InvalidTokenUrl(#[source] oauth2::url::ParseError), + #[error("invalid redirect url: {0}")] + InvalidRedirectUrl(#[source] oauth2::url::ParseError), +} + +#[derive(Debug, Error)] +pub enum AuthError { + #[error("missing field: {0}")] + MissingField(&'static str), + #[error("invalid auth url: {0}")] + InvalidAuthUrl(#[from] oauth2::url::ParseError), + #[error("invalid token url: {0}")] + InvalidTokenUrl(#[source] oauth2::url::ParseError), + #[error("invalid redirect url: {0}")] + InvalidRedirectUrl(#[source] oauth2::url::ParseError), +} 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), + )) + } +} |
