diff --git a/Cargo.lock b/Cargo.lock index 0c605cd..dbfa9e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,12 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.5.0" @@ -92,12 +98,53 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bcrypt" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abaf6da45c74385272ddf00e1ac074c7d8a6c1a1dda376902bd6a427522a8b2c" +dependencies = [ + "base64", + "blowfish", + "getrandom", + "subtle", + "zeroize", +] + [[package]] name = "bitflags" version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" +[[package]] +name = "blowfish" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7" +dependencies = [ + "byteorder", + "cipher", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" version = "1.10.1" @@ -110,6 +157,58 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + [[package]] name = "fnv" version = "1.0.7" @@ -117,10 +216,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "form_urlencoded" -version = "1.2.1" +name = "foldhash" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -158,17 +263,70 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + [[package]] name = "gimli" version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + [[package]] name = "hotel-api-rs" version = "0.1.0" dependencies = [ "axum", + "bcrypt", + "dashmap", + "r2d2", + "r2d2_sqlite", + "rusqlite", + "serde", + "serde_json", "tokio", ] @@ -220,19 +378,21 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "http", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", ] @@ -253,6 +413,15 @@ dependencies = [ "tower-service", ] +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + [[package]] name = "io-uring" version = "0.7.9" @@ -270,12 +439,32 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "libc" version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +[[package]] +name = "libsqlite3-sys" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" +dependencies = [ + "pkg-config", + "vcpkg", +] + [[package]] name = "lock_api" version = "0.4.13" @@ -326,7 +515,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys", ] @@ -370,9 +559,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project-lite" @@ -386,6 +575,21 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + [[package]] name = "proc-macro2" version = "1.0.101" @@ -404,6 +608,63 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r2d2" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" +dependencies = [ + "log", + "parking_lot", + "scheduled-thread-pool", +] + +[[package]] +name = "r2d2_sqlite" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63417e83dc891797eea3ad379f52a5986da4bca0d6ef28baf4d14034dd111b0c" +dependencies = [ + "r2d2", + "rusqlite", + "uuid", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom", +] + [[package]] name = "redox_syscall" version = "0.5.17" @@ -413,6 +674,20 @@ dependencies = [ "bitflags", ] +[[package]] +name = "rusqlite" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" +dependencies = [ + "bitflags", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + [[package]] name = "rustc-demangle" version = "0.1.26" @@ -431,6 +706,15 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "scheduled-thread-pool" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" +dependencies = [ + "parking_lot", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -522,6 +806,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "2.0.106" @@ -618,18 +908,115 @@ dependencies = [ "once_cell", ] +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + [[package]] name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "uuid" +version = "1.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +dependencies = [ + "getrandom", + "js-sys", + "rand", + "wasm-bindgen", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + [[package]] name = "windows-sys" version = "0.59.0" @@ -702,3 +1089,38 @@ name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "zerocopy" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/Cargo.toml b/Cargo.toml index 6d3c70d..905fb58 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,5 +5,17 @@ edition = "2024" publish = false [dependencies] -axum = "0.8.0" -tokio = { version = "1", features = ["full"] } \ No newline at end of file +axum = "0.8.4" +tokio = { version = "1", features = ["full"] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" + +bcrypt = "0.17" + +r2d2 = "0.8" +r2d2_sqlite = "0.31.0" +dashmap = "6.1" +rusqlite = "0.37.0" + + + diff --git a/db/1.sqlite b/db/1.sqlite new file mode 100644 index 0000000..919dd66 Binary files /dev/null and b/db/1.sqlite differ diff --git a/db/hotel.sqlite b/db/hotel.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/src/dto/rooms.rs b/src/dto/rooms.rs new file mode 100644 index 0000000..3e49310 --- /dev/null +++ b/src/dto/rooms.rs @@ -0,0 +1,13 @@ +use serde::Deserialize; + +#[derive(Debug, Deserialize)] +pub struct UpdateRoomStatusDto{ + pub room_number: i32, + pub status: string, +} + +#[derive(Debug, Seserialize)] +pub struct RoomStatusIdDto{ + pub room_number: i32, + pub status: string, +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..2449eab --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,6 @@ +#[allow(unused_imports)] +#[allow(dead_code)] + +pub mod utils; +pub mod routes; +pub mod rooms; diff --git a/src/main.rs b/src/main.rs index 4387bc9..78a4362 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,24 +1,23 @@ -use axum::{ - //response::Html, - routing::get, //post, - Router -}; +use axum::serve; +use tokio::net::TcpListener; +mod utils; mod routes; +mod rooms; + +use crate::utils::db_pool::HotelPools; +use routes::create_router; + + + #[tokio::main] -async fn main() { - - let app : Router = routes::create_routes(); - - - - let listener = tokio::net::TcpListener::bind("127.0.0.1:3000") - .await - .unwrap(); - println!("listining on {}", listener.local_addr().unwrap() ); - - axum::serve(listener, app).await.unwrap(); +async fn main() -> std::io::Result<()> { + let hotel_pools = HotelPools::new(); + let app = create_router(hotel_pools); + let listener = TcpListener::bind("0.0.0.0:3000").await?; + serve(listener, app).into_future().await?; + Ok(()) } async fn handler() -> &'static str { diff --git a/src/rooms/extractor.rs b/src/rooms/extractor.rs new file mode 100644 index 0000000..61cf4af --- /dev/null +++ b/src/rooms/extractor.rs @@ -0,0 +1,39 @@ +use axum::{ + extract::{Request, FromRequest, Path}, + body::{Body}, + + http::StatusCode, + Json, Router, +}; +use serde::Deserialize; + +#[derive(Deserialize, Debug)] +pub struct UpdateRoomValues { + pub status: String, + pub token: String, + pub hotel_id: i32, +} + +pub struct UpdateRoomPayload(pub UpdateRoomValues); + +//#[async_trait] +impl FromRequest for UpdateRoomPayload +where S: Send + Sync, +{ + type Rejection = (StatusCode, String); + + async fn from_request(req: Request, state: &S) -> Result { + let Json(payload) = Json::::from_request(req, state) + .await + .map_err(|err| (StatusCode::BAD_REQUEST, format!("Invalid body: {}", err)))?; + + Ok(UpdateRoomPayload(payload)) + } +} + +#[derive(Debug)] +pub struct RoomIdValue { + pub room_id: i32 +} + +pub type RoomIdPath = Path; \ No newline at end of file diff --git a/src/rooms/handler.rs b/src/rooms/handler.rs new file mode 100644 index 0000000..6d11807 --- /dev/null +++ b/src/rooms/handler.rs @@ -0,0 +1,79 @@ +use axum::{Json, extract::Path, extract::State }; +use axum::response::IntoResponse; +use axum::http::StatusCode; + +use crate::rooms::extractor::UpdateRoomPayload; + +use std::sync::Arc; +use r2d2::{Pool}; +use r2d2_sqlite::SqliteConnectionManager; +use dashmap::DashMap; +use rusqlite::params; +use crate::utils::db_pool::*; + + +pub async fn hello_rooms() -> String { + "hello from rooms".to_string() +} + +//fake handler +pub async fn fake_room_update( + Path(room_id): Path, + UpdateRoomPayload(payload): UpdateRoomPayload +) -> impl IntoResponse { + + format!( + "Got: token={}, status={}, room_id={}", + payload.token, payload.status, room_id + ) +} + +pub async fn fake_db_update( + + State(hotel_pools): State, + Path(room_id): Path, + UpdateRoomPayload(payload): UpdateRoomPayload, + +) -> impl IntoResponse { + + let pool = hotel_pools.get_pool(payload.hotel_id); + let conn = match pool.get() { + Ok(conn) => conn, + Err(err) => return (StatusCode::INTERNAL_SERVER_ERROR, format!("Pool error: {err}")), + }; + + let result = conn.execute( + "UPDATE rooms SET status = ?1 WHERE number = ?2", + params![&payload.status, &room_id], + ); + + + + match result { + Ok(rows) if rows > 0 => (StatusCode::OK, format!("Updated room {room_id} in hotel {}", payload.hotel_id)), + Ok(_) => (StatusCode::NOT_FOUND, "No room found".to_string()), + Err(err) => (StatusCode::INTERNAL_SERVER_ERROR, format!("DB error: {err}")), + } + +} + + +/* +//fake db handler +pub async fn update_room(UpdateRoomPayload(payload): UpdateRoom) -> impl IntoResponse { + match fake_db_update(&payload.token, payload.room_id, &payload.status).await { + Ok(msg) => msg, + Err(err) => format!("Error: {}", err), + } +} + +async fn fake_db_update(token: &str, room_id: i32, status: &str) -> Result { + // Pretend we check the token in the DB + if token != "valid_token" { + return Err("Invalid token".into()); + } + + // Pretend we update the room status in the DB + Ok(format!("Room {} updated to '{}'", room_id, status)) +} +*/ \ No newline at end of file diff --git a/src/rooms/mod.rs b/src/rooms/mod.rs new file mode 100644 index 0000000..ecc5a11 --- /dev/null +++ b/src/rooms/mod.rs @@ -0,0 +1,6 @@ +//pub mod handler; +//pub mod routes; + +mod handler; +mod extractor; +pub mod routes; diff --git a/src/rooms/model.rs b/src/rooms/model.rs new file mode 100644 index 0000000..de69eb0 --- /dev/null +++ b/src/rooms/model.rs @@ -0,0 +1,10 @@ +use serde::{Deserialize, Serialize}; +use uuid::Uuid; +use chrono::{DateTime, Utc}; + +#[derive(Debug, Serialize, Deserialize, sqlx::FromRow)] +pub struct Room{ + pub id: i32, + pub room_number: i32, + pub status: String +} diff --git a/src/rooms/routes.rs b/src/rooms/routes.rs new file mode 100644 index 0000000..dfe99b8 --- /dev/null +++ b/src/rooms/routes.rs @@ -0,0 +1,17 @@ +use axum::{ + routing::{get, put,}, + Router, +}; + +use crate::rooms::handler::*; +use crate::utils::db_pool::HotelPools; + + +// ROOTS +pub fn rooms_routes() -> Router { + + Router::new() + .route("/", get(hello_rooms) ) + .route("/fakeUpdate/{room_id}", put(fake_room_update)) + .route("/fake_db_update/{room_id}", put(fake_db_update)) + } \ No newline at end of file diff --git a/src/routes/mod.rs b/src/routes/mod.rs index 285a999..abee7f8 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -2,11 +2,23 @@ use axum::{ Router, }; -pub mod rooms; -pub mod inventory; +use crate::rooms::routes::rooms_routes; -pub fn create_routes() -> Router { +pub mod inventory; +use crate::utils::db_pool::HotelPools; + +pub fn create_router(hotel_pools: HotelPools) -> Router { Router::new() - .nest("/inventory", inventory::inventory_routes()) - .nest("/rooms", rooms::rooms_routes()) -} \ No newline at end of file + .nest("/rooms", rooms_routes()) + .with_state(hotel_pools) // 👈 hotel_db is passed in as argument + + } + + +/* +pub fn create_router() -> Router { + Router::new() + .nest("/rooms", rooms_routes()) + //.nest("/inventory", inventory::inventory_routes) +} + */ \ No newline at end of file diff --git a/src/routes/rooms.rs b/src/routes/rooms.rs deleted file mode 100644 index 26fc940..0000000 --- a/src/routes/rooms.rs +++ /dev/null @@ -1,15 +0,0 @@ -use axum::{ - routing::{get, //post - }, - Router, -}; - -pub fn rooms_routes() -> Router { - - Router::new() - .route("/", get(hi_rooms) ) -} - -async fn hi_rooms() -> &'static str { - "Hiii from room.rs route module" -} diff --git a/src/utils/db_pool.rs b/src/utils/db_pool.rs new file mode 100644 index 0000000..7ccd784 --- /dev/null +++ b/src/utils/db_pool.rs @@ -0,0 +1,35 @@ +use std::sync::Arc; +use dashmap::DashMap; +use r2d2::{Pool}; +use r2d2_sqlite::SqliteConnectionManager; + +type HotelId = i32; // or i32 if you want numeric ids + +#[derive(Clone)] +pub struct HotelPools { + pools: Arc>>, +} + +impl HotelPools { + pub fn new() -> Self { + Self { + pools: Arc::new(DashMap::new()), + } + } + + pub fn get_pool(&self, hotel_id: i32) -> Pool { + if let Some(pool) = self.pools.get(&hotel_id) { + return pool.clone(); + } + + let db_path = format!("db/{}.sqlite", hotel_id); + let manager = SqliteConnectionManager::file(db_path); + let pool = Pool::builder() + .max_size(5) // adjust based on load + .build(manager) + .expect("Failed to build pool"); + + self.pools.insert(hotel_id, pool.clone()); + pool + } +} \ No newline at end of file diff --git a/src/utils/dpPool.rs b/src/utils/dpPool.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/hash.rs b/src/utils/hash.rs new file mode 100644 index 0000000..c62185e --- /dev/null +++ b/src/utils/hash.rs @@ -0,0 +1,10 @@ +use bcryp::{hash, verify, DEFAULT_COST}; + +pub fn bcrypt_hash(password: &str) -> Result { + hash(password, 5) +} + +pub fn bcrypt_verify(password: &str, hashed_password: &str) -> Result { + verify(password, hashed_password) +} + diff --git a/src/utils/mod.rs b/src/utils/mod.rs new file mode 100644 index 0000000..b0680f8 --- /dev/null +++ b/src/utils/mod.rs @@ -0,0 +1 @@ +pub mod db_pool; \ No newline at end of file diff --git a/src/utils/schema_extractor.rs b/src/utils/schema_extractor.rs new file mode 100644 index 0000000..bff0c98 --- /dev/null +++ b/src/utils/schema_extractor.rs @@ -0,0 +1,44 @@ +use axum::{ + async_traits, + extract::FromRequestParts, + http::request::Parts, +}; +use jsonwebtoken::{decode, DecodingKey, Validation}; +use serde::Deserialize; + +#[derive(Debug, Deserialize)] +struct Claims { + schema: String +} + +#[derive(Debug, Clone)] +pub struct UserSchema(pub String); + +#[async_traits] +impl FromRequestParts for UserSchema +where +S: Send + Sync, +{ + type Rejection = axum::http::StatusCode; + + async fn from_request_parts( + parts: &mut Parts, + _state: &S, + ) -> Reslult { + let auth_header = parts + .headers + .get("authorizaton") + .and_then(|h| h.to_str().ok()) + .ok_or(axum::http::StatusCode::UNAUTHORIZED)?; + let token = auth_header.trim_start_matches("Bearer "); + + let data = decode::( + token, + &DecodingKey::from_secret("mysecret".as_ref()), // load from config later + &Validation::default(), + ) + .map_err(|_| axum::http::StatusCode::UNAUTHORIZED)?; + + Ok(TenantSchema(data.claims.schema)) + } +} \ No newline at end of file diff --git a/test.rs b/test.rs new file mode 100644 index 0000000..49d378f --- /dev/null +++ b/test.rs @@ -0,0 +1,9 @@ +fn get_pool(hotel_id: String) -> connection { + + if connection { + return connection; + } + + create connection + +} \ No newline at end of file