From 6950ac62e8fa325b5a94a04526edaa515763d38b Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Fri, 30 May 2025 22:26:18 +0200 Subject: [PATCH] Autogenerate only the models of the API for the backend-server --- backend-actix/.gitignore | 2 + backend-actix/Cargo.lock | 276 +-------------------- backend-actix/Cargo.toml | 1 - backend-actix/build.rs | 24 ++ backend-actix/gamenight-api.yaml | 22 +- backend-actix/src/main.rs | 6 +- backend-actix/src/request/error.rs | 10 +- backend-actix/src/request/mod.rs | 4 +- backend-actix/src/request/user_handlers.rs | 39 ++- 9 files changed, 95 insertions(+), 289 deletions(-) create mode 100644 backend-actix/build.rs diff --git a/backend-actix/.gitignore b/backend-actix/.gitignore index eb5a316..d169e8f 100644 --- a/backend-actix/.gitignore +++ b/backend-actix/.gitignore @@ -1 +1,3 @@ target +src/models/ +docs/ diff --git a/backend-actix/Cargo.lock b/backend-actix/Cargo.lock index f9752fa..c5b1c1f 100644 --- a/backend-actix/Cargo.lock +++ b/backend-actix/Cargo.lock @@ -55,7 +55,7 @@ dependencies = [ "foldhash", "futures-core", "h2", - "http 0.2.12", + "http", "httparse", "httpdate", "itoa", @@ -91,7 +91,7 @@ checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" dependencies = [ "bytestring", "cfg-if", - "http 0.2.12", + "http", "regex", "regex-lite", "serde", @@ -330,7 +330,6 @@ dependencies = [ "actix-web", "chrono", "env_logger", - "gamenight-api-client-rs", "gamenight-database", "jsonwebtoken", "rand_core 0.9.3", @@ -760,15 +759,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", -] - [[package]] name = "futures-core" version = "0.3.31" @@ -800,17 +790,6 @@ dependencies = [ "slab", ] -[[package]] -name = "gamenight-api-client-rs" -version = "0.1.0" -dependencies = [ - "reqwest", - "serde", - "serde_json", - "serde_repr", - "url", -] - [[package]] name = "gamenight-database" version = "0.1.0" @@ -877,7 +856,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http 0.2.12", + "http", "indexmap", "slab", "tokio", @@ -914,40 +893,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http 1.3.1", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http 1.3.1", - "http-body", - "pin-project-lite", -] - [[package]] name = "httparse" version = "1.10.1" @@ -960,49 +905,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.3.1", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-util" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" -dependencies = [ - "base64", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http 1.3.1", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - [[package]] name = "iana-time-zone" version = "0.1.63" @@ -1156,22 +1058,6 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -1327,16 +1213,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - [[package]] name = "miniz_oxide" version = "0.8.8" @@ -1695,43 +1571,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "reqwest" -version = "0.12.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" -dependencies = [ - "base64", - "bytes", - "futures-core", - "futures-util", - "http 1.3.1", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - [[package]] name = "ring" version = "0.17.14" @@ -1811,17 +1650,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_repr" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "serde_spanned" version = "0.6.8" @@ -1935,15 +1763,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - [[package]] name = "synstructure" version = "0.13.2" @@ -2087,51 +1906,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdb0c213ca27a9f57ab69ddb290fd80d970922355b83ae380b395d3986b8a2e" -dependencies = [ - "bitflags", - "bytes", - "futures-util", - "http 1.3.1", - "http-body", - "iri-string", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - [[package]] name = "tracing" version = "0.1.41" @@ -2177,24 +1951,12 @@ dependencies = [ "once_cell", ] -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - [[package]] name = "typenum" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" -[[package]] -name = "unicase" -version = "2.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" - [[package]] name = "unicode-ident" version = "1.0.18" @@ -2290,15 +2052,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -2340,19 +2093,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.100" @@ -2385,16 +2125,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "windows-core" version = "0.61.2" diff --git a/backend-actix/Cargo.toml b/backend-actix/Cargo.toml index af0e539..c5101d2 100644 --- a/backend-actix/Cargo.toml +++ b/backend-actix/Cargo.toml @@ -6,7 +6,6 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -gamenight-api-client-rs = { path = "../gamenight-api-client-rs" } gamenight-database = { path = "../gamenight-database"} actix-web = "4" actix-cors = "0.7" diff --git a/backend-actix/build.rs b/backend-actix/build.rs new file mode 100644 index 0000000..691aa7b --- /dev/null +++ b/backend-actix/build.rs @@ -0,0 +1,24 @@ +use std::{fs::{self, File}, io::Write, process::Command}; + + +fn main() { + let _ = + Command::new("openapi-generator") + .args(["generate", "-i", "gamenight-api.yaml", "-g", "rust", "--global-property", "models"]) + .output() + .expect("Failed to generate models sources for the gamenight API"); + + let mut file = File::create("src/models/mod.rs").unwrap(); + let paths = fs::read_dir("./src/models").unwrap(); + for path in paths { + let path = path.unwrap(); + let path = path.path(); + let stem = path.file_stem().unwrap(); + if stem == "mod" { + continue + } + + let line = format!("pub mod {};\n", stem.to_str().unwrap()); + file.write(line.as_bytes()).unwrap(); + } +} \ No newline at end of file diff --git a/backend-actix/gamenight-api.yaml b/backend-actix/gamenight-api.yaml index acbe07f..1eb88ef 100644 --- a/backend-actix/gamenight-api.yaml +++ b/backend-actix/gamenight-api.yaml @@ -87,8 +87,6 @@ components: schemas: Gamenight: title: Gamenight - x-stoplight: - id: 0nmru75ph5wh3 type: object properties: id: @@ -113,8 +111,6 @@ components: description: '' Token: title: Token - x-stoplight: - id: 8pz19kigm1jer type: object properties: jwt_token: @@ -152,19 +148,23 @@ components: - registration_token AddGamenightRequestBody: title: AddGamenightRequestBody - x-stoplight: - id: xw4z5jyym8q7r type: object properties: name: type: string - x-stoplight: - id: s5ny76cy54nty datetime: type: string - x-stoplight: - id: dh6vyvulj4xze - x-internal: false + User: + type: object + properties: + id: + type: string + username: + type: string + email: + type: string + required: + - username requestBodies: LoginRequest: content: diff --git a/backend-actix/src/main.rs b/backend-actix/src/main.rs index e45e8ca..335e527 100644 --- a/backend-actix/src/main.rs +++ b/backend-actix/src/main.rs @@ -1,3 +1,5 @@ +#[allow(unused_imports)] +pub mod models; pub mod request; use actix_cors::Cors; @@ -6,7 +8,7 @@ use actix_web::HttpServer; use actix_web::App; use actix_web::http; use actix_web::web; -use request::{login, register, gamenights, gamenight_post, gamenight_get}; +use request::{*, login, register, gamenights}; use tracing_actix_web::TracingLogger; use gamenight_database::*; @@ -40,6 +42,8 @@ async fn main() -> std::io::Result<()> { .service(gamenights) .service(gamenight_post) .service(gamenight_get) + .service(get_user) + .service(get_user_unauthenticated) }) .bind(("::1", 8080))? .run() diff --git a/backend-actix/src/request/error.rs b/backend-actix/src/request/error.rs index 97691ea..1e2e829 100644 --- a/backend-actix/src/request/error.rs +++ b/backend-actix/src/request/error.rs @@ -13,7 +13,6 @@ pub struct ApiError { } impl Display for ApiError { - // This trait requires `fmt` with this exact signature. fn fmt(&self, f: &mut Formatter) -> Result { write!(f, "{}", self.message) } @@ -81,3 +80,12 @@ impl From for ApiError { } } } + +impl From for ApiError { + fn from(value: uuid::Error) -> Self { + ApiError { + status: 422, + message: value.to_string() + } + } +} diff --git a/backend-actix/src/request/mod.rs b/backend-actix/src/request/mod.rs index aae57e3..9b1fb3c 100644 --- a/backend-actix/src/request/mod.rs +++ b/backend-actix/src/request/mod.rs @@ -10,4 +10,6 @@ pub use user_handlers::login; pub use user_handlers::register; pub use gamenight_handlers::gamenights; pub use gamenight_handlers::gamenight_post; -pub use gamenight_handlers::gamenight_get; \ No newline at end of file +pub use gamenight_handlers::gamenight_get; +pub use user_handlers::get_user; +pub use user_handlers::get_user_unauthenticated; \ No newline at end of file diff --git a/backend-actix/src/request/user_handlers.rs b/backend-actix/src/request/user_handlers.rs index 5257adb..04f3230 100644 --- a/backend-actix/src/request/user_handlers.rs +++ b/backend-actix/src/request/user_handlers.rs @@ -1,7 +1,10 @@ use actix_web::http::header::ContentType; -use actix_web::{web, get, post, HttpResponse, Responder}; +use actix_web::{get, post, web, HttpResponse, Responder}; +use serde::Deserialize; +use uuid::Uuid; use validator::ValidateArgs; +use crate::models::user::User; use crate::request::requests::{Login, Register, RegisterContext}; use crate::request::error::ApiError; use crate::request::responses::LoginResponse; @@ -9,6 +12,8 @@ use crate::request::authorization::get_token; use serde_json; use gamenight_database::{DbPool, GetConnection}; +use super::authorization::AuthUser; + impl From for gamenight_database::user::LoginUser { fn from(val: Login) -> Self { gamenight_database::user::LoginUser { @@ -63,4 +68,36 @@ pub async fn register(pool: web::Data, register_data: web::Json for User { + fn from(value: gamenight_database::user::User) -> Self { + Self { + id: Some(value.id.to_string()), + username: value.username, + email: None, + + } + } +} + +#[get("/user/{user_id}")] +pub async fn get_user(pool: web::Data, _user: AuthUser, path: web::Path) -> Result { + let mut conn = pool.get_conn(); + + let user = gamenight_database::user::get_user(&mut conn, Uuid::parse_str(&path.uuid)?)?; + Ok(HttpResponse::Ok() + .content_type(ContentType::json()) + .body(serde_json::to_string(&user)?)) +} + +#[get("/user/{user_id}")] +pub async fn get_user_unauthenticated(_path: web::Path) -> Result { + Ok(HttpResponse::Forbidden()) +} + +