diff --git a/Cargo.lock b/Cargo.lock index 5d21979..8cbfea3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -265,7 +265,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-link", + "windows-link 0.2.0", ] [[package]] @@ -289,6 +289,16 @@ 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" @@ -360,12 +370,48 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "dotenvy" 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.59.0", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -378,6 +424,12 @@ 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" @@ -396,6 +448,21 @@ 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" @@ -412,6 +479,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -420,6 +488,12 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + [[package]] name = "futures-macro" version = "0.3.31" @@ -450,9 +524,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", + "futures-io", "futures-macro", "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", "slab", @@ -499,6 +575,25 @@ 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" @@ -514,6 +609,12 @@ 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" @@ -566,6 +667,7 @@ dependencies = [ "r2d2", "r2d2_sqlite", "rand_core 0.6.4", + "reqwest", "rusqlite", "serde", "serde_json", @@ -629,6 +731,7 @@ dependencies = [ "bytes", "futures-channel", "futures-core", + "h2", "http", "http-body", "httparse", @@ -638,6 +741,39 @@ dependencies = [ "pin-utils", "smallvec", "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "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", ] [[package]] @@ -646,14 +782,24 @@ version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ + "base64", "bytes", + "futures-channel", "futures-core", + "futures-util", "http", "http-body", "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", + "socket2", + "system-configuration", "tokio", "tower-service", + "tracing", + "windows-registry", ] [[package]] @@ -680,6 +826,118 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "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" @@ -700,6 +958,22 @@ dependencies = [ "libc", ] +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "itoa" version = "1.0.15" @@ -748,6 +1022,18 @@ 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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + [[package]] name = "lock_api" version = "0.4.13" @@ -802,6 +1088,23 @@ 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" @@ -851,6 +1154,50 @@ 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" @@ -919,6 +1266,15 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1027,6 +1383,48 @@ dependencies = [ "bitflags", ] +[[package]] +name = "reqwest" +version = "0.12.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +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", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "ring" version = "0.17.14" @@ -1061,6 +1459,52 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -1073,6 +1517,15 @@ 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" @@ -1088,6 +1541,29 @@ 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" @@ -1214,6 +1690,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + [[package]] name = "subtle" version = "2.6.1" @@ -1236,6 +1718,54 @@ 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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "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.59.0", +] [[package]] name = "thiserror" @@ -1288,6 +1818,16 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tokio" version = "1.47.1" @@ -1319,6 +1859,26 @@ 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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-tungstenite" version = "0.28.0" @@ -1331,6 +1891,19 @@ 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" @@ -1347,6 +1920,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -1379,6 +1970,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 = "tungstenite" version = "0.28.0" @@ -1414,12 +2011,30 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + [[package]] name = "utf-8" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "uuid" version = "1.18.1" @@ -1445,6 +2060,15 @@ 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.1+wasi-snapshot-preview1" @@ -1496,6 +2120,19 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.103" @@ -1528,6 +2165,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "web-sys" +version = "0.3.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "windows-core" version = "0.62.0" @@ -1536,9 +2183,9 @@ checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" dependencies = [ "windows-implement", "windows-interface", - "windows-link", - "windows-result", - "windows-strings", + "windows-link 0.2.0", + "windows-result 0.4.0", + "windows-strings 0.5.0", ] [[package]] @@ -1563,19 +2210,54 @@ 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", + "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", ] [[package]] @@ -1584,7 +2266,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" dependencies = [ - "windows-link", + "windows-link 0.2.0", ] [[package]] @@ -1605,6 +2287,15 @@ 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" @@ -1675,6 +2366,35 @@ version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.8.27" @@ -1695,8 +2415,62 @@ dependencies = [ "syn", ] +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index 3b05a5a..7654ff2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +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"] } diff --git a/Dockerfile b/Dockerfile index b8f64fe..639f4f3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,13 +4,20 @@ COPY . . RUN cargo build --release FROM debian:bookworm-slim + +# Create the app user with UID 1001 +RUN useradd -u 1001 -m appuser + +# Create working directory (only needed if your app expects /app) WORKDIR /app + +# Copy binary from builder COPY --from=builder /app/target/release/hotel-api-rs /usr/local/bin/hotel-api-rs -# Create the directory where DB will be stored -RUN mkdir -p /db +# Switch to non-root user +USER 1001 # Expose API port EXPOSE 8080 -CMD ["/usr/local/bin/hotel-api-rs"] \ No newline at end of file +CMD ["/usr/local/bin/hotel-api-rs"] diff --git a/Dockerfile copy b/Dockerfile copy new file mode 100644 index 0000000..b8f64fe --- /dev/null +++ b/Dockerfile copy @@ -0,0 +1,16 @@ +FROM rust:latest AS builder +WORKDIR /app +COPY . . +RUN cargo build --release + +FROM debian:bookworm-slim +WORKDIR /app +COPY --from=builder /app/target/release/hotel-api-rs /usr/local/bin/hotel-api-rs + +# Create the directory where DB will be stored +RUN mkdir -p /db + +# Expose API port +EXPOSE 8080 + +CMD ["/usr/local/bin/hotel-api-rs"] \ No newline at end of file diff --git a/db/1.sqlite b/db/1.sqlite index d0ca1d3..369beb4 100644 Binary files a/db/1.sqlite and b/db/1.sqlite differ diff --git a/db/auth copy.sqlite b/db/auth copy.sqlite new file mode 100644 index 0000000..d14acd6 Binary files /dev/null and b/db/auth copy.sqlite differ diff --git a/db/auth.sqlite b/db/auth.sqlite index 5c01723..4e846d8 100644 Binary files a/db/auth.sqlite and b/db/auth.sqlite differ diff --git a/db/hotel.sqlite b/db/hotel.sqlite deleted file mode 100644 index e69de29..0000000 diff --git a/db/hotel_1.sqlite b/db/hotel_1.sqlite deleted file mode 100644 index e69de29..0000000 diff --git a/db/test_backup/1.sqlite b/db/test_backup/1.sqlite new file mode 100644 index 0000000..369beb4 Binary files /dev/null and b/db/test_backup/1.sqlite differ diff --git a/db/test_backup/auth.sqlite b/db/test_backup/auth.sqlite new file mode 100644 index 0000000..4e846d8 Binary files /dev/null and b/db/test_backup/auth.sqlite differ diff --git a/rust-api-1-0-2.tar b/rust-api-1-0-2.tar new file mode 100644 index 0000000..b376aac Binary files /dev/null and b/rust-api-1-0-2.tar differ diff --git a/src/chat/handlers.rs b/src/chat/handlers.rs index 54703bd..73d182a 100644 --- a/src/chat/handlers.rs +++ b/src/chat/handlers.rs @@ -1,16 +1,18 @@ +use std::collections::HashMap; + use axum::{ - extract::{ + Json, extract::{ FromRequest,FromRequestParts, State, - }, http::StatusCode, response::{sse::KeepAlive, IntoResponse}, + }, http::StatusCode, response::{IntoResponse, sse::KeepAlive} }; //use axum::extract::ws::Message; use chrono::NaiveDateTime; -use rusqlite::params; +use rusqlite::{Name, params}; use serde::Serialize; -use serde_json::json; +use serde_json::{json, to_value}; use crate::chat::extractor::{ AddUserConversationPayload, CreateConversationPayload, GetMessagesPayload, SendMessagePayload @@ -154,6 +156,7 @@ pub async fn send_message( if let Some(hotel_users) = state.ws_map.get(&hotel_id) { let update_msg = serde_json::json!({ + "event-type": "chat-message", "conv_id": payload.conv_id, "sender": user_id, "content": payload.message, @@ -280,3 +283,140 @@ pub async fn get_hotel_users( } } +#[derive(Debug, Serialize)] +struct Conversation { + id: i32, + title: String, +} + +pub async fn get_convs( + State(state): State, + //Path((item_name, item_amount)): Path<(String, i32)>, + AuthClaims{ user_id, hotel_id}: AuthClaims, +) -> impl IntoResponse { + + let pool = state.hotel_pools.get_pool(hotel_id); + + let conn = match pool.get(){ + Ok(conn) => conn, + Err(err) => { + let body = json!({ "error": format!("Pool error: {}", err) }); + return (StatusCode::INTERNAL_SERVER_ERROR, Json(body)); + } + }; + + let mut stmt = match conn.prepare( + "SELECT conversation_id, name FROM conversation_participants WHERE user_id = ?1", + ) { + Ok(s) => s, + Err(e) => { + let body = json!({ "error": format!("Prepare failed: {}", e) }); + return (StatusCode::INTERNAL_SERVER_ERROR, Json(body) ) + + } + }; + + let rows = match stmt.query_map(params![user_id], |row| { + let conversation_id: i32 = row.get(0)?; + let name: String = row.get(1)?; + Ok((conversation_id, name)) + }) { + Ok(rows) => rows, + //Ok(_) => {}, IMPLEMENT NO CONV ? + Err(e) => { + let body = json!({ "error": format!("Query failed: {}", e) }); + return (StatusCode::INTERNAL_SERVER_ERROR, Json(body)); + } + }; + + + let mut map = HashMap::new(); + + // ✅ Iterate through the row results + for row_result in rows { + match row_result { + Ok((id, name)) => { + map.insert(id, name); + } + Err(e) => { + let body = json!({ "error": format!("Row parsing failed: {}", e) }); + return (StatusCode::INTERNAL_SERVER_ERROR, Json(body)); + } + } + } + + let convs_string = serde_json::to_string(&map) + .map_err(|_| (StatusCode::INTERNAL_SERVER_ERROR, Json("error".to_string()))); + + let conv_map_json = to_value(map).unwrap(); + (StatusCode::OK, Json(conv_map_json)) +} + + + + +/* +pub async fn get_convs( + State(state): State, + //Path((item_name, item_amount)): Path<(String, i32)>, + AuthClaims{ user_id, hotel_id}: AuthClaims, +) -> impl IntoResponse { + + let pool = state.hotel_pools.get_pool(hotel_id); + + let conn = match pool.get(){ + Ok(conn) => conn, + Err(err) => return (StatusCode::INTERNAL_SERVER_ERROR, format!("Pool error: {}", err).into_response() ) + + }; + + let mut stmt = match conn.prepare( + "SELECT id, title FROM conversation WHERE creator_id = ?1", + ) { + Ok(s) => s, + Err(e) => + + return (StatusCode::INTERNAL_SERVER_ERROR, format!("Prepare failed: {}", e).into_response() ) + + + }; + + let rows = match stmt.query_map(params![user_id], |row| { + let id: i32 = row.get(0)?; + let title: String = row.get(1)?; + Ok((title, id)) + }) { + Ok(rows) => rows, + Err(e) => return (StatusCode::INTERNAL_SERVER_ERROR, format!("Query failed: {}", e).into_response() ) + + }; + + + let mut map = HashMap::new(); + + // ✅ Iterate through the row results + for row_result in rows { + match row_result { + Ok((title, id)) => { + map.insert(title, id); + } + Err(e) => return (StatusCode::INTERNAL_SERVER_ERROR, format!("Row parsing failed: {}", e).into_response() ) + + } + } + + + let conv_map_json = match to_value(map) { + Ok(c) => c, + Err(e) => return (StatusCode::INTERNAL_SERVER_ERROR, format!("List unwrapping failed: {}", e).into_response() ) + }; + + let conv_map_clean_json = serde_json::to_value(map) + .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("Serialization failed: {}", e).into_response() )); + + + + (StatusCode::OK, Json(conv_map_clean_json)).into_response() +} + +*/ \ No newline at end of file diff --git a/src/chat/routes.rs b/src/chat/routes.rs index 8b98a76..aeb6edf 100644 --- a/src/chat/routes.rs +++ b/src/chat/routes.rs @@ -18,6 +18,7 @@ pub fn chat_routes() -> Router { .route("/create_conversation", post (create_conversation)) .route("/add_users_conv", put(add_user_to_conv)) .route("/send_message", post(send_message)) + .route("/get_conv", get(get_convs)) .route("/get_message", get(get_message)) .route("/hotel_users", get(get_hotel_users)) diff --git a/src/inventory/handler.rs b/src/inventory/handler.rs index 72e104e..86b6365 100644 --- a/src/inventory/handler.rs +++ b/src/inventory/handler.rs @@ -2,6 +2,7 @@ use argon2::Params; use axum::{extract::{ws::{close_code::STATUS, Message}, Path, State}, http::StatusCode, response::IntoResponse}; use rusqlite::params; +use serde::Serialize; use serde_json::json; @@ -33,6 +34,14 @@ pub async fn create_inventory_item( } } +#[derive(Serialize)] +pub struct InventoryItems { + id: i32, + amount: i32, + name: String, + user_id: i32, + updated_at: String, +} pub async fn update_inventory_item( State(state): State, @@ -81,4 +90,48 @@ pub async fn update_inventory_item( } */ +} + + +pub async fn get_inventory_item( + State(state): State, + AuthClaims { user_id, hotel_id }: AuthClaims, +) -> impl IntoResponse { + let pool = state.hotel_pools.get_pool(hotel_id); + + let conn = match pool.get() { + Ok(c) => c, + Err(_) => return (StatusCode::INTERNAL_SERVER_ERROR, "Pool error".to_string()), + }; + + let mut stmt = match conn.prepare("SELECT id, amount, item_name, user_id FROM inventory") { + Ok(s) => s, + Err(_) => return (StatusCode::INTERNAL_SERVER_ERROR, "Statement error".to_string()), + }; + + let mut query_result = match stmt.query([]) { + Ok(r) => r, + Err(_) => return (StatusCode::INTERNAL_SERVER_ERROR, "Query error".to_string()), + }; + + let mut items = Vec::new(); + + while let Ok(Some(row)) = query_result.next() { + let item = InventoryItems { + id: row.get("id").unwrap_or_default(), + amount: row.get("amount").unwrap_or_default(), + name: row.get("name").unwrap_or_default(), + user_id: row.get("user_id").unwrap_or_default(), + updated_at: row.get("updated_at").unwrap_or_default(), + }; + items.push(item); + } + + // Serialize to JSON + let json = match serde_json::to_string(&items) { + Ok(j) => j, + Err(_) => return (StatusCode::INTERNAL_SERVER_ERROR, "Serialization error".to_string()), + }; + + (StatusCode::OK, json) } \ No newline at end of file diff --git a/src/inventory/routes.rs b/src/inventory/routes.rs index f95a9c3..b5d2b96 100644 --- a/src/inventory/routes.rs +++ b/src/inventory/routes.rs @@ -10,4 +10,5 @@ pub fn inventory_routes() -> Router { Router::new() .route("/update_item/{item_id}/{item_amount}", put(update_inventory_item)) .route("/add_item/{item_name}/{item_amount}", post(create_inventory_item)) + .route("/get_item/", get(get_inventory_item)) } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 498b769..e367f93 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,8 @@ use jsonwebtoken::{DecodingKey, EncodingKey}; use tokio::net::TcpListener; use tokio::sync::mpsc; +use reqwest::Client; + mod utils; mod routes; mod rooms; @@ -23,12 +25,43 @@ use std::env; use dotenvy::dotenv; +pub async fn notify_discord(msg: &str) -> Result<(), reqwest::Error> { + let payload = serde_json::json!({ + "content": msg + }); + + reqwest::Client::new() + .post("https://discord.com/api/webhooks/1440912618205347891/Ekg89krDoPm41kA27LA3gXgNWmMWvCCtziYIUsjqaY22Jnw4a6IWhZOht0in5JjnPX-W") + .json(&payload) + .send() + .await?; + + Ok(()) +} + #[tokio::main(flavor = "multi_thread", worker_threads = 8)] async fn main() -> std::io::Result<()> { dotenv().ok(); +std::panic::set_hook(Box::new(|info| { + let msg = format!("Rust panic: {}", info); + + // Use blocking client so the process can't exit before sending + let payload = serde_json::json!({ + "content": msg + }); + + let client = reqwest::blocking::Client::new(); + let _ = client + .post("https://discord.com/api/webhooks/1440912618205347891/Ekg89krDoPm41kA27LA3gXgNWmMWvCCtziYIUsjqaY22Jnw4a6IWhZOht0in5JjnPX-W") + .json(&payload) + .send(); +})); + +panic!("crash-test"); + let hotel_pools = HotelPool::new(); let logs_manager = SqliteConnectionManager::file("db/auth.sqlite"); let logs_pool = Pool::builder() diff --git a/src/rooms/handler.rs b/src/rooms/handler.rs index 8212f4f..ff7e963 100644 --- a/src/rooms/handler.rs +++ b/src/rooms/handler.rs @@ -22,8 +22,6 @@ pub async fn hello_rooms() -> String { "hello from rooms".to_string() } - - pub async fn fake_db_update( State(state): State, AuthClaims { user_id, hotel_id }: AuthClaims, @@ -85,6 +83,7 @@ pub async fn clean_db_update( } if let Some(hotel_users) = state.ws_map.get(&hotel_id) { let update_msg = json!({ + "event-type": "room-update", "room_id": room_id, "status": payload.status, "updated_by": user_id, @@ -131,13 +130,15 @@ pub async fn get_all_rooms( Err(e) => return (StatusCode::INTERNAL_SERVER_ERROR, format!("Prepare failed: {}", e)), }; - let room_iter = match stmt.query_map( params![],|row| { - Ok(Room { - id: row.get(0)?, - number: row.get(1)?, - status: row.get(2)?, - }) - }) { + let room_iter = match stmt.query_map( + params![],|row| { + Ok(Room { + id: row.get(0)?, + number: row.get(1)?, + status: row.get(2)?, + }) + } + ) { Ok(iter) => iter, Err(e) => return (StatusCode::INTERNAL_SERVER_ERROR, format!("Query failed: {}", e)), }; diff --git a/utils command.txt b/utils command.txt index f256f6f..9f5e42f 100644 --- a/utils command.txt +++ b/utils command.txt @@ -3,4 +3,81 @@ cross build --release --target aarch64-unknown-linux-gnu docker run -p 8080:8080 \ -v ${PWD}/db:/db \ -e JWT_SECRET="my-dev-secret" \ - rust-api:1.0.0 \ No newline at end of file + rust-api:1.0.0 + +GOOD + + docker run + --hostname=58ff54b2464c + --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + --volume=/w/DEV/hotel-api-rs/db:/app/db + --network=bridge + --workdir=/app + -p 8080:8080 + --restart=no + --runtime=runc + -d rust-api:1.0.0 + + + + docker run ` + --name hotel-api ` + -e JWT_SECRET=your_jwt_secret_key ` + -v "/w/DEV/hotel-api-rs/db:/app/db" ` + -p 8080:8080 ` + rust-api:1.0.1 + + + + + + +BAD + + "Mounts": [ + { + "Type": "bind", + "Source": "/w/DEV/hotel-api-rs/db", + "Destination": "/app/db ", + "Mode": "", + "RW": true, + "Propagation": "rprivate" + } + ], + + +"Mounts": [ + { + "Type": "bind", + "Source": "/w/DEV/hotel-api-rs/db", + "Destination": "/app/db", + "Mode": "", + "RW": true, + "Propagation": "rprivate" + } + ], + + + "Mounts": [ + { + "Type": "bind", + "Source": "W:\\DEV\\hotel-api-rs\\db\\db.sqlite", + "Destination": "/app/db/db.sqlite", + "Mode": "", + "RW": true, + "Propagation": "rprivate" + } + ], + +GOOD + + "Mounts": [ + { + "Type": "bind", + "Source": "/w/DEV/hotel-api-rs/db", + "Destination": "/app/db", + "Mode": "", + "RW": true, + "Propagation": "rprivate" + } + ], \ No newline at end of file