Co-authored-by: Sharang Parnerkar <parnerkarsharang@gmail.com> Reviewed-on: #5
47 lines
1.2 KiB
Rust
47 lines
1.2 KiB
Rust
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<UserStateInner>);
|
|
|
|
impl Deref for UserState {
|
|
type Target = UserStateInner;
|
|
fn deref(&self) -> &Self::Target {
|
|
&self.0
|
|
}
|
|
}
|
|
|
|
impl From<UserStateInner> 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,
|
|
}
|