ddstats/src/main.rs

104 lines
2.4 KiB
Rust

#[macro_use]
extern crate rocket;
use database::create_pool;
use rocket::serde::json::Json;
use rocket::State;
extern crate dotenv;
use dotenv::dotenv;
mod database;
use database::{map::Map, race::Race, DatabasePoolStore};
#[get("/maps")]
fn get_all_maps(db_pool: &State<DatabasePoolStore>) -> Option<Json<Vec<Map>>> {
match database::get_maps(&db_pool.0) {
Ok(maps) => Some(Json(maps)),
Err(err) => {
println!("{err}");
None
}
}
}
#[get("/maps/<map>")]
fn get_map_by_name(db_pool: &State<DatabasePoolStore>, map: &str) -> Option<Json<Map>> {
match database::get_map_by_name(&db_pool.0, map) {
Ok(map) => map.map(Json),
Err(err) => {
println!("{err}");
None
}
}
}
#[get("/races/by-player/<player>")]
fn get_races_by_player(
db_pool: &State<DatabasePoolStore>,
player: &str,
) -> Option<Json<Vec<Race>>> {
match database::get_races_by_player(&db_pool.0, player) {
Ok(races) => Some(Json(races)),
Err(err) => {
println!("{err}");
None
}
}
}
#[get("/races/by-id/<id>")]
fn get_races_by_id(db_pool: &State<DatabasePoolStore>, id: &str) -> Option<Json<Vec<Race>>> {
match database::get_races_by_id(&db_pool.0, id) {
Ok(races) => Some(Json(races)),
Err(err) => {
println!("{err}");
None
}
}
}
#[get("/races/by-map/<map>")]
fn get_races_by_map(db_pool: &State<DatabasePoolStore>, map: &str) -> Option<Json<Vec<Race>>> {
match database::get_races_by_map(&db_pool.0, map) {
Ok(races) => Some(Json(races)),
Err(err) => {
println!("{err}");
None
}
}
}
#[get("/player/<player>/playtime")]
fn get_player_playtime(
db_pool: &State<DatabasePoolStore>,
player: &str,
) -> Option<Json<(Option<f64>, Option<i32>)>> {
match database::get_player_total_playtime(&db_pool.0, player) {
Ok(playtime) => Some(Json(playtime)),
Err(err) => {
println!("{err}");
None
}
}
}
#[launch]
fn rocket() -> _ {
dotenv().ok();
let db_pool = create_pool();
rocket::build().manage(DatabasePoolStore(db_pool)).mount(
"/",
routes![
get_all_maps,
get_map_by_name,
get_races_by_player,
get_races_by_id,
get_races_by_map,
get_player_playtime
],
)
}