diff --git a/Cargo.lock b/Cargo.lock index 79369cb..fa3d032 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -255,6 +255,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" version = "0.4.42" @@ -265,7 +271,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-link 0.2.0", + "windows-link", ] [[package]] @@ -289,16 +295,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -387,31 +383,6 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.1", -] - [[package]] name = "fallible-iterator" version = "0.3.0" @@ -424,12 +395,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - [[package]] name = "find-msvc-tools" version = "0.1.2" @@ -448,21 +413,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.2" @@ -564,9 +514,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", "wasi 0.14.7+wasi-0.2.4", + "wasm-bindgen", ] [[package]] @@ -575,25 +527,6 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" -[[package]] -name = "h2" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "hashbrown" version = "0.14.5" @@ -609,12 +542,6 @@ dependencies = [ "foldhash", ] -[[package]] -name = "hashbrown" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" - [[package]] name = "hashlink" version = "0.10.0" @@ -732,7 +659,6 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "h2", "http", "http-body", "httparse", @@ -759,22 +685,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", + "webpki-roots", ] [[package]] @@ -796,11 +707,9 @@ dependencies = [ "percent-encoding", "pin-project-lite", "socket2", - "system-configuration", "tokio", "tower-service", "tracing", - "windows-registry", ] [[package]] @@ -929,16 +838,6 @@ dependencies = [ "icu_properties", ] -[[package]] -name = "indexmap" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" -dependencies = [ - "equivalent", - "hashbrown 0.16.0", -] - [[package]] name = "inout" version = "0.1.4" @@ -1023,12 +922,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - [[package]] name = "litemap" version = "0.8.1" @@ -1051,6 +944,12 @@ version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "matchit" version = "0.8.4" @@ -1089,23 +988,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "num-bigint" version = "0.4.6" @@ -1155,50 +1037,6 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -[[package]] -name = "openssl" -version = "0.10.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" -dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.111" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "parking_lot" version = "0.12.4" @@ -1300,6 +1138,61 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.3", + "lru-slab", + "rand", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "quote" version = "1.0.40" @@ -1386,37 +1279,34 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.24" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64", "bytes", - "encoding_rs", "futures-channel", "futures-core", "futures-util", - "h2", "http", "http-body", "http-body-util", "hyper", "hyper-rustls", - "hyper-tls", "hyper-util", "js-sys", "log", - "mime", - "native-tls", "percent-encoding", "pin-project-lite", + "quinn", + "rustls", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-native-tls", + "tokio-rustls", "tower", "tower-http", "tower-service", @@ -1424,6 +1314,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "webpki-roots", ] [[package]] @@ -1461,17 +1352,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] -name = "rustix" -version = "1.1.2" +name = "rustc-hash" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.1", -] +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustls" @@ -1480,6 +1364,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "once_cell", + "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -1492,6 +1377,7 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" dependencies = [ + "web-time", "zeroize", ] @@ -1518,15 +1404,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[package]] -name = "schannel" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" -dependencies = [ - "windows-sys 0.61.1", -] - [[package]] name = "scheduled-thread-pool" version = "0.2.7" @@ -1542,29 +1419,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "serde" version = "1.0.226" @@ -1734,40 +1588,6 @@ dependencies = [ "syn", ] -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tempfile" -version = "3.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" -dependencies = [ - "fastrand", - "getrandom 0.3.3", - "once_cell", - "rustix", - "windows-sys 0.61.1", -] - [[package]] name = "thiserror" version = "2.0.16" @@ -1829,6 +1649,21 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.47.1" @@ -1860,16 +1695,6 @@ dependencies = [ "syn", ] -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.4" @@ -1892,19 +1717,6 @@ dependencies = [ "tungstenite", ] -[[package]] -name = "tokio-util" -version = "0.7.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - [[package]] name = "tower" version = "0.5.2" @@ -1923,9 +1735,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ "bitflags", "bytes", @@ -2176,6 +1988,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "windows-core" version = "0.62.0" @@ -2184,9 +2015,9 @@ checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.2.0", - "windows-result 0.4.0", - "windows-strings 0.5.0", + "windows-link", + "windows-result", + "windows-strings", ] [[package]] @@ -2211,54 +2042,19 @@ dependencies = [ "syn", ] -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - [[package]] name = "windows-link" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" -[[package]] -name = "windows-registry" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" -dependencies = [ - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - [[package]] name = "windows-result" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" dependencies = [ - "windows-link 0.2.0", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", + "windows-link", ] [[package]] @@ -2267,7 +2063,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" dependencies = [ - "windows-link 0.2.0", + "windows-link", ] [[package]] @@ -2288,15 +2084,6 @@ dependencies = [ "windows-targets", ] -[[package]] -name = "windows-sys" -version = "0.61.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" -dependencies = [ - "windows-link 0.2.0", -] - [[package]] name = "windows-targets" version = "0.52.6" diff --git a/Cargo.toml b/Cargo.toml index 07244a0..bba5d95 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,7 @@ rand_core = {version = "0.6.4", features = ["getrandom"]} futures-util = {version = "0.3.31"} uuid = {version = "1.18.1", features = ["serde"] } base64 = "0.22.1" -reqwest = { version = "0.12.24", features = ["json","blocking"] } +reqwest = { version = "0.12.28", default-features = false, features = ["json","blocking", "rustls-tls"] } tower-http = { version = "0.6.7", features = ["cors"] } diff --git a/db/1.sqlite b/db/1.sqlite index 0a33887..cbb825f 100644 Binary files a/db/1.sqlite and b/db/1.sqlite differ diff --git a/db/1.sqlite-shm b/db/1.sqlite-shm index fe9ac28..b2face3 100644 Binary files a/db/1.sqlite-shm and b/db/1.sqlite-shm differ diff --git a/db/1.sqlite-wal b/db/1.sqlite-wal index e69de29..7af4a3a 100644 Binary files a/db/1.sqlite-wal and b/db/1.sqlite-wal differ diff --git a/db/auth.sqlite-wal b/db/3.sqlite similarity index 100% rename from db/auth.sqlite-wal rename to db/3.sqlite diff --git a/db/auth.sqlite-shm b/db/auth.sqlite-shm deleted file mode 100644 index fe9ac28..0000000 Binary files a/db/auth.sqlite-shm and /dev/null differ diff --git a/db/auth_copy_2.sqlite b/db/auth_copy_2.sqlite index 761aa8a..c62e835 100644 Binary files a/db/auth_copy_2.sqlite and b/db/auth_copy_2.sqlite differ diff --git a/rust-api-1-0-3.tar b/rust-api-1-0-3.tar new file mode 100644 index 0000000..c3e4ff3 Binary files /dev/null and b/rust-api-1-0-3.tar differ diff --git a/rust-api-1-0-4.tar b/rust-api-1-0-4.tar new file mode 100644 index 0000000..a11c6fc Binary files /dev/null and b/rust-api-1-0-4.tar differ diff --git a/src/chat/handlers.rs b/src/chat/handlers.rs index 4f05227..6945c7e 100644 --- a/src/chat/handlers.rs +++ b/src/chat/handlers.rs @@ -1,16 +1,17 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use axum::{ Json, extract::{ - FromRequest,FromRequestParts, State, + FromRequest,FromRequestParts, State, Path, }, http::StatusCode, response::{IntoResponse, sse::KeepAlive} }; //use axum::extract::ws::Message; use chrono::NaiveDateTime; -use rusqlite::{Name, params}; +use rusqlite::{Name, Statement, params}; +use rusqlite::OptionalExtension; use serde::Serialize; use serde_json::{json, to_value}; @@ -56,58 +57,189 @@ pub async fn add_user_to_conv( let pool = state.hotel_pools.get_pool(hotel_id); - let conn = match pool.get(){ + let mut conn = match pool.get(){ Ok(conn) => conn, Err(err) => return (StatusCode::INTERNAL_SERVER_ERROR, format!("Pool error")) }; - let mut statement = match conn.prepare( - "SELECT 1 FROM conversation WHERE creator_id = ?1 AND id = ?2" , - ){ - Ok(statement) => statement, - Err(_) => return (StatusCode::INTERNAL_SERVER_ERROR, "prepare failed".to_string()) + let is_creator = match conn + .query_row( + "SELECT 1 FROM conversation WHERE creator_id = ?1 AND id = ?2", + params![user_id, payload.conv_id], + |_| Ok(()), + ) + .optional() + { + Ok(Some(_)) => true, + Ok(None) => false, + Err(_) => { + return ( + StatusCode::INTERNAL_SERVER_ERROR, + "Creator check failed".to_string(), + ) + } }; - match statement.exists(params![user_id, payload.conv_id]) { - Ok(true) => { - //user is creator - } - Ok(false) => { - //user is not the creator - return (StatusCode::FORBIDDEN, "Not the creato of the conversation".to_string()) - } - Err(_) => { - return(StatusCode::INTERNAL_SERVER_ERROR, "Query failed".to_string()) - } - + if !is_creator { + return ( + StatusCode::FORBIDDEN, + "Not the creator of the conversation".to_string(), + ); } - for target_id in &payload.users { - let rows_inserted = match conn.execute( - "INSERT INTO conversation_participants (conversation_id, user_id) VALUES (?1, ?2)", - params![payload.conv_id, target_id], - ) { - Ok(n) => n, - Err(err) => { - return (StatusCode::INTERNAL_SERVER_ERROR, format!("Err adding user {}: {}", target_id, err)); - } - }; - if rows_inserted == 0 { - return (StatusCode::NOT_FOUND, format!("Could not add user {}", target_id)); + //fix this +let existing: HashSet = { + let mut stmt = match conn.prepare( + "SELECT user_id FROM conversation_participants WHERE conversation_id = ?1", + ) { + Ok(s) => s, + Err(_) => { + return ( + StatusCode::INTERNAL_SERVER_ERROR, + "Prepare participants stmt failed".to_string(), + ) } + }; + + match stmt.query_map(params![payload.conv_id], |row| row.get(0)) { + Ok(rows) => rows.filter_map(Result::ok).collect(), + Err(_) => { + return ( + StatusCode::INTERNAL_SERVER_ERROR, + "Query participants failed".to_string(), + ) + } + } +}; // ← stmt dropped HERE + + let payload_users: HashSet = payload.users.into_iter().collect(); + + let to_add: Vec = payload_users + .difference(&existing) + .copied() + .collect(); + + let to_remove : Vec = existing + .difference(&payload_users) + .copied() + .collect(); + + let tx = match conn.transaction() { + Ok(t) => t, + Err(_) => { + return ( + StatusCode::INTERNAL_SERVER_ERROR, + "Transaction start failed for update conv participants".to_string(), + ) + } + }; + +for user_id in to_add { + if let Err(err) = tx.execute( + "INSERT INTO conversation_participants (conversation_id, user_id) + VALUES (?1, ?2)", + params![payload.conv_id, user_id], + ) { + return ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Insert failed for {}: {}", user_id, err), + ); + } + } + + for user_id in to_remove { + if let Err(err) = tx.execute( + "DELETE FROM conversation_participants + WHERE conversation_id = ?1 AND user_id = ?2", + params![payload.conv_id, user_id], + ) { + return ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Delete failed for {}: {}", user_id, err), + ); + } + } + + if let Err(_) = tx.commit() { + return ( + StatusCode::INTERNAL_SERVER_ERROR, + "Transaction commit failed".to_string(), + ); } return (StatusCode::OK, "ok".to_string()); } +/* +#[derive(Deserialize, Serialize, Debug)] +pub struct Get + +*/ + +pub async fn get_conv_users( + State(state): State, + AuthClaims{user_id, hotel_id}: AuthClaims, + Path(conv_id): Path<(i32)>, +) -> impl IntoResponse { + + let pool = state.hotel_pools.get_pool(hotel_id); + + let conn = match pool.get (){ + Ok(c)=> c, + Err(err)=> return (StatusCode::INTERNAL_SERVER_ERROR, format!("Error opening pol connection : {err}") ) + }; + + + let mut stmt = match conn.prepare( + "SELECT conversation_id, name FROM conversation_participants WHERE user_id = ?1", + ) { + Ok(s) => s, + Err(e) => return (StatusCode::INTERNAL_SERVER_ERROR, format!("Prepare failed: {}", e)), + }; + + //fix this + let existing: HashSet = { + let mut stmt = match conn.prepare( + "SELECT user_id FROM conversation_participants WHERE conversation_id = ?1", + ) { + Ok(s) => s, + Err(_) => { + return ( + StatusCode::INTERNAL_SERVER_ERROR, + "Prepare participants stmt failed".to_string(), + ) + } + }; + + match stmt.query_map(params![conv_id], |row| row.get(0)) { + Ok(rows) => rows.filter_map(Result::ok).collect(), + Err(_) => { + return ( + StatusCode::INTERNAL_SERVER_ERROR, + "Query participants failed".to_string(), + ) + } + } + }; // ← stmt dropped HERE + + let present: Vec = existing + .into_iter() + .collect(); + + match serde_json::to_string(&present) { + Ok(json) => (StatusCode::OK, json), + Err(e) => (StatusCode::INTERNAL_SERVER_ERROR, format!("Serialization failed: {}", e)), + } +} + pub async fn send_message( State(state): State, AuthClaims {user_id, hotel_id}: AuthClaims, SendMessagePayload(payload):SendMessagePayload ) -> impl IntoResponse { - + //TODO: make sur the convid is valid let pool = state.hotel_pools.get_pool(hotel_id); let conn = match pool.get(){ diff --git a/src/chat/routes.rs b/src/chat/routes.rs index 586ba7e..d75c3da 100644 --- a/src/chat/routes.rs +++ b/src/chat/routes.rs @@ -19,7 +19,7 @@ pub fn chat_routes() -> Router { .route("/add_users_conv", put(add_user_to_conv)) .route("/send_message", post(send_message)) .route("/get_conv", post(get_convs)) - .route("/get_message", get(get_message)) + .route("/get_message", post(get_message)) .route("/hotel_users", post(get_hotel_users)) - + .route("/get_conv_users/{conv_id}", post(get_conv_users)) } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index d8afa8f..fd5a412 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ use axum::serve; use axum::Extension; use axum::extract::{ws::{Message, WebSocket, WebSocketUpgrade}, State}; + use jsonwebtoken::{DecodingKey, EncodingKey}; use reqwest::header::AUTHORIZATION; use reqwest::header::CONTENT_TYPE; @@ -25,8 +26,8 @@ use crate::utils::auth::JwtKeys; use std::env; use dotenvy::dotenv; - -use tower_http::cors::{CorsLayer, Any}; +//use tower_http::cors::Origin; +use tower_http::cors::{CorsLayer, Any,}; use axum::http::{Method, HeaderValue}; pub async fn notify_discord(msg: &str) -> Result<(), reqwest::Error> { @@ -91,13 +92,15 @@ std::panic::set_hook(Box::new(|info| { decoding: DecodingKey::from_secret(jwt_secret.as_ref()), }; +let allowed_origins = vec![ + "http://82.66.253.209", + "http://localhost:5173", +]; - let cors = CorsLayer::new() - .allow_origin("http://localhost:5173".parse::().unwrap()) - .allow_credentials(true) - .allow_methods([Method::GET, Method::POST, Method::PUT , Method::OPTIONS]) - .allow_headers([CONTENT_TYPE, AUTHORIZATION]); - +let cors = CorsLayer::very_permissive() + .allow_credentials(true) + .allow_methods([Method::GET, Method::POST, Method::PUT, Method::OPTIONS]) + .allow_headers([CONTENT_TYPE, AUTHORIZATION]); let app = create_router(state) .layer(Extension(jwt_keys)) .layer(cors); diff --git a/src/utils/auth.rs b/src/utils/auth.rs index 4f73c27..41daf63 100644 --- a/src/utils/auth.rs +++ b/src/utils/auth.rs @@ -332,6 +332,7 @@ struct LoginResponse { #[derive(Serialize)] struct MultiLoginResponse { + user_id: i32, tokens: Vec, } @@ -674,7 +675,7 @@ pub async fn login_refresh_token ( } //Json(tokens).into_response() - Json(MultiLoginResponse { tokens }).into_response() + Json(MultiLoginResponse { user_id, tokens }).into_response() } diff --git a/utils command.txt b/utils command.txt index 6600c89..75103f0 100644 --- a/utils command.txt +++ b/utils command.txt @@ -1,3 +1,7 @@ +docker build -t rust-api:1.0.5 . +docker save -o rust-api-1-0-4.tar rust-api:1.0.4 + + cross build --release --target aarch64-unknown-linux-gnu docker run -p 8080:8080 \ @@ -36,6 +40,13 @@ linux distro -p 8080:8080 ` rust-api:1.0.2 +docker run \ +--name hotel-api-2 \ +-e JWT_SECRET=your_jwt_secret_key \ +-v "/var/lib/hotel-api/db:/app/db" \ +-p 8080:8080 \ +rust-api:1.0.3 +