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>, headers: axum::http::HeaderMap, ) -> Json { // 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, }), } }