code_mesh_core/auth/
manager.rs1use super::{Auth, AuthCredentials, AuthStorage, FileAuthStorage};
4use crate::Result;
5use std::collections::HashMap;
6use std::sync::Arc;
7use tokio::sync::RwLock;
8
9pub struct AuthManager {
11 storage: Box<dyn AuthStorage>,
12 providers: Arc<RwLock<HashMap<String, Box<dyn Auth>>>>,
13}
14
15impl AuthManager {
16 pub async fn new() -> Result<Self> {
18 let storage = FileAuthStorage::default_with_result()?;
19 Ok(Self {
20 storage: Box::new(storage),
21 providers: Arc::new(RwLock::new(HashMap::new())),
22 })
23 }
24
25 pub fn with_storage(storage: Box<dyn AuthStorage>) -> Self {
27 Self {
28 storage,
29 providers: Arc::new(RwLock::new(HashMap::new())),
30 }
31 }
32
33 pub async fn register_provider(&self, auth: Box<dyn Auth>) {
35 let mut providers = self.providers.write().await;
36 providers.insert(auth.provider_id().to_string(), auth);
37 }
38
39 pub async fn get_credentials(&self, provider_id: &str) -> Result<Option<AuthCredentials>> {
41 let providers = self.providers.read().await;
43 if let Some(provider) = providers.get(provider_id) {
44 if provider.has_credentials().await {
45 return Ok(Some(provider.get_credentials().await?));
46 }
47 }
48
49 self.storage.get(provider_id).await
51 }
52
53 pub async fn set_credentials(&self, provider_id: &str, credentials: AuthCredentials) -> Result<()> {
55 let providers = self.providers.read().await;
57 if let Some(provider) = providers.get(provider_id) {
58 provider.set_credentials(credentials.clone()).await?;
59 }
60
61 self.storage.set(provider_id, credentials).await
63 }
64
65 pub async fn remove_credentials(&self, provider_id: &str) -> Result<()> {
67 let providers = self.providers.read().await;
69 if let Some(provider) = providers.get(provider_id) {
70 provider.remove_credentials().await?;
71 }
72
73 self.storage.remove(provider_id).await
75 }
76
77 pub async fn list_credentials(&self) -> Result<Vec<String>> {
79 self.storage.list().await
80 }
81
82 pub async fn has_credentials(&self, provider_id: &str) -> bool {
84 let providers = self.providers.read().await;
86 if let Some(provider) = providers.get(provider_id) {
87 if provider.has_credentials().await {
88 return true;
89 }
90 }
91
92 self.storage.get(provider_id).await.unwrap_or(None).is_some()
94 }
95}