diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9f01ac6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "rust-analyzer.diagnostics.disabled": [ + "macro-error" + ] +} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 38f98f3..91d73e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,21 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "ChaotenRestApi" -version = "0.1.0" -dependencies = [ - "actix-web", - "anyhow", - "dotenv", - "env_logger", - "futures", - "log", - "serde", - "serde_json", - "sqlx", -] - [[package]] name = "actix-codec" version = "0.4.1" @@ -347,6 +332,21 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chaoten_rest_api" +version = "0.1.0" +dependencies = [ + "actix-web", + "anyhow", + "dotenv", + "env_logger", + "futures", + "log", + "serde", + "serde_json", + "sqlx", +] + [[package]] name = "const_fn" version = "0.4.8" diff --git a/Cargo.toml b/Cargo.toml index ecf4520..2f543aa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "ChaotenRestApi" +name = "chaoten_rest_api" version = "0.1.0" edition = "2018" diff --git a/src/main.rs b/src/main.rs index 37dd95e..b5dacc0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,29 +1,15 @@ use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder}; -use sqlx::{MssqlPool, Row, Pool, Mssql}; +use sqlx::{MssqlPool}; use std::sync::Mutex; -use serde::Serialize; -#[derive(Serialize, sqlx::FromRow)] -struct Gerbil -{ - name: String -} +mod models; +mod routes; #[get("/")] async fn hello() -> impl Responder { HttpResponse::Ok().body("Hello world!") } -#[get("/renner")] -async fn renner(data: web::Data>>) -> impl Responder { - let data = data.lock().unwrap(); - let rows = sqlx::query_as::<_,Gerbil>("SELECT name FROM renner") - .fetch_all(&(*data)) - .await - .expect("no connection to database"); - HttpResponse::Ok().json(rows) -} - #[post("/echo")] async fn echo(req_body: String) -> impl Responder { HttpResponse::Ok().body(req_body) @@ -42,7 +28,7 @@ async fn main() -> std::io::Result<()> { .app_data(data.clone()) .service(hello) .service(echo) - .service(renner) + .service(routes::renner::renner) .route("/hey", web::get().to(manual_hello)) }) .bind("127.0.0.1:8080")? diff --git a/src/models/gerbil.rs b/src/models/gerbil.rs new file mode 100644 index 0000000..976a703 --- /dev/null +++ b/src/models/gerbil.rs @@ -0,0 +1,5 @@ +#[derive(serde::Serialize, sqlx::FromRow)] +pub struct Gerbil +{ + name: String +} \ No newline at end of file diff --git a/src/models/mod.rs b/src/models/mod.rs new file mode 100644 index 0000000..dab7b59 --- /dev/null +++ b/src/models/mod.rs @@ -0,0 +1 @@ +pub mod gerbil; \ No newline at end of file diff --git a/src/routes/mod.rs b/src/routes/mod.rs new file mode 100644 index 0000000..d0a95a7 --- /dev/null +++ b/src/routes/mod.rs @@ -0,0 +1 @@ +pub mod renner; \ No newline at end of file diff --git a/src/routes/renner.rs b/src/routes/renner.rs new file mode 100644 index 0000000..7194075 --- /dev/null +++ b/src/routes/renner.rs @@ -0,0 +1,36 @@ +use actix_web::{get, web, web::Query, HttpResponse, Responder}; +use sqlx::{Pool, Mssql}; +use std::sync::Mutex; +use serde::{Deserialize}; + +use crate::models::gerbil::Gerbil; + +#[derive(Deserialize)] +struct RennerQueryParam { + name: Option, +} + + +#[get("/renner")] +async fn renner(data: web::Data>>, params: Query) -> impl Responder { + let mut sql = String::from("SELECT name FROM renner"); + + let mut pairs = Vec::new(); + match ¶ms.name + { + Some(val) => pairs.push(format!("name='{0}'", val)), + None => () + } + if pairs.len() != 0 + { + let ret = pairs.iter().skip(1).fold(String::from(&pairs[0]), |sum, x| {format!("{0} AND {1}", sum, x)}); + sql.push_str(&format!(" WHERE {}",ret)); + } + println!("{}",sql); + let data = data.lock().unwrap(); + let rows = sqlx::query_as::<_,Gerbil>(&sql) + .fetch_all(&(*data)) + .await + .expect("no connection to database"); + HttpResponse::Ok().json(rows) +} \ No newline at end of file