diff --git a/src/api/auth.rs b/src/api/auth.rs index c09eee8..ea3d80f 100644 --- a/src/api/auth.rs +++ b/src/api/auth.rs @@ -6,7 +6,7 @@ use http::header::{HeaderValue, SET_COOKIE}; use crate::auth::{password, session}; use crate::db::pool::DB_POOL; -use crate::models::user::{User, UserRole}; +use crate::models::user::{PublicUser, User, UserRole}; #[allow(dead_code)] fn validate_username(username: &str) -> Result<(), String> { @@ -261,7 +261,7 @@ pub async fn logout() -> Result { #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct CurrentUserResponse { - pub user: Option, + pub user: Option, } #[server(GetCurrentUser, "/api")] @@ -289,7 +289,7 @@ pub async fn get_current_user() -> Result { let row = client .query_opt( - "SELECT u.id, u.username, u.email, u.password_hash, u.role, u.created_at + "SELECT u.id, u.username, u.email, 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()", @@ -305,11 +305,10 @@ pub async fn get_current_user() -> Result { Some(row) => { let role_str: String = row.get("role"); let role = UserRole::from_str(&role_str).unwrap_or(UserRole::Blocked); - Some(User { + Some(PublicUser { 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"), }) diff --git a/src/context.rs b/src/context.rs index 1b75899..4f33505 100644 --- a/src/context.rs +++ b/src/context.rs @@ -1,10 +1,10 @@ use dioxus::prelude::*; use std::sync::Arc; -use crate::models::user::User; +use crate::models::user::PublicUser; #[derive(Clone, Copy)] pub struct UserContext { - pub user: Signal>>, + pub user: Signal>>, pub checked: Signal, } diff --git a/src/models/user.rs b/src/models/user.rs index 829727f..4db59bf 100644 --- a/src/models/user.rs +++ b/src/models/user.rs @@ -27,3 +27,24 @@ pub struct User { pub role: UserRole, pub created_at: DateTime, } + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PublicUser { + pub id: i32, + pub username: String, + pub email: String, + pub role: UserRole, + pub created_at: DateTime, +} + +impl From for PublicUser { + fn from(u: User) -> Self { + PublicUser { + id: u.id, + username: u.username, + email: u.email, + role: u.role, + created_at: u.created_at, + } + } +} diff --git a/src/router.rs b/src/router.rs index a4b9532..7692e51 100644 --- a/src/router.rs +++ b/src/router.rs @@ -59,7 +59,7 @@ pub fn AppRouter() -> Element { Theme::Light => "", }; - let user = use_signal(|| None::>); + let user = use_signal(|| None::>); let checked = use_signal(|| false); use_context_provider(|| UserContext { user, checked });