axum_jwt_sessions/refresher.rs
1use crate::error::Result;
2use serde::Serialize;
3
4/// Trait for refreshing session data during token refresh.
5///
6/// This trait allows you to fetch fresh session data when refreshing tokens,
7/// ensuring that the new access token contains up-to-date information.
8///
9/// # Example Implementation
10///
11/// ```rust
12/// use serde::{Deserialize, Serialize};
13/// use std::sync::Arc;
14/// use axum_jwt_sessions::{SessionDataRefresher, Result};
15///
16/// #[derive(Serialize, Deserialize)]
17/// struct UserSession {
18/// user_id: String,
19/// email: String,
20/// roles: Vec<String>,
21/// }
22///
23/// struct User {
24/// id: String,
25/// email: String,
26/// roles: Vec<String>,
27/// }
28///
29/// struct UserRepository;
30///
31/// impl UserRepository {
32/// async fn find_by_id(&self, _id: &str) -> std::result::Result<Option<User>, Box<dyn std::error::Error>> {
33/// Ok(None)
34/// }
35/// }
36///
37/// struct MyRefresher {
38/// user_repository: Arc<UserRepository>,
39/// }
40///
41/// impl SessionDataRefresher for MyRefresher {
42/// type SessionData = UserSession;
43///
44/// async fn refresh_session_data(&self, user_id: &str) -> Result<Option<Self::SessionData>> {
45/// // Fetch fresh user data from database
46/// let user_result = self.user_repository.find_by_id(user_id).await
47/// .map_err(|e| axum_jwt_sessions::AuthError::StorageError(e.to_string()))?;
48/// if let Some(user) = user_result {
49/// Ok(Some(UserSession {
50/// user_id: user.id,
51/// email: user.email,
52/// roles: user.roles,
53/// // ... other fresh data
54/// }))
55/// } else {
56/// Ok(None)
57/// }
58/// }
59/// }
60/// ```
61pub trait SessionDataRefresher: Send + Sync {
62 type SessionData: Serialize + Send + Sync;
63
64 /// Refresh session data for the given user ID.
65 ///
66 /// This method is called during token refresh to fetch the latest session data
67 /// based on the user ID stored with the refresh token.
68 /// Return `None` if the user no longer exists or should not be refreshed.
69 fn refresh_session_data(
70 &self,
71 user_id: &str,
72 ) -> impl std::future::Future<Output = Result<Option<Self::SessionData>>> + Send;
73}