feat(backend): /api/tss/games/:id/logs endpoint
This commit is contained in:
@@ -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>,
|
||||
|
||||
Reference in New Issue
Block a user