From 40e8974d6b3d10331598b615995a2a7598c51e2f Mon Sep 17 00:00:00 2001 From: BurnyLlama Date: Sun, 6 Nov 2022 01:11:43 +0100 Subject: [PATCH] I WANNA DIE! --- .gitignore | 3 +++ Cargo.toml | 4 +++- src/database/mod.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 45 ++++++++++++++++++++++++++++++--------------- src/types/mod.rs | 6 +++++- 5 files changed, 85 insertions(+), 17 deletions(-) create mode 100644 src/database/mod.rs diff --git a/.gitignore b/.gitignore index 193d30e..193dc5e 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,6 @@ Cargo.lock # Added by cargo /target + +data/*.sqlite +.env \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index f9d374e..f0fe156 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,4 +6,6 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rocket = "0.5.0-rc.2" \ No newline at end of file +rocket = { version = "0.5.0-rc.2", features = ["json"] } +mysql = "22.2.0" +dotenv = "0.15.0" \ No newline at end of file diff --git a/src/database/mod.rs b/src/database/mod.rs new file mode 100644 index 0000000..25203fa --- /dev/null +++ b/src/database/mod.rs @@ -0,0 +1,44 @@ +use std::env; +use std::result::Result; +use std::error::Error; +use mysql::*; +use mysql::prelude::*; +use crate::types; + +pub fn get_maps() -> Result, Box> { + let mut conn = create_pool()?.get_conn()?; + + let maps = conn.query_map( + "SELECT * FROM record_maps", + |(name, server, points, stars, mapper, timestamp)| types::Map { + name, server, points, stars, mapper, timestamp + } + )?; + + Ok(maps) +} + +pub fn get_map_by_name(name: &str) -> Result, Box> { + let mut conn = create_pool()?.get_conn()?; + let stmt = conn.prep("SELECT * FROM record_maps WHERE Map = ?")?; + + let map = conn.exec_first( + &stmt, + (name,) + )?; + + Ok(match map { + Some((name, server, points, stars, mapper, timestamp)) => Some(types::Map { + name, server, points, stars, mapper, timestamp + }), + None => None + }) +} + + + +pub fn create_pool() -> Result> { + let url = env::var("DB_URI")?; + let pool = Pool::new(url.as_str())?; + Ok(pool) +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index da5b5c8..1c05bed 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,26 +1,41 @@ #[macro_use] extern crate rocket; +use rocket::serde::json::Json; + +extern crate dotenv; +use dotenv::dotenv; mod types; +mod database; -#[get("/")] -fn index() -> &'static str { - "Hello, world!" +#[get("/maps")] +fn get_all_maps() -> Option>> { + match database::get_maps() { + Ok(maps) => Some(Json(maps)), + Err(err) => { + println!("{err}"); + None + } + } } -#[get("/map")] -fn map() -> String { - let map = types::Map { - name: "Test".into(), - server: "USA".into(), - points: 5, - stars: 3, - mapper: "Furo".into() - }; - - format!("Map {} by {}", map.name, map.mapper) +#[get("/maps/")] +fn get_map_by_name(map: &str) -> Option> { + match database::get_map_by_name(map) { + Ok(map) => match map { + Some(map) => Some(Json(map)), + None => None + }, + Err(err) => { + println!("{err}"); + None + } + } } + #[launch] fn rocket() -> _ { - rocket::build().mount("/", routes![index, map]) + dotenv().ok(); + rocket::build() + .mount("/", routes![get_all_maps, get_map_by_name]) } \ No newline at end of file diff --git a/src/types/mod.rs b/src/types/mod.rs index a0d3f2a..a05abae 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -1,8 +1,12 @@ -#[derive(Debug)] +use rocket::serde::{Serialize, Deserialize}; + +#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(crate = "rocket::serde")] pub struct Map { pub name: String, pub server: String, pub points: i8, pub stars: i8, pub mapper: String, + pub timestamp: String, } \ No newline at end of file