1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use crate::conn::Conn;
use std::{collections::HashMap, future::Future, pin::Pin};
use uuid::Uuid;

const DEFAULT_LANGUAGE: &str = "es-MX";

pub fn get_language(c: Conn) -> Pin<Box<dyn Future<Output = Conn>>> {
    Box::pin(get_language_conn(c))
}

pub fn fetch_session(c: Conn) -> Pin<Box<dyn Future<Output = Conn>>> {
    Box::pin(fetch_session_conn(c))
}

pub async fn get_language_conn(conn: Conn) -> Conn {
    let lang: &str = match conn.req_headers.get("accept-language") {
        Some(l) => l,
        None => DEFAULT_LANGUAGE,
    };

    let mut assigns: HashMap<String, String> = conn.assigns.clone();
    assigns.insert("language".to_owned(), lang.to_owned());
    return Conn {
        assigns: assigns,
        ..conn
    };
}

pub async fn fetch_session_conn(conn: Conn) -> Conn {
    match conn.req_headers.get("cookie") {
        Some(cookies) => {
            for c in cookies.split(";") {
                let v: Vec<&str> = c.split("=").collect();
                if v[0] == "confetti_session_id" {
                    let mut assigns: HashMap<String, String> = conn.assigns.clone();
                    assigns.insert("session_id".to_owned(), v[1].to_owned());
                    return Conn {
                        assigns: assigns,
                        ..conn
                    };
                }
            }
            return add_new_session(conn);
        }
        None => {
            return add_new_session(conn);
        }
    };
}

fn generate_session_id() -> String {
    let new_uuid = Uuid::new_v4();
    return new_uuid.to_string();
}

fn add_new_session(conn: Conn) -> Conn {
    let session_id = generate_session_id();
    let mut assigns: HashMap<String, String> = conn.assigns.clone();
    assigns.insert("session_id".to_owned(), session_id.clone());

    let mut resp_headers: HashMap<String, String> = conn.resp_headers.clone();
    resp_headers.insert(
        "Set-Cookie".to_owned(),
        format!("confetti_session_id={};", session_id),
    );
    return Conn {
        assigns: assigns,
        resp_headers: resp_headers,
        ..conn
    };
}