feat(backend): /api/tss/games/:id/logs endpoint

This commit is contained in:
FURRO404
2026-06-18 00:32:51 -07:00
parent dc3a0b33f4
commit 18a45f664b
+32
View File
@@ -214,6 +214,12 @@ struct GameResponse {
participants: Vec<GameParticipant>,
}
#[derive(Serialize)]
struct GameLogsResponse {
chat_log: Vec<String>,
battle_log: Vec<String>,
}
#[derive(Serialize)]
struct GameRow {
#[serde(skip_serializing_if = "Option::is_none")]
@@ -358,6 +364,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
.route("/api/tss/leaderboard/teams", get(leaderboard))
.route("/api/tss/games/recent", get(recent_games))
.route("/api/tss/games/{session_id}", get(game_detail))
.route("/api/tss/games/{session_id}/logs", get(game_logs))
.route("/api/tss/teams/resolve", get(resolve_team))
.route("/api/tss/teams/search", get(search_teams))
.route("/api/tss/teams/{team}", get(team_detail))
@@ -564,6 +571,31 @@ async fn game_detail(
Ok(Json(GameResponse { game, participants }))
}
async fn game_logs(
State(state): State<Arc<AppState>>,
Path(session_id): Path<String>,
) -> ApiResult<GameLogsResponse> {
let session_id = validate_session_id(&session_id)?;
let conn = open_db(&state.battles_db)?;
// Logs are non-critical: a missing match_logs table or row yields empty arrays.
let row: Option<(Option<String>, Option<String>)> = conn
.query_row(
"SELECT chat_log_json, battle_log_json FROM match_logs WHERE session_id = ?1",
params![session_id],
|r| Ok((r.get(0)?, r.get(1)?)),
)
.optional()
.unwrap_or(None);
let parse = |s: Option<String>| -> Vec<String> {
s.and_then(|t| serde_json::from_str(&t).ok()).unwrap_or_default()
};
let (chat, battle) = row.unwrap_or((None, None));
Ok(Json(GameLogsResponse {
chat_log: parse(chat),
battle_log: parse(battle),
}))
}
async fn resolve_team(
State(state): State<Arc<AppState>>,
Query(query): Query<ResolveQuery>,