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}