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:
MythEclipse
2025-09-26 17:35:30 +07:00
parent 96debc210a
commit 14b22328de
71 changed files with 1566 additions and 632 deletions
+18 -19
View File
@@ -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")),
}
};
+3 -3
View File
@@ -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,