refactor: reuse session validation in get_current_admin_user via get_user_by_token
This commit is contained in:
parent
58f972aa17
commit
28707d3c3a
@ -241,14 +241,8 @@ pub struct CurrentUserResponse {
|
|||||||
pub user: Option<PublicUser>,
|
pub user: Option<PublicUser>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[server(GetCurrentUser, "/api")]
|
#[cfg(feature = "server")]
|
||||||
pub async fn get_current_user() -> Result<CurrentUserResponse, ServerFnError> {
|
pub async fn get_user_by_token(token: &str) -> Result<Option<User>, ServerFnError> {
|
||||||
let token = get_session_from_ctx();
|
|
||||||
|
|
||||||
let Some(token) = token else {
|
|
||||||
return Ok(CurrentUserResponse { user: None });
|
|
||||||
};
|
|
||||||
|
|
||||||
let client = get_conn().await.map_err(|e| {
|
let client = get_conn().await.map_err(|e| {
|
||||||
tracing::error!("GetCurrentUser DB connection failed: {:?}", e);
|
tracing::error!("GetCurrentUser DB connection failed: {:?}", e);
|
||||||
ServerFnError::new(format!("数据库连接失败: {}", e))
|
ServerFnError::new(format!("数据库连接失败: {}", e))
|
||||||
@ -256,7 +250,7 @@ pub async fn get_current_user() -> Result<CurrentUserResponse, ServerFnError> {
|
|||||||
|
|
||||||
let row = client
|
let row = client
|
||||||
.query_opt(
|
.query_opt(
|
||||||
"SELECT u.id, u.username, u.email, u.role, u.created_at
|
"SELECT u.id, u.username, u.email, u.password_hash, u.role, u.created_at
|
||||||
FROM sessions s
|
FROM sessions s
|
||||||
JOIN users u ON s.user_id = u.id
|
JOIN users u ON s.user_id = u.id
|
||||||
WHERE s.token = $1 AND s.expires_at > NOW()",
|
WHERE s.token = $1 AND s.expires_at > NOW()",
|
||||||
@ -272,10 +266,11 @@ pub async fn get_current_user() -> Result<CurrentUserResponse, ServerFnError> {
|
|||||||
Some(row) => {
|
Some(row) => {
|
||||||
let role_str: String = row.get("role");
|
let role_str: String = row.get("role");
|
||||||
let role = UserRole::from_str(&role_str).unwrap_or(UserRole::Blocked);
|
let role = UserRole::from_str(&role_str).unwrap_or(UserRole::Blocked);
|
||||||
Some(PublicUser {
|
Some(User {
|
||||||
id: row.get("id"),
|
id: row.get("id"),
|
||||||
username: row.get("username"),
|
username: row.get("username"),
|
||||||
email: row.get("email"),
|
email: row.get("email"),
|
||||||
|
password_hash: row.get("password_hash"),
|
||||||
role,
|
role,
|
||||||
created_at: row.get("created_at"),
|
created_at: row.get("created_at"),
|
||||||
})
|
})
|
||||||
@ -283,5 +278,20 @@ pub async fn get_current_user() -> Result<CurrentUserResponse, ServerFnError> {
|
|||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Ok(user)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[server(GetCurrentUser, "/api")]
|
||||||
|
pub async fn get_current_user() -> Result<CurrentUserResponse, ServerFnError> {
|
||||||
|
let token = match get_session_from_ctx() {
|
||||||
|
Some(t) => t,
|
||||||
|
None => return Ok(CurrentUserResponse { user: None }),
|
||||||
|
};
|
||||||
|
|
||||||
|
let user = match get_user_by_token(&token).await? {
|
||||||
|
Some(u) => Some(PublicUser::from(u)),
|
||||||
|
None => None,
|
||||||
|
};
|
||||||
|
|
||||||
Ok(CurrentUserResponse { user })
|
Ok(CurrentUserResponse { user })
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,38 +14,13 @@ use crate::models::user::{User, UserRole};
|
|||||||
|
|
||||||
#[cfg(feature = "server")]
|
#[cfg(feature = "server")]
|
||||||
async fn get_current_admin_user() -> Result<User, ServerFnError> {
|
async fn get_current_admin_user() -> Result<User, ServerFnError> {
|
||||||
let token = get_session_from_ctx();
|
let token = match get_session_from_ctx() {
|
||||||
|
Some(t) => t,
|
||||||
let Some(token) = token else {
|
None => return Err(ServerFnError::new("未登录")),
|
||||||
return Err(ServerFnError::new("未登录"));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let client = get_conn().await.map_err(db_conn_error)?;
|
let user = match crate::api::auth::get_user_by_token(&token).await? {
|
||||||
|
Some(u) => u,
|
||||||
let row = client
|
|
||||||
.query_opt(
|
|
||||||
"SELECT u.id, u.username, u.email, u.password_hash, u.role, u.created_at
|
|
||||||
FROM sessions s
|
|
||||||
JOIN users u ON s.user_id = u.id
|
|
||||||
WHERE s.token = $1 AND s.expires_at > NOW()",
|
|
||||||
&[&token],
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
.map_err(query_error)?;
|
|
||||||
|
|
||||||
let user = match row {
|
|
||||||
Some(row) => {
|
|
||||||
let role_str: String = row.get("role");
|
|
||||||
let role = UserRole::from_str(&role_str).unwrap_or(UserRole::Blocked);
|
|
||||||
User {
|
|
||||||
id: row.get("id"),
|
|
||||||
username: row.get("username"),
|
|
||||||
email: row.get("email"),
|
|
||||||
password_hash: row.get("password_hash"),
|
|
||||||
role,
|
|
||||||
created_at: row.get("created_at"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None => return Err(ServerFnError::new("会话已过期")),
|
None => return Err(ServerFnError::new("会话已过期")),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user