arc_web/helpers/
session.rs1use actix_session::Session;
9use arc_core::read_model_store::ReadModelStore;
10use serde::{Deserialize, Serialize};
11
12const SESSION_USER_KEY: &str = "user";
14
15#[derive(Serialize, Deserialize, Clone, Debug)]
17pub struct SessionUser {
18 pub id: String,
20 pub name: String,
21 pub email: String,
22}
23
24impl SessionUser {
25 pub fn from_row(row: &serde_json::Value) -> Option<Self> {
28 Some(Self {
29 id: row.get("id")?.as_str()?.to_string(),
30 name: row.get("name")?.as_str()?.to_string(),
31 email: row.get("email")?.as_str()?.to_string(),
32 })
33 }
34
35 pub async fn from_projection(store: &dyn ReadModelStore, view: &str, id: &str) -> Option<Self> {
38 let row = store.get(view, id).await.ok().flatten()?;
39 Self::from_row(&row)
40 }
41}
42
43pub fn is_authenticated(session: &Session) -> bool {
47 session
48 .get::<SessionUser>(SESSION_USER_KEY)
49 .ok()
50 .flatten()
51 .is_some()
52}
53
54pub fn get_session_user(session: &Session) -> Option<SessionUser> {
56 session.get::<SessionUser>(SESSION_USER_KEY).ok().flatten()
57}
58
59pub fn set_session_user(session: &Session, user: &SessionUser) {
61 let _ = session.insert(SESSION_USER_KEY, user.clone());
62}
63
64pub fn clear_session_user(session: &Session) {
66 session.remove(SESSION_USER_KEY);
67 session.remove("user_id");
69 session.remove("user_data");
70}
71
72pub fn get_session_message(session: &Session, is_json: bool) -> (String, String) {
76 if !is_json {
77 let simple_message = (
78 "success".to_string(),
79 session
80 .get::<String>("message")
81 .unwrap_or(Some("".to_string()))
82 .unwrap_or("".to_string()),
83 );
84
85 session.remove("message");
86
87 return simple_message;
88 }
89
90 let session_message = session
91 .get::<serde_json::Value>("message")
92 .unwrap_or(Some(serde_json::json!({})))
93 .unwrap_or(serde_json::json!({}));
94
95 if session_message.is_null() {
96 session.remove("message");
97
98 return ("success".to_string(), "".to_string());
99 }
100
101 if session_message["error"].is_string()
102 && !session_message["error"].as_str().unwrap().is_empty()
103 {
104 session.remove("message");
105
106 return (
107 "error".to_string(),
108 session_message["error"].as_str().unwrap().to_string(),
109 );
110 }
111
112 if session_message["success"].is_string()
113 && !session_message["success"].as_str().unwrap().is_empty()
114 {
115 session.remove("message");
116
117 return (
118 "success".to_string(),
119 session_message["success"].as_str().unwrap().to_string(),
120 );
121 }
122
123 session.remove("message");
124
125 ("success".to_string(), "".to_string())
126}