diff options
author | Ilion Beyst <ilion.beyst@gmail.com> | 2022-08-08 18:31:11 +0200 |
---|---|---|
committer | Ilion Beyst <ilion.beyst@gmail.com> | 2022-08-08 18:31:11 +0200 |
commit | cf52ab6f7f4f96d552b2c6c828fc40704460046f (patch) | |
tree | 4207929dfc4401979036252ee89744e780c393e4 | |
parent | db7980504f75371965fe887f2e459c8554ac09d0 (diff) | |
download | planetwars.dev-cf52ab6f7f4f96d552b2c6c828fc40704460046f.tar.xz planetwars.dev-cf52ab6f7f4f96d552b2c6c828fc40704460046f.zip |
implement before and after filters for matches
-rw-r--r-- | planetwars-server/src/db/matches.rs | 35 | ||||
-rw-r--r-- | planetwars-server/src/routes/matches.rs | 5 |
2 files changed, 32 insertions, 8 deletions
diff --git a/planetwars-server/src/db/matches.rs b/planetwars-server/src/db/matches.rs index b806dd3..22cb564 100644 --- a/planetwars-server/src/db/matches.rs +++ b/planetwars-server/src/db/matches.rs @@ -130,13 +130,34 @@ pub fn list_matches(amount: i64, conn: &PgConnection) -> QueryResult<Vec<FullMat }) } -pub fn list_public_matches(amount: i64, conn: &PgConnection) -> QueryResult<Vec<FullMatchData>> { +pub fn list_public_matches( + amount: i64, + before: Option<NaiveDateTime>, + after: Option<NaiveDateTime>, + conn: &PgConnection, +) -> QueryResult<Vec<FullMatchData>> { conn.transaction(|| { - let matches = matches::table + // TODO: how can this common logic be abstracted? + // TODO: this is not nice. Replace this with proper cursor logic. + let mut query = matches::table .filter(matches::is_public.eq(true)) - .order_by(matches::created_at.desc()) - .limit(amount) - .get_results::<MatchBase>(conn)?; + .into_boxed(); + + query = match (before, after) { + (None, None) => query.order_by(matches::created_at.desc()), + (Some(before), None) => query + .filter(matches::created_at.lt(before)) + .order_by(matches::created_at.desc()), + (None, Some(after)) => query + .filter(matches::created_at.gt(after)) + .order_by(matches::created_at.asc()), + (Some(before), Some(after)) => query + .filter(matches::created_at.lt(before)) + .filter(matches::created_at.gt(after)) + .order_by(matches::created_at.desc()), + }; + + let matches = query.limit(amount).get_results::<MatchBase>(conn)?; fetch_full_match_data(matches, conn) }) @@ -145,11 +166,15 @@ pub fn list_public_matches(amount: i64, conn: &PgConnection) -> QueryResult<Vec< pub fn list_bot_matches( bot_id: i32, amount: i64, + before: Option<NaiveDateTime>, + after: Option<NaiveDateTime>, conn: &PgConnection, ) -> QueryResult<Vec<FullMatchData>> { conn.transaction(|| { let matches = matches::table .filter(matches::is_public.eq(true)) + .filter(matches::created_at.nullable().lt(before)) + .filter(matches::created_at.nullable().gt(after)) .order_by(matches::created_at.desc()) .inner_join(match_players::table) .inner_join( diff --git a/planetwars-server/src/routes/matches.rs b/planetwars-server/src/routes/matches.rs index c1957d4..1b7581c 100644 --- a/planetwars-server/src/routes/matches.rs +++ b/planetwars-server/src/routes/matches.rs @@ -35,7 +35,6 @@ pub struct ApiMatchPlayer { pub struct ListRecentMatchesParams { count: Option<usize>, // TODO: should timezone be specified here? - // TODO: implement these before: Option<NaiveDateTime>, after: Option<NaiveDateTime>, @@ -58,9 +57,9 @@ pub async fn list_recent_matches( Some(bot_name) => { let bot = db::bots::find_bot_by_name(&bot_name, &conn) .map_err(|_| StatusCode::BAD_REQUEST)?; - matches::list_bot_matches(bot.id, count, &conn) + matches::list_bot_matches(bot.id, count, params.before, params.after, &conn) } - None => matches::list_public_matches(count, &conn), + None => matches::list_public_matches(count, params.before, params.after, &conn), }; matches |