ddstats/src/database/models/map.rs

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());
}
}