64 lines
1.8 KiB
Rust
64 lines
1.8 KiB
Rust
use crate::model;
|
|
use crate::state;
|
|
use crate::utils;
|
|
use axum::extract::{Json, State};
|
|
use sqlx::Row;
|
|
use std::sync::Arc;
|
|
|
|
#[utoipa::path(
|
|
get,
|
|
path = "/api/profile",
|
|
responses(
|
|
(status = 200, description = "User profile information", body = UserProfile),
|
|
(status = 401, description = "Unauthorized", body = UserProfile)
|
|
),
|
|
security(("bearerAuth" = []))
|
|
)]
|
|
pub async fn profile_handler(
|
|
State(state): State<Arc<state::AppState>>,
|
|
headers: axum::http::HeaderMap,
|
|
) -> Json<model::UserProfile> {
|
|
// Extract token from header
|
|
let token = if let Some(auth_header) = headers.get("authorization") {
|
|
auth_header.to_str().unwrap_or("").replace("Bearer ", "")
|
|
} else {
|
|
return Json(model::UserProfile {
|
|
username: "user".to_string(),
|
|
phone: "+1234567890".to_string(),
|
|
avatar_url: None,
|
|
});
|
|
};
|
|
|
|
// Get current user from token
|
|
let username = match utils::verify_token(&state.db_pool, &token).await {
|
|
Ok(Some(user)) => user,
|
|
_ => {
|
|
return Json(model::UserProfile {
|
|
username: "user".to_string(),
|
|
phone: "+1234567890".to_string(),
|
|
avatar_url: None,
|
|
});
|
|
}
|
|
};
|
|
|
|
// Get user details
|
|
let user_result =
|
|
sqlx::query("SELECT username, phone, avatar_url FROM users WHERE username = ?")
|
|
.bind(&username)
|
|
.fetch_optional(&state.db_pool)
|
|
.await;
|
|
|
|
match user_result {
|
|
Ok(Some(row)) => Json(model::UserProfile {
|
|
username: row.get("username"),
|
|
phone: row.get("phone"),
|
|
avatar_url: row.get("avatar_url"),
|
|
}),
|
|
_ => Json(model::UserProfile {
|
|
username: "user".to_string(),
|
|
phone: "+1234567890".to_string(),
|
|
avatar_url: None,
|
|
}),
|
|
}
|
|
}
|