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 }; }