use activitypub_federation::config::Data; use serde::Deserialize; #[cfg(feature = "oauth-discord")] pub mod discord; #[derive(Deserialize, Debug, Clone, Copy, ToSchema)] #[serde(rename_all = "lowercase")] pub enum OauthProvider { /// Discord #[cfg(feature = "oauth-discord")] Discord, } #[derive(Deserialize, Debug, Clone, Copy, IntoParams)] #[into_params(parameter_in = Query)] pub struct Params { /// Set OAuth provider name provider: OauthProvider, } use axum::{extract::Query, response::IntoResponse}; use utoipa::{IntoParams, OpenApi, ToSchema}; use crate::server::{error::AppError, state::AppState}; pub const AUTH: &str = "AUTH"; #[derive(OpenApi)] #[openapi( tags( (name = AUTH, description = "OAuth integration") ), components( schemas(OauthProvider) ) )] pub struct OAuthDoc; #[utoipa::path( method(get), path = "/auth", params( Params ), tag = AUTH, responses( (status = OK, description = "Routes to oauth provider for login", body = str, content_type = "text/plain") ) )] #[axum::debug_handler] #[cfg(feature = "oauth")] pub async fn auth( Query(params): Query, data: Data, ) -> Result { match params.provider { #[cfg(feature = "oauth-discord")] OauthProvider::Discord => discord::discord_auth(data), }.await }