ddstats/src/api/maps.rs

85 lines
2.3 KiB
Rust

use chrono::NaiveDateTime;
use rocket::{serde::json::Json, Route, State};
use crate::database::{models::map::Map, DatabaseHandler};
#[get("/")]
async fn get_all_maps(db: &State<DatabaseHandler>) -> Result<Json<Vec<Map>>, String> {
match Map::get_all_maps(db).await {
Ok(maps) => Ok(Json(maps)),
Err(err) => Err(format!("Error: {}", err)),
}
}
#[get("/by-name/<name>")]
async fn get_map_by_name(db: &State<DatabaseHandler>, name: &str) -> Result<Json<Map>, String> {
match Map::get_map_by_name(db, name).await {
Ok(maps) => Ok(Json(maps)),
Err(err) => Err(format!("Error: {}", err)),
}
}
#[get("/category/<category>")]
async fn get_maps_by_category(
db: &State<DatabaseHandler>,
category: &str,
) -> Result<Json<Vec<Map>>, String> {
match Map::get_maps_by_category(db, category).await {
Ok(maps) => Ok(Json(maps)),
Err(err) => Err(format!("Error: {}", err)),
}
}
#[get("/mapper/<mapper>")]
async fn get_maps_by_mapper(
db: &State<DatabaseHandler>,
mapper: &str,
) -> Result<Json<Vec<Map>>, String> {
match Map::get_maps_by_mapper(db, mapper).await {
Ok(maps) => Ok(Json(maps)),
Err(err) => Err(format!("Error: {}", err)),
}
}
#[get("/search?<map>&<mappers>&<category>&<stars>&<release_after>&<release_before>&<tiles>&<orderby>&<sort>")]
async fn search_maps<'a>(
db: &State<DatabaseHandler>,
map: Option<&str>,
mappers: Option<Vec<String>>,
category: Option<&str>,
stars: Option<Vec<i16>>,
release_after: Option<&str>,
release_before: Option<&str>,
tiles: Option<Vec<String>>,
orderby: Option<&str>,
sort: Option<&str>,
) -> Result<Json<Vec<Map>>, String> {
match Map::search_maps(
db,
map,
mappers,
category,
stars,
release_after.map(|x| NaiveDateTime::parse_from_str(x, "%Y-%m-%d").unwrap()),
release_before.map(|x| NaiveDateTime::parse_from_str(x, "%Y-%m-%d").unwrap()),
tiles,
orderby,
sort,
)
.await
{
Ok(maps) => Ok(Json(maps)),
Err(err) => Err(format!("Error: {}", err)),
}
}
pub fn get_all_routes() -> Vec<Route> {
routes![
get_all_maps,
get_map_by_name,
get_maps_by_category,
get_maps_by_mapper,
search_maps
]
}