36 lines
1.2 KiB
Rust
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,
|
|
})))
|
|
}
|