2025-04-02 09:35:37 +07:00
|
|
|
use super::PermissionsEnum;
|
2025-08-14 13:16:39 +07:00
|
|
|
use crate::{AppState, AuthRepository, common_response, extract_email, extract_email_async, UsersDetailQueryDto};
|
2025-04-02 09:35:37 +07:00
|
|
|
use axum::{
|
|
|
|
|
http::{HeaderMap, StatusCode},
|
|
|
|
|
response::Response,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
pub async fn permissions_guard(
|
|
|
|
|
headers: &HeaderMap,
|
|
|
|
|
state: AppState,
|
|
|
|
|
required_permissions: Vec<PermissionsEnum>,
|
2025-08-14 13:16:39 +07:00
|
|
|
) -> Result<UsersDetailQueryDto, Response> {
|
2025-04-02 09:35:37 +07:00
|
|
|
let auth_repo = AuthRepository::new(&state);
|
2025-08-12 19:25:10 +07:00
|
|
|
|
|
|
|
|
// Try synchronous email extraction first (for internal JWT tokens)
|
|
|
|
|
let email = match extract_email(headers) {
|
|
|
|
|
Some(email) => email,
|
|
|
|
|
None => {
|
|
|
|
|
// If sync extraction fails, try async (for Google tokens)
|
|
|
|
|
match extract_email_async(headers).await {
|
|
|
|
|
Some(email) => email,
|
|
|
|
|
None => {
|
|
|
|
|
return Err(common_response(
|
|
|
|
|
StatusCode::UNAUTHORIZED,
|
|
|
|
|
"Invalid or missing authorization token",
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2025-04-02 09:35:37 +07:00
|
|
|
let raw_user = auth_repo
|
|
|
|
|
.query_get_stored_user(email.clone())
|
|
|
|
|
.await
|
|
|
|
|
.map_err(|_| {
|
|
|
|
|
common_response(
|
|
|
|
|
StatusCode::UNAUTHORIZED,
|
|
|
|
|
"User session expired or not found",
|
|
|
|
|
)
|
|
|
|
|
})?;
|
|
|
|
|
let role_permissions: Vec<String> =
|
2025-08-14 13:16:39 +07:00
|
|
|
raw_user.role.permissions.iter().map(|perm| perm.name.clone()).collect();
|
2025-07-21 21:29:04 +07:00
|
|
|
|
|
|
|
|
for required in &required_permissions {
|
|
|
|
|
let required_str = required.to_string();
|
|
|
|
|
if !role_permissions.contains(&required_str) {
|
|
|
|
|
eprintln!(" MISSING REQUIRED PERMISSION: {required_str}");
|
|
|
|
|
return Err(common_response(
|
|
|
|
|
StatusCode::FORBIDDEN,
|
|
|
|
|
"You don't have the required permissions",
|
|
|
|
|
));
|
|
|
|
|
}
|
2025-04-02 09:35:37 +07:00
|
|
|
}
|
2025-08-14 13:16:39 +07:00
|
|
|
Ok(raw_user)
|
2025-04-02 09:35:37 +07:00
|
|
|
}
|