This commit is contained in:
Julian
2021-12-12 14:01:35 +01:00
parent 03badebb10
commit 21cd277352
8 changed files with 68 additions and 34 deletions

5
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,5 @@
{
"rust-analyzer.diagnostics.disabled": [
"macro-error"
]
}

30
Cargo.lock generated
View File

@@ -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"

View File

@@ -1,5 +1,5 @@
[package]
name = "ChaotenRestApi"
name = "chaoten_rest_api"
version = "0.1.0"
edition = "2018"

View File

@@ -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<Mutex<Pool<Mssql>>>) -> 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")?

5
src/models/gerbil.rs Normal file
View File

@@ -0,0 +1,5 @@
#[derive(serde::Serialize, sqlx::FromRow)]
pub struct Gerbil
{
name: String
}

1
src/models/mod.rs Normal file
View File

@@ -0,0 +1 @@
pub mod gerbil;

1
src/routes/mod.rs Normal file
View File

@@ -0,0 +1 @@
pub mod renner;

36
src/routes/renner.rs Normal file
View File

@@ -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<String>,
}
#[get("/renner")]
async fn renner(data: web::Data<Mutex<Pool<Mssql>>>, params: Query<RennerQueryParam>) -> impl Responder {
let mut sql = String::from("SELECT name FROM renner");
let mut pairs = Vec::new();
match &params.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)
}