use crate::models::AuthInfo; use dioxus::prelude::*; /// Check the current user's authentication state. /// /// Reads the tower-sessions session on the server and returns an /// [`AuthInfo`] describing the logged-in user. When no valid session /// exists, `authenticated` is `false` and all other fields are empty. /// /// # Errors /// /// Returns `ServerFnError` if the session store cannot be read. #[server(endpoint = "check-auth")] pub async fn check_auth() -> Result { use crate::infrastructure::auth::LOGGED_IN_USER_SESS_KEY; use crate::infrastructure::state::UserStateInner; use dioxus_fullstack::FullstackContext; let session: tower_sessions::Session = FullstackContext::extract().await?; let user_state: Option = session .get(LOGGED_IN_USER_SESS_KEY) .await .map_err(|e| ServerFnError::new(format!("session read failed: {e}")))?; match user_state { Some(u) => { let librechat_url = std::env::var("LIBRECHAT_URL") .unwrap_or_else(|_| "http://localhost:3080".into()); Ok(AuthInfo { authenticated: true, sub: u.sub, email: u.user.email, name: u.user.name, avatar_url: u.user.avatar_url, librechat_url, }) } None => Ok(AuthInfo::default()), } }