crates_docs/server/auth/
token.rs1#[derive(Default)]
5pub struct TokenStore {
6 tokens: std::sync::RwLock<std::collections::HashMap<String, TokenInfo>>,
7}
8
9#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
11pub struct TokenInfo {
12 pub access_token: String,
14 pub refresh_token: Option<String>,
16 pub expires_at: chrono::DateTime<chrono::Utc>,
18 pub scopes: Vec<String>,
20 pub user_id: Option<String>,
22 pub user_email: Option<String>,
24}
25
26impl TokenStore {
27 #[must_use]
29 pub fn new() -> Self {
30 Self::default()
31 }
32
33 pub fn store_token(&self, key: String, token: TokenInfo) {
35 let mut tokens = self.tokens.write().expect("Token store RwLock poisoned");
36 tokens.insert(key, token);
37 }
38
39 pub fn get_token(&self, key: &str) -> Option<TokenInfo> {
41 let tokens = self.tokens.read().expect("Token store RwLock poisoned");
42 tokens.get(key).cloned()
43 }
44
45 pub fn remove_token(&self, key: &str) {
47 let mut tokens = self.tokens.write().expect("Token store RwLock poisoned");
48 tokens.remove(key);
49 }
50
51 pub fn cleanup_expired(&self) {
53 let now = chrono::Utc::now();
54 let mut tokens = self.tokens.write().expect("Token store RwLock poisoned");
55 tokens.retain(|_, token| token.expires_at > now);
56 }
57}