ddstats/src/database/models/race.rs

122 lines
3.3 KiB
Rust

use chrono::NaiveDateTime;
use serde::{Deserialize, Serialize};
use crate::database::DatabaseHandler;
use super::search_result::{SearchResult, ROWS_PER_PAGE};
#[derive(Debug, Clone, sqlx::FromRow, Serialize, Deserialize)]
pub struct Race {
pub name: String,
pub map: String,
pub time: f32,
pub timestamp: NaiveDateTime,
pub server: String,
pub checkpoints: Option<Vec<f64>>,
pub gameid: Option<String>,
pub ddnet7: i16,
}
impl Race {
pub async fn get_races_by_player(
db: &DatabaseHandler,
player: &str,
page: i32,
) -> Result<SearchResult<Race>, sqlx::Error> {
let results = sqlx::query_as!(
Race,
"
SELECT name,
map,
time,
timestamp,
server,
ARRAY[cp1, cp2, cp3, cp4, cp5,
cp6, cp7, cp8, cp9, cp10,
cp11, cp12, cp13, cp14, cp15,
cp16, cp17, cp18, cp19, cp20,
cp21, cp22, cp23, cp24, cp25
] AS checkpoints,
gameid,
ddnet7
FROM record_race WHERE name = $1
ORDER BY map, time
OFFSET (($2 - 1) * $3)
FETCH NEXT $3 ROWS ONLY
",
player,
page,
ROWS_PER_PAGE
)
.fetch_all(&db.pool)
.await?;
let total_pages = sqlx::query!(
"SELECT ceil(count(*) / $2) + 1 as total_pages FROM record_race WHERE name = $1",
player,
ROWS_PER_PAGE as i64
)
.fetch_one(&db.pool)
.await?
.total_pages
.map_or_else(|| 0, |as_i64| as_i64 as i32);
Ok(SearchResult {
results,
total_pages,
current_page: page,
})
}
pub async fn get_races_by_map(
db: &DatabaseHandler,
map: &str,
page: i32,
) -> Result<SearchResult<Race>, sqlx::Error> {
let results = sqlx::query_as!(
Race,
"
SELECT
name,
map,
time,
timestamp,
server,
ARRAY[cp1, cp2, cp3, cp4, cp5,
cp6, cp7, cp8, cp9, cp10,
cp11, cp12, cp13, cp14, cp15,
cp16, cp17, cp18, cp19, cp20,
cp21, cp22, cp23, cp24, cp25
] AS checkpoints,
gameid,
ddnet7
FROM record_race WHERE map = $1
ORDER BY name, time
OFFSET (($2 - 1) * $3)
FETCH NEXT $3 ROWS ONLY
",
map,
page,
ROWS_PER_PAGE
)
.fetch_all(&db.pool)
.await?;
let total_pages = sqlx::query!(
"SELECT ceil(count(*) / $2) + 1 as total_pages FROM record_race WHERE map = $1",
map,
ROWS_PER_PAGE as i64
)
.fetch_one(&db.pool)
.await?
.total_pages
.map_or_else(|| 0, |as_i64| as_i64 as i32);
Ok(SearchResult {
results,
total_pages,
current_page: page,
})
}
}