rocket_base_app/src/session.rs


Home Back
extern crate redis;
use redis::Commands;
use rocket::http::CookieJar;
use serde_json::Value;
use serde_json::json;
use std::error::Error;

pub const COOKIE_NAME: &str = "app_base_uuid";
pub const EXPIRE_SESSION_SECS: i64 = 60 * 60; //365 * 24 * 60 * 60; //1 anno, 1 year
pub static REDIS_URL: &str = "redis://127.0.0.1";

pub fn get_session(
    cookies: &CookieJar<'_>,
    cookie_name: String,
    val: String,
) -> Result<String, Box<dyn Error>> {
    let res: String;
    match cookies.get(cookie_name.as_str()) {
        Some(c) => {
            let mut client_valkey = redis::Client::open(REDIS_URL)?;
            let valkey_session: String = client_valkey.get(c.value().to_string())?; //valkey_session contiene l'intero json
            let json_str = valkey_session; //json convertito in str
            let v: Value = serde_json::from_str(json_str.as_str())?;
            res = v[val.as_str()].to_string().replace("\"", "");
        }

        None => {
            res = "".to_string();
            println!("Coookie {} not found!", cookie_name);
        }
    }
    Ok(res)
}

pub fn set_session(
    cookies: &CookieJar<'_>,
    cookie_name: String,
    val: String,
    val_elem: String,
) -> Result<String, Box<dyn Error>> {
    let cv: String;
    match cookies.get(cookie_name.as_str()) {
        Some(c) => cv = c.value().to_string(),
        None => {
            eprintln!("Cookie {} not found!", cookie_name);
            return Ok(String::new());
        }
    };

    let client = redis::Client::open(REDIS_URL)?;
    let mut conn = client.get_connection()?;

    let key = cv.as_str();

    let json_blank = json!({"id":"","username":""});
    let valkey_session: String = conn.get(key).unwrap_or_else(|_e| json_blank.to_string());
    let mut v: Value = serde_json::from_str(&valkey_session).unwrap_or_else(|_e| json_blank);

    v[val.as_str()] = Value::String(val_elem);
    let new_json: String = v.to_string();
    conn.set::<&str, String, ()>(key, new_json.clone())?;

    Ok(new_json)
}

pub fn set_expire_session(session_name: &str, s: i64) -> Result<bool, Box<dyn Error>> {
    let client = redis::Client::open(REDIS_URL)?;
    let mut conn = client.get_connection()?;
    let ok: bool = conn.expire(session_name, s)?;
    Ok(ok)
}
pub fn del_session(session_name: &str) -> Result<bool, Box<dyn Error>> {
    let client = redis::Client::open(REDIS_URL)?;
    let mut conn = client.get_connection()?;
    let ok: bool = conn.del(session_name)?;
    Ok(ok)
}

Powered by Code, a simple repository browser by Fabio Di Matteo