128 lines
3.6 KiB
Rust
128 lines
3.6 KiB
Rust
use chrono::NaiveDateTime;
|
|
use rocket::futures::StreamExt;
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
use crate::database::DatabaseHandler;
|
|
|
|
#[derive(Debug, Clone, sqlx::FromRow, Serialize, Deserialize)]
|
|
pub struct Map {
|
|
pub map: String,
|
|
pub mappers: Vec<String>,
|
|
pub category: String,
|
|
pub points: i16,
|
|
pub stars: i16,
|
|
pub release: Option<NaiveDateTime>,
|
|
pub width: Option<i16>,
|
|
pub height: Option<i16>,
|
|
pub tiles: Option<Vec<String>>,
|
|
}
|
|
|
|
impl Map {
|
|
pub async fn get_all_maps(db: &DatabaseHandler) -> Result<Vec<Map>, sqlx::Error> {
|
|
sqlx::query_as!(
|
|
Map,
|
|
"
|
|
SELECT record_maps.map, category, points, stars, mappers, release, width, height, tiles
|
|
FROM record_maps
|
|
JOIN record_mapinfo_array ON record_maps.map = record_mapinfo_array.map;
|
|
"
|
|
)
|
|
.fetch_all(&db.pool)
|
|
.await
|
|
}
|
|
|
|
pub async fn get_map_by_name(db: &DatabaseHandler, map: &str) -> Result<Map, sqlx::Error> {
|
|
sqlx::query_as!(
|
|
Map,
|
|
"
|
|
SELECT record_maps.map, category, points, stars, mappers, release, width, height, tiles
|
|
FROM record_maps
|
|
JOIN record_mapinfo_array ON record_maps.map = record_mapinfo_array.map
|
|
WHERE record_maps.map = $1;
|
|
",
|
|
map
|
|
)
|
|
.fetch_one(&db.pool)
|
|
.await
|
|
}
|
|
|
|
pub async fn get_maps_by_category(
|
|
db: &DatabaseHandler,
|
|
category: &str,
|
|
) -> Result<Vec<Map>, sqlx::Error> {
|
|
sqlx::query_as!(
|
|
Map,
|
|
"
|
|
SELECT record_maps.map, category, points, stars, mappers, release, width, height, tiles
|
|
FROM record_maps
|
|
JOIN record_mapinfo_array ON record_maps.map = record_mapinfo_array.map
|
|
WHERE category = $1;
|
|
",
|
|
category
|
|
)
|
|
.fetch_all(&db.pool)
|
|
.await
|
|
}
|
|
|
|
pub async fn get_maps_by_mapper(
|
|
db: &DatabaseHandler,
|
|
mapper: &str,
|
|
) -> Result<Vec<Map>, sqlx::Error> {
|
|
sqlx::query_as!(
|
|
Map,
|
|
"
|
|
SELECT record_maps.map, category, points, stars, mappers, release, width, height, tiles
|
|
FROM record_maps
|
|
JOIN record_mapinfo_array ON record_maps.map = record_mapinfo_array.map
|
|
WHERE $1 = ANY(mappers)
|
|
",
|
|
mapper
|
|
)
|
|
.fetch_all(&db.pool)
|
|
.await
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_get_all_maps() {
|
|
async fn test() {
|
|
let db = match DatabaseHandler::create().await {
|
|
Ok(db) => db,
|
|
Err(err) => panic!("Error while connecting to database! {:?}", err),
|
|
};
|
|
let maps = match Map::get_all_maps(&db).await {
|
|
Ok(maps) => maps,
|
|
Err(err) => panic!("Error while getting all maps! {:?}", err),
|
|
};
|
|
|
|
for map in maps {
|
|
println!("{:?}", map);
|
|
}
|
|
}
|
|
|
|
tokio_test::block_on(test());
|
|
}
|
|
|
|
#[test]
|
|
fn test_get_map_by_name() {
|
|
async fn test() {
|
|
let db = match DatabaseHandler::create().await {
|
|
Ok(db) => db,
|
|
Err(err) => panic!("Error while connecting to database! {:?}", err),
|
|
};
|
|
let map = match Map::get_map_by_name(&db, "Kobra").await {
|
|
Ok(map) => map,
|
|
Err(err) => panic!("Error while getting all maps! {:?}", err),
|
|
};
|
|
|
|
println!("{:?}", map);
|
|
}
|
|
|
|
tokio_test::block_on(test());
|
|
}
|
|
}
|