aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--planetwars-server/src/lib.rs2
-rw-r--r--planetwars-server/src/routes/matches.rs28
2 files changed, 26 insertions, 4 deletions
diff --git a/planetwars-server/src/lib.rs b/planetwars-server/src/lib.rs
index 9983dda..804dcd5 100644
--- a/planetwars-server/src/lib.rs
+++ b/planetwars-server/src/lib.rs
@@ -129,7 +129,7 @@ pub fn api() -> Router {
"/bots/:bot_name/upload",
post(routes::bots::upload_code_multipart),
)
- .route("/matches", get(routes::matches::list_public_matches))
+ .route("/matches", get(routes::matches::list_recent_matches))
.route("/matches/:match_id", get(routes::matches::get_match_data))
.route(
"/matches/:match_id/log",
diff --git a/planetwars-server/src/routes/matches.rs b/planetwars-server/src/routes/matches.rs
index 03f6653..fde8471 100644
--- a/planetwars-server/src/routes/matches.rs
+++ b/planetwars-server/src/routes/matches.rs
@@ -1,4 +1,8 @@
-use axum::{extract::Path, Extension, Json};
+use axum::{
+ extract::{Path, Query},
+ Extension, Json,
+};
+use chrono::NaiveDateTime;
use hyper::StatusCode;
use serde::{Deserialize, Serialize};
use std::{path::PathBuf, sync::Arc};
@@ -24,10 +28,28 @@ pub struct ApiMatchPlayer {
bot_name: Option<String>,
}
-pub async fn list_public_matches(
+#[derive(Serialize, Deserialize)]
+pub struct ListRecentMatchesParams {
+ count: Option<usize>,
+ // TODO: should timezone be specified here?
+ // TODO: implement these
+ before: Option<NaiveDateTime>,
+ after: Option<NaiveDateTime>,
+}
+
+const MAX_NUM_RETURNED_MATCHES: usize = 100;
+const DEFAULT_NUM_RETURNED_MATCHES: usize = 50;
+
+pub async fn list_recent_matches(
+ Query(params): Query<ListRecentMatchesParams>,
conn: DatabaseConnection,
) -> Result<Json<Vec<ApiMatch>>, StatusCode> {
- matches::list_public_matches(100, &conn)
+ let count = std::cmp::min(
+ params.count.unwrap_or(DEFAULT_NUM_RETURNED_MATCHES),
+ MAX_NUM_RETURNED_MATCHES,
+ );
+
+ matches::list_public_matches(count as i64, &conn)
.map_err(|_| StatusCode::BAD_REQUEST)
.map(|matches| Json(matches.into_iter().map(match_data_to_api).collect()))
}