use crate::models::AppState;
use std::time::{SystemTime, UNIX_EPOCH};
use axum::{
async_trait,
extract::{FromRequestParts, OriginalUri},
http::request::Parts,
response::{IntoResponse, Redirect},
};
use axum_extra::extract::{cookie::Cookie, CookieJar};
use gotrue::grant::{Grant, RefreshTokenGrant};
use gotrue_entity::dto::GotrueTokenResponse;
use jwt::{Claims, Header};
use redis::{aio::ConnectionManager, AsyncCommands, FromRedisValue, ToRedisArgs};
use serde::{de::DeserializeOwned, Deserialize, Serialize};
static SESSION_EXPIRATION: usize = 60 * 60 * 24; // 1 day
#[derive(Clone)]
pub struct SessionStorage {
redis_client: ConnectionManager,
}
fn session_id_key(session_id: &str) -> String {
format!("web::session::{}", session_id)
}
fn code_session_key(code: &str) -> String {
format!("web::session::code::{}", code)
}
impl SessionStorage {
pub fn new(redis_client: ConnectionManager) -> Self {
Self { redis_client }
}
pub async fn get_user_session(
&self,
session_id: &str,
) -> Result