use oauth2::{basic::BasicClient, AuthUrl, ClientId, ClientSecret, RedirectUrl, TokenUrl}; use serde::{Deserialize, Serialize}; use crate::config::get_app_config; /// Gitea OAuth configuration #[derive(Clone, Debug)] pub struct GiteaOAuthConfig { /// OAuth client pub client: BasicClient, /// Gitea instance URL pub instance_url: String, } impl GiteaOAuthConfig { /// Creates a new Gitea OAuth configuration pub fn new() -> Self { // Get configuration from centralized ConfigurationBuilder let config = get_app_config(); let client_id = config.gitea_client_id() .expect("Missing GITEA_CLIENT_ID environment variable").to_string(); let client_secret = config.gitea_client_secret() .expect("Missing GITEA_CLIENT_SECRET environment variable").to_string(); let instance_url = config.gitea_instance_url() .expect("Missing GITEA_INSTANCE_URL environment variable").to_string(); // Create OAuth client let auth_url = format!("{}/login/oauth/authorize", instance_url); let token_url = format!("{}/login/oauth/access_token", instance_url); let client = BasicClient::new( ClientId::new(client_id), Some(ClientSecret::new(client_secret)), AuthUrl::new(auth_url).unwrap(), Some(TokenUrl::new(token_url).unwrap()), ) .set_redirect_uri( RedirectUrl::new(format!( "{}/auth/gitea/callback", config.app_url() )) .unwrap(), ); Self { client, instance_url, } } } /// Gitea user information structure #[derive(Debug, Deserialize, Serialize)] pub struct GiteaUser { /// User ID pub id: i64, /// Username pub login: String, /// Full name pub full_name: String, /// Email address pub email: String, /// Avatar URL pub avatar_url: String, }