return pagination object from list matches API
This commit is contained in:
parent
a1c7866f87
commit
03ca884c40
1 changed files with 30 additions and 7 deletions
|
@ -44,16 +44,25 @@ pub struct ListRecentMatchesParams {
|
||||||
const MAX_NUM_RETURNED_MATCHES: usize = 100;
|
const MAX_NUM_RETURNED_MATCHES: usize = 100;
|
||||||
const DEFAULT_NUM_RETURNED_MATCHES: usize = 50;
|
const DEFAULT_NUM_RETURNED_MATCHES: usize = 50;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub struct ListMatchesResponse {
|
||||||
|
matches: Vec<ApiMatch>,
|
||||||
|
has_next: bool,
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn list_recent_matches(
|
pub async fn list_recent_matches(
|
||||||
Query(params): Query<ListRecentMatchesParams>,
|
Query(params): Query<ListRecentMatchesParams>,
|
||||||
conn: DatabaseConnection,
|
conn: DatabaseConnection,
|
||||||
) -> Result<Json<Vec<ApiMatch>>, StatusCode> {
|
) -> Result<Json<ListMatchesResponse>, StatusCode> {
|
||||||
let count = std::cmp::min(
|
let requested_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;
|
);
|
||||||
|
|
||||||
let matches = match params.bot {
|
// fetch one additional record to check whether a next page exists
|
||||||
|
let count = (requested_count + 1) as i64;
|
||||||
|
|
||||||
|
let matches_result = match params.bot {
|
||||||
Some(bot_name) => {
|
Some(bot_name) => {
|
||||||
let bot = db::bots::find_bot_by_name(&bot_name, &conn)
|
let bot = db::bots::find_bot_by_name(&bot_name, &conn)
|
||||||
.map_err(|_| StatusCode::BAD_REQUEST)?;
|
.map_err(|_| StatusCode::BAD_REQUEST)?;
|
||||||
|
@ -62,9 +71,23 @@ pub async fn list_recent_matches(
|
||||||
None => matches::list_public_matches(count, params.before, params.after, &conn),
|
None => matches::list_public_matches(count, params.before, params.after, &conn),
|
||||||
};
|
};
|
||||||
|
|
||||||
matches
|
let mut matches = matches_result.map_err(|_| StatusCode::BAD_REQUEST)?;
|
||||||
.map_err(|_| StatusCode::BAD_REQUEST)
|
|
||||||
.map(|matches| Json(matches.into_iter().map(match_data_to_api).collect()))
|
let mut has_next = false;
|
||||||
|
if matches.len() > requested_count {
|
||||||
|
has_next = true;
|
||||||
|
matches.truncate(requested_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
let api_matches = matches
|
||||||
|
.into_iter()
|
||||||
|
.map(match_data_to_api)
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
Ok(Json(ListMatchesResponse {
|
||||||
|
matches: api_matches,
|
||||||
|
has_next,
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn match_data_to_api(data: matches::FullMatchData) -> ApiMatch {
|
pub fn match_data_to_api(data: matches::FullMatchData) -> ApiMatch {
|
||||||
|
|
Loading…
Reference in a new issue