Refactor and enhance SurrealDB integration and resource management
- Updated `lib.rs` to selectively expose specific entities and services for better clarity. - Improved SurrealDB client initialization with detailed logging in `surrealdb/mod.rs`. - Enhanced resource definitions in `resource.rs` with additional utility methods for better resource management. - Refactored user data retrieval logic in `auth_middleware/mod.rs` for improved readability and efficiency. - Cleaned up middleware exports in `lib.rs` for clearer API surface. - Added detailed comments and documentation throughout the SurrealDB module for better maintainability. - Updated tests to ensure compatibility with new changes and improved structure. - Introduced new permissions module structure in `imphnen-utils` for future enhancements.
This commit is contained in:
@@ -41,28 +41,27 @@ pub async fn auth_middleware(
|
||||
|
||||
// Try SurrealDB mem first
|
||||
let mem_db = &state.surrealdb_mem;
|
||||
let mut user_data: Option<UsersDetailQueryDto> = None;
|
||||
if let Ok(opt_user) = mem_db.select(("users", &user_id)).await {
|
||||
if let Some(user) = opt_user {
|
||||
let user: UsersDetailQueryDto = user;
|
||||
if !user.is_deleted && !user.role.is_deleted {
|
||||
user_data = Some(user);
|
||||
}
|
||||
let user_data = if let Ok(Some(user)) = mem_db.select::<Option<UsersDetailQueryDto>>(("users", &user_id)).await {
|
||||
if !user.is_deleted && !user.role.is_deleted {
|
||||
Some(user)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
// Fallback to main DB if not found in mem
|
||||
let user_data = match user_data {
|
||||
Some(user) => user,
|
||||
None => {
|
||||
match state.user_lookup_service.get_user_by_id_internal(&thing_id, &state).await {
|
||||
Ok(user) => {
|
||||
// Optionally: insert into mem for future requests
|
||||
let _: Result<Option<UsersDetailQueryDto>, _> = mem_db.update(("users", &user_id)).content(user.clone()).await;
|
||||
user
|
||||
},
|
||||
Err(_) => return Ok(common_response(StatusCode::UNAUTHORIZED, "User not found")),
|
||||
}
|
||||
let user_data = if let Some(user) = user_data {
|
||||
user
|
||||
} else {
|
||||
match state.user_lookup_service.get_user_by_id_internal(&thing_id, &state).await {
|
||||
Ok(user) => {
|
||||
// Cache in mem for future requests
|
||||
let _: Result<Option<UsersDetailQueryDto>, _> = mem_db.update(("users", &user_id)).content(user.clone()).await;
|
||||
user
|
||||
},
|
||||
Err(_) => return Ok(common_response(StatusCode::UNAUTHORIZED, "User not found")),
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -2,6 +2,6 @@ pub mod auth_middleware;
|
||||
pub mod cors_middleware;
|
||||
pub mod permissions_middleware;
|
||||
|
||||
pub use auth_middleware::*;
|
||||
pub use cors_middleware::*;
|
||||
pub use permissions_middleware::*;
|
||||
pub use auth_middleware::auth_middleware;
|
||||
pub use cors_middleware::cors_middleware;
|
||||
pub use permissions_middleware::PermissionsMiddlewareLayer;
|
||||
|
||||
@@ -9,6 +9,7 @@ use imphnen_utils::{common_response, extract_email, extract_email_async};
|
||||
use std::task::{Context, Poll};
|
||||
use tower::{Layer, Service};
|
||||
|
||||
/// Middleware layer for enforcing user permissions on requests.
|
||||
#[derive(Clone)]
|
||||
pub struct PermissionsMiddlewareLayer {
|
||||
app_state: AppState,
|
||||
@@ -42,6 +43,7 @@ pub struct PermissionsMiddleware<S> {
|
||||
permissions: Vec<PermissionsEnum>,
|
||||
}
|
||||
|
||||
|
||||
impl<S> Service<Request<Body>> for PermissionsMiddleware<S>
|
||||
where
|
||||
S: Service<Request<Body>, Response = Response<Body>> + Clone + Send + 'static,
|
||||
|
||||
Reference in New Issue
Block a user