use crate::{ app::AppState, error::AppResult, models::profile::{level_for_xp, XP_THRESHOLDS}, services::profile as profile_svc, }; use axum::{extract::State, Json}; use serde_json::{json, Value}; pub async fn get_profile(State(state): State) -> AppResult> { let profile = profile_svc::get_active_profile(&state.pool).await?; let computed_level = level_for_xp(profile.xp); let next_level = computed_level + 1; let xp_for_next = if next_level as usize <= XP_THRESHOLDS.len() { XP_THRESHOLDS[next_level as usize - 1] } else { let overflow_base = XP_THRESHOLDS.last().copied().unwrap_or(0); let levels_past = next_level - XP_THRESHOLDS.len() as i64; overflow_base + levels_past * 2500 }; let xp_to_next = (xp_for_next - profile.xp).max(0); Ok(Json(json!({ "id": profile.id, "username": profile.username, "level": computed_level, "xp": profile.xp, "xp_to_next_level": xp_to_next, "xp_for_next_level": xp_for_next, "created_at": profile.created_at, "updated_at": profile.updated_at, }))) }