aboutsummaryrefslogtreecommitdiff
path: root/planetwars-server
diff options
context:
space:
mode:
Diffstat (limited to 'planetwars-server')
-rw-r--r--planetwars-server/src/db/match_queries.rs12
-rw-r--r--planetwars-server/src/db/matches.rs4
-rw-r--r--planetwars-server/src/routes/matches.rs2
-rw-r--r--planetwars-server/tests/integration.rs20
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<i32>,
+ pub had_errors: Option<bool>,
pub outcome: Option<BotMatchOutcome>,
+ pub opponent_id: Option<i32>,
+
+ // pagination options
pub before: Option<NaiveDateTime>,
pub after: Option<NaiveDateTime>,
pub amount: i64,
@@ -29,6 +32,12 @@ impl QueryFragment<Pg> for ListBotMatches {
"WHERE bot_id = "
));
out.push_bind_param::<Integer, _>(&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::<Bool, _>(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<Pg> for ListBotMatches {
"WHERE bot_id = "
));
out.push_bind_param::<Integer, _>(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<i32>,
outcome: Option<BotMatchOutcome>,
+ had_errors: Option<bool>,
amount: i64,
before: Option<NaiveDateTime>,
after: Option<NaiveDateTime>,
@@ -184,8 +185,9 @@ pub fn list_bot_matches(
) -> QueryResult<Vec<FullMatchData>> {
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<String>,
opponent: Option<String>,
+ had_errors: Option<bool>,
outcome: Option<BotMatchOutcome>,
}
@@ -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(())
}