From b51b7a331ddfd93675e93d88cf267494b9c1b083 Mon Sep 17 00:00:00 2001 From: Ilion Beyst Date: Fri, 14 Oct 2022 14:06:22 +0200 Subject: [PATCH] allow filtering for had_errors --- planetwars-server/src/db/match_queries.rs | 12 +++++++++++- planetwars-server/src/db/matches.rs | 4 +++- planetwars-server/src/routes/matches.rs | 2 ++ planetwars-server/tests/integration.rs | 20 ++++++++++++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/planetwars-server/src/db/match_queries.rs b/planetwars-server/src/db/match_queries.rs index 2e89706..999802f 100644 --- a/planetwars-server/src/db/match_queries.rs +++ b/planetwars-server/src/db/match_queries.rs @@ -8,9 +8,12 @@ use diesel::{PgConnection, QueryResult, RunQueryDsl}; pub struct ListBotMatches { pub bot_id: i32, - pub opponent_id: Option, + pub had_errors: Option, pub outcome: Option, + pub opponent_id: Option, + + // pagination options pub before: Option, pub after: Option, pub amount: i64, @@ -29,6 +32,12 @@ impl QueryFragment for ListBotMatches { "WHERE bot_id = " )); out.push_bind_param::(&self.bot_id)?; + + if let Some(had_errors) = self.had_errors.as_ref() { + out.push_sql(" AND match_players.had_errors = "); + out.push_bind_param::(had_errors)?; + } + out.push_sql(") main_player ON matches.id = main_player.match_id"); if let Some(opponent_id) = self.opponent_id.as_ref() { @@ -40,6 +49,7 @@ impl QueryFragment for ListBotMatches { "WHERE bot_id = " )); out.push_bind_param::(opponent_id)?; + out.push_sql(") other_player ON matches.id = other_player.match_id"); } diff --git a/planetwars-server/src/db/matches.rs b/planetwars-server/src/db/matches.rs index 43e93a3..c86f332 100644 --- a/planetwars-server/src/db/matches.rs +++ b/planetwars-server/src/db/matches.rs @@ -177,6 +177,7 @@ pub fn list_bot_matches( bot_id: i32, opponent_id: Option, outcome: Option, + had_errors: Option, amount: i64, before: Option, after: Option, @@ -184,8 +185,9 @@ pub fn list_bot_matches( ) -> QueryResult> { let lbm = ListBotMatches { bot_id, - opponent_id, outcome, + had_errors, + opponent_id, before, after, amount, diff --git a/planetwars-server/src/routes/matches.rs b/planetwars-server/src/routes/matches.rs index 6845e90..24d0b7e 100644 --- a/planetwars-server/src/routes/matches.rs +++ b/planetwars-server/src/routes/matches.rs @@ -44,6 +44,7 @@ pub struct ListRecentMatchesParams { bot: Option, opponent: Option, + had_errors: Option, outcome: Option, } @@ -85,6 +86,7 @@ pub async fn list_recent_matches( bot.id, opponent_id, params.outcome, + params.had_errors, count, params.before, params.after, diff --git a/planetwars-server/tests/integration.rs b/planetwars-server/tests/integration.rs index 28cfe1a..0428aa2 100644 --- a/planetwars-server/tests/integration.rs +++ b/planetwars-server/tests/integration.rs @@ -389,5 +389,25 @@ async fn test_list_matches_with_errors() -> io::Result<()> { ); assert_eq!(matches[0]["players"][1]["had_errors"].as_bool(), Some(true)); + // test had_errors filter + // TODO: maybe write a dedicated test for all list_matches options + let response = app + .call( + Request::builder() + .method(http::Method::GET) + .header("Content-Type", "application/json") + .uri(format!("/api/matches?bot=testbot&had_errors=false")) + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + let body = hyper::body::to_bytes(response.into_body()).await.unwrap(); + let resp: JsonValue = serde_json::from_slice(&body).unwrap(); + + let matches = resp["matches"].as_array().unwrap(); + assert_eq!(matches.len(), 0); Ok(()) }