use actix_session::Session;
use arc_core::read_model_store::ReadModelStore;
use serde::{Deserialize, Serialize};
const SESSION_USER_KEY: &str = "user";
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct SessionUser {
pub id: String,
pub name: String,
pub email: String,
}
impl SessionUser {
pub fn from_row(row: &serde_json::Value) -> Option<Self> {
Some(Self {
id: row.get("id")?.as_str()?.to_string(),
name: row.get("name")?.as_str()?.to_string(),
email: row.get("email")?.as_str()?.to_string(),
})
}
pub async fn from_projection(store: &dyn ReadModelStore, view: &str, id: &str) -> Option<Self> {
let row = store.get(view, id).await.ok().flatten()?;
Self::from_row(&row)
}
}
pub fn is_authenticated(session: &Session) -> bool {
session
.get::<SessionUser>(SESSION_USER_KEY)
.ok()
.flatten()
.is_some()
}
pub fn get_session_user(session: &Session) -> Option<SessionUser> {
session.get::<SessionUser>(SESSION_USER_KEY).ok().flatten()
}
pub fn set_session_user(session: &Session, user: &SessionUser) {
let _ = session.insert(SESSION_USER_KEY, user.clone());
}
pub fn clear_session_user(session: &Session) {
session.remove(SESSION_USER_KEY);
session.remove("user_id");
session.remove("user_data");
}
pub fn get_session_message(session: &Session, is_json: bool) -> (String, String) {
if !is_json {
let simple_message = (
"success".to_string(),
session
.get::<String>("message")
.unwrap_or(Some("".to_string()))
.unwrap_or("".to_string()),
);
session.remove("message");
return simple_message;
}
let session_message = session
.get::<serde_json::Value>("message")
.unwrap_or(Some(serde_json::json!({})))
.unwrap_or(serde_json::json!({}));
if session_message.is_null() {
session.remove("message");
return ("success".to_string(), "".to_string());
}
if session_message["error"].is_string()
&& !session_message["error"].as_str().unwrap().is_empty()
{
session.remove("message");
return (
"error".to_string(),
session_message["error"].as_str().unwrap().to_string(),
);
}
if session_message["success"].is_string()
&& !session_message["success"].as_str().unwrap().is_empty()
{
session.remove("message");
return (
"success".to_string(),
session_message["success"].as_str().unwrap().to_string(),
);
}
session.remove("message");
("success".to_string(), "".to_string())
}