use std::str::FromStr; use time::OffsetDateTime; use url::Url; use crate::{OauthProviderName, Secd, SecdError}; impl OauthProviderName { fn base_url(&self) -> Url { match self { OauthProviderName::Google => { Url::from_str("https://accounts.google.com/o/oauth2/v2/auth").unwrap() } OauthProviderName::Microsoft => { Url::from_str("https://login.microsoftonline.com/common/oauth2/v2.0/authorize") .unwrap() } _ => unimplemented!(), } } fn default_scope(&self) -> String { match self { OauthProviderName::Google => "openid%20email".into(), OauthProviderName::Microsoft => "openid%20email".into(), _ => unimplemented!(), } } } impl Secd { pub async fn create_oauth_provider( &self, provider: &OauthProviderName, client_id: String, client_secret: String, redirect_url: Url, ) -> Result<(), SecdError> { self.store .write_oauth_provider(&crate::OauthProvider { name: provider.clone(), flow: Some("default".into()), base_url: provider.base_url(), response: crate::OauthResponseType::Code, default_scope: provider.default_scope(), client_id, client_secret, redirect_url, created_at: OffsetDateTime::now_utc(), deleted_at: None, }) .await .map_err(|_| SecdError::Todo)?; Ok(()) } }