use crate::extractors::GameId; use axum::{extract::State, Json}; use serde_json::{json, Value}; use crate::{ app::AppState, error::AppResult, services::{achievement as ach_svc, club as club_svc, profile as profile_svc}, }; pub async fn get_achievements(State(state): State, game: GameId) -> AppResult> { let profile = profile_svc::get_active_profile(&state.pool, game.as_str()).await?; let club = club_svc::get_club_by_profile(&state.pool, &profile.id).await?; let _ = ach_svc::check_and_unlock(&state.pool, &state.achievement_defs, &profile.id, &club.id).await; let achievements = ach_svc::list_with_status(&state.pool, &state.achievement_defs).await?; let earned = achievements.iter().filter(|a| a["unlocked"].as_bool().unwrap_or(false)).count(); Ok(Json(json!({ "achievements": achievements, "earned": earned, "total": achievements.len(), }))) }