93 lines
2.4 KiB
Rust
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,
|
|
})
|
|
}
|
|
}
|