list matches for a specific bot
This commit is contained in:
parent
3c2f4977e4
commit
3113f762d8
2 changed files with 47 additions and 3 deletions
|
@ -142,6 +142,36 @@ pub fn list_public_matches(amount: i64, conn: &PgConnection) -> QueryResult<Vec<
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn list_bot_matches(
|
||||||
|
bot_id: i32,
|
||||||
|
amount: i64,
|
||||||
|
conn: &PgConnection,
|
||||||
|
) -> QueryResult<Vec<FullMatchData>> {
|
||||||
|
conn.transaction(|| {
|
||||||
|
let matches = matches::table
|
||||||
|
.filter(matches::is_public.eq(true))
|
||||||
|
.order_by(matches::created_at.desc())
|
||||||
|
.inner_join(match_players::table)
|
||||||
|
.inner_join(
|
||||||
|
bot_versions::table
|
||||||
|
.on(match_players::bot_version_id.eq(bot_versions::id.nullable())),
|
||||||
|
)
|
||||||
|
.filter(bot_versions::bot_id.eq(bot_id))
|
||||||
|
.limit(amount)
|
||||||
|
.select((
|
||||||
|
matches::id,
|
||||||
|
matches::state,
|
||||||
|
matches::log_path,
|
||||||
|
matches::created_at,
|
||||||
|
matches::winner,
|
||||||
|
matches::is_public,
|
||||||
|
))
|
||||||
|
.get_results::<MatchBase>(conn)?;
|
||||||
|
|
||||||
|
fetch_full_match_data(matches, conn)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: maybe unify this with matchdata?
|
// TODO: maybe unify this with matchdata?
|
||||||
pub struct FullMatchData {
|
pub struct FullMatchData {
|
||||||
pub base: MatchBase,
|
pub base: MatchBase,
|
||||||
|
|
|
@ -8,7 +8,10 @@ use serde::{Deserialize, Serialize};
|
||||||
use std::{path::PathBuf, sync::Arc};
|
use std::{path::PathBuf, sync::Arc};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
db::matches::{self, MatchState},
|
db::{
|
||||||
|
self,
|
||||||
|
matches::{self, MatchState},
|
||||||
|
},
|
||||||
DatabaseConnection, GlobalConfig,
|
DatabaseConnection, GlobalConfig,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -35,6 +38,8 @@ pub struct ListRecentMatchesParams {
|
||||||
// TODO: implement these
|
// TODO: implement these
|
||||||
before: Option<NaiveDateTime>,
|
before: Option<NaiveDateTime>,
|
||||||
after: Option<NaiveDateTime>,
|
after: Option<NaiveDateTime>,
|
||||||
|
|
||||||
|
bot: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
const MAX_NUM_RETURNED_MATCHES: usize = 100;
|
const MAX_NUM_RETURNED_MATCHES: usize = 100;
|
||||||
|
@ -47,9 +52,18 @@ pub async fn list_recent_matches(
|
||||||
let count = std::cmp::min(
|
let count = std::cmp::min(
|
||||||
params.count.unwrap_or(DEFAULT_NUM_RETURNED_MATCHES),
|
params.count.unwrap_or(DEFAULT_NUM_RETURNED_MATCHES),
|
||||||
MAX_NUM_RETURNED_MATCHES,
|
MAX_NUM_RETURNED_MATCHES,
|
||||||
);
|
) as i64;
|
||||||
|
|
||||||
matches::list_public_matches(count as i64, &conn)
|
let matches = match params.bot {
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
None => matches::list_public_matches(count, &conn),
|
||||||
|
};
|
||||||
|
|
||||||
|
matches
|
||||||
.map_err(|_| StatusCode::BAD_REQUEST)
|
.map_err(|_| StatusCode::BAD_REQUEST)
|
||||||
.map(|matches| Json(matches.into_iter().map(match_data_to_api).collect()))
|
.map(|matches| Json(matches.into_iter().map(match_data_to_api).collect()))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue