diff --git a/crates/knowfoolery-server/src/dto/responses.rs b/crates/knowfoolery-server/src/dto/responses.rs index 84aa3f0..7acabd0 100644 --- a/crates/knowfoolery-server/src/dto/responses.rs +++ b/crates/knowfoolery-server/src/dto/responses.rs @@ -87,6 +87,32 @@ pub struct StartSessionResponse { pub question: QuestionResponse, } +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct LeaderboardResponse { + pub rank: i32, + pub player_name: String, + pub score: i32, + pub questions_answered: i32, + pub correct_answers: i32, + pub success_rate: f64, + pub duration_seconds: i64, +} + +impl From for LeaderboardResponse { + fn from(entry: LeaderboardEntry) -> Self { + Self { + rank: entry.rank, + player_name: entry.player_name, + score: entry.score, + questions_answered: entry.questions_answered, + correct_answers: entry.correct_answers, + success_rate: entry.success_rate, + duration_seconds: entry.duration_seconds, + } + } +} + #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] pub struct AdminQuestionResponse { diff --git a/crates/knowfoolery-server/src/handlers/leaderboard.rs b/crates/knowfoolery-server/src/handlers/leaderboard.rs index cc527d1..b1ccb29 100644 --- a/crates/knowfoolery-server/src/handlers/leaderboard.rs +++ b/crates/knowfoolery-server/src/handlers/leaderboard.rs @@ -1,13 +1,13 @@ use axum::{extract::State, Json}; use crate::app_state::AppState; +use crate::dto::responses::LeaderboardResponse; use crate::error::ApiError; use crate::services::game_service::GameService; -use knowfoolery_shared::models::LeaderboardEntry; pub async fn get_leaderboard( State(state): State, -) -> Result>, ApiError> { +) -> Result>, ApiError> { let svc = GameService::new( state.session_repo.clone(), state.session_question_repo.clone(), @@ -15,5 +15,6 @@ pub async fn get_leaderboard( state.leaderboard_repo.clone(), ); let entries = svc.get_leaderboard().await?; - Ok(Json(entries)) + let response = entries.into_iter().map(LeaderboardResponse::from).collect(); + Ok(Json(response)) }