ddstats/src/database/models/teamrace.rs

93 lines
2.4 KiB
Rust

use chrono::NaiveDateTime;
use serde::{Deserialize, Serialize};
use crate::database::{models::search_result::ROWS_PER_PAGE, DatabaseHandler};
use super::search_result::SearchResult;
#[derive(Debug, Clone, sqlx::FromRow, Serialize, Deserialize)]
pub struct Teamrace {
pub players: Vec<String>,
pub map: String,
pub time: f32,
pub timestamp: NaiveDateTime,
}
impl Teamrace {
pub async fn get_teamrace_by_player(
db: &DatabaseHandler,
player: &str,
page: i32,
) -> Result<SearchResult<Teamrace>, sqlx::Error> {
let results = sqlx::query_as!(
Teamrace,
"
SELECT players, map, time, timestamp
FROM record_teamrace_array
WHERE $1 = ANY(players)
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_teamrace_array WHERE $1 = ANY(players)",
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_teamrace_by_map(
db: &DatabaseHandler,
map: &str,
page: i32,
) -> Result<SearchResult<Teamrace>, sqlx::Error> {
let results = sqlx::query_as!(
Teamrace,
"
SELECT players, map, time, timestamp
FROM record_teamrace_array
WHERE map = $1
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_teamrace_array 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,
})
}
}