use chrono::{Local, NaiveDateTime, TimeDelta, Utc};
use serde::{Deserialize, Serialize};
use crate::response::SuccessTokenResponse;
pub(crate) const LOCAL_STORAGE_KEY: &str = "auth";
pub(crate) const CODE_VERIFIER_KEY: &str = "code_verifier";
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub struct TokenStorage {
pub id_token: String,
pub access_token: String,
pub expires_in: NaiveDateTime,
pub refresh_token: String,
pub refresh_expires_in: Option<NaiveDateTime>,
}
impl TokenStorage {
#[must_use]
pub fn is_valid(&self) -> bool {
self.expires_in >= Local::now().naive_utc()
}
#[must_use]
pub fn is_refresh_token_maybe_valid(&self) -> bool {
self.refresh_expires_in
.is_none_or(|exp| exp >= Local::now().naive_utc())
}
}
impl From<SuccessTokenResponse> for TokenStorage {
fn from(value: SuccessTokenResponse) -> Self {
Self {
id_token: value.id_token,
access_token: value.access_token,
expires_in: Utc::now().naive_utc()
+ TimeDelta::try_seconds(value.expires_in).unwrap_or_default(),
refresh_token: value.refresh_token,
refresh_expires_in: value.refresh_expires_in.map(|refresh_expires_in| {
Utc::now().naive_utc()
+ TimeDelta::try_seconds(refresh_expires_in).unwrap_or_default()
}),
}
}
}