use std::{ops::Deref, sync::Arc}; use serde::{Deserialize, Serialize}; /// Cheap-to-clone handle to per-session user data. #[derive(Debug, Clone)] pub struct UserState(Arc); impl Deref for UserState { type Target = UserStateInner; fn deref(&self) -> &Self::Target { &self.0 } } impl From for UserState { fn from(value: UserStateInner) -> Self { Self(Arc::new(value)) } } /// Per-session user data stored in the tower-sessions session store. /// /// Persisted across requests for the lifetime of the session. #[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct UserStateInner { /// Subject identifier from Keycloak (unique user ID). pub sub: String, /// OAuth2 access token. pub access_token: String, /// OAuth2 refresh token. pub refresh_token: String, /// Basic user profile. pub user: User, } /// Basic user profile stored alongside the session. #[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct User { /// Email address. pub email: String, /// Display name (preferred_username or full name from Keycloak). pub name: String, /// Avatar / profile picture URL. pub avatar_url: String, }