use std::time::{SystemTime, UNIX_EPOCH};
use serde::{Deserialize, Serialize};
use tracing::debug;
use crate::core::error::Result;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TokenStorage {
pub access_token: String,
pub refresh_token: Option<String>,
pub expires_at: u64, pub token_type: String,
pub scope: String,
}
impl TokenStorage {
pub fn is_expired(&self) -> bool {
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
now + 60 >= self.expires_at
}
pub fn remaining_secs(&self) -> u64 {
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
self.expires_at.saturating_sub(now)
}
}
impl super::GoogleAuth {
pub(crate) async fn save_token(&self, storage: &TokenStorage) -> Result<()> {
self.store.save(storage).await?;
debug!("Token persisted via {} store", self.store.backend());
Ok(())
}
}