use crate::{http::request::Request, settings};
use kalgan_cache::{redis::ToRedisArgs, Cache};
use std::collections::HashMap;
use uuid::Uuid;
pub struct Session {
cache: Cache,
cookies: HashMap<String, String>,
}
impl Session {
pub fn new(request: &Request) -> Session {
Session {
cache: Cache::new(settings::get_string("cache.server").unwrap()),
cookies: request.get_cookies().clone(),
}
}
pub fn create<V: ToRedisArgs>(&mut self, value: V) -> String {
let uuid = Uuid::new_v4();
self.cache.insert(&uuid.to_string(), value);
uuid.to_string()
}
pub fn destroy(&mut self, session: &str) {
let key = self.get_key(session);
self.cache.delete(&key);
}
pub fn exists(&mut self, session: &str) -> bool {
self.cookies.contains_key(&self.get_cookie_key(session)) && {
let key = self.get_key(session);
self.cache.exists(&key)
}
}
pub fn update<V: ToRedisArgs>(&mut self, session: &str, value: V) {
let key = self.get_key(session);
self.cache.insert(&key, value)
}
pub fn get(&mut self, session: &str) -> String {
let key = self.get_key(session);
match self.cache.get(&key) {
Some(value) => value,
None => "".to_string(),
}
}
fn get_key(&mut self, session_name: &str) -> String {
self.cookies[&self.get_cookie_key(session_name)].clone()
}
fn get_cookie_key(&self, session_name: &str) -> String {
settings::get_string(&format!(
"cookie.{}.name",
settings::get_string(&format!("session.{}.cookie", session_name)).unwrap()
))
.unwrap()
}
}