Files
OpenFUT-Core/src/routes/profile.rs
T
2026-08-07 12:03:21 -07:00

36 lines
1.2 KiB
Rust

use crate::extractors::GameId;
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<AppState>, game: GameId) -> AppResult<Json<Value>> {
let profile = profile_svc::get_active_profile(&state.pool, game.as_str()).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,
})))
}