diff --git a/.env b/.env index c35b20c..c605cb1 100644 --- a/.env +++ b/.env @@ -1,4 +1,5 @@ DATABASE_URL=postgresql://mmap:yjhcfzXWrzslzl1331@8.217.64.157:5433/mmap JWT_SECRET="JvGpWgGWLHAhvhxN7BuOVtUWfMXm6xAqjClaTwOcAnI=" RUST_LOG=debug -PORT=3050 \ No newline at end of file +PORT=3050 +TILE_SERVER="http://127.0.0.1:3060/api" \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index a22c379..afef22c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,6 +27,17 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "version_check", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -57,6 +68,56 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.59.0", +] + [[package]] name = "argon2" version = "0.5.3" @@ -69,12 +130,70 @@ dependencies = [ "password-hash", ] +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + [[package]] name = "ascii_utils" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71938f30533e4d95a6d17aa530939da3842c2ab6f4f84b9dae68447e4129f74a" +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.3.0", + "futures-lite 2.6.0", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.5.0", + "async-executor", + "async-io 2.5.0", + "async-lock 3.4.0", + "blocking", + "futures-lite 2.6.0", + "once_cell", +] + [[package]] name = "async-graphql" version = "7.0.17" @@ -86,7 +205,7 @@ dependencies = [ "async-graphql-value", "async-stream", "async-trait", - "base64", + "base64 0.22.1", "bytes", "chrono", "fast_chemail", @@ -140,7 +259,7 @@ dependencies = [ "proc-macro2", "quote", "strum", - "syn", + "syn 2.0.104", "thiserror 1.0.69", ] @@ -168,6 +287,90 @@ dependencies = [ "serde_json", ] +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.28", + "slab", + "socket2 0.4.10", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" +dependencies = [ + "async-lock 3.4.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.6.0", + "parking", + "polling 3.9.0", + "rustix 1.0.7", + "slab", + "windows-sys 0.60.2", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-std" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "730294c1c08c2e0f85759590518f6333f0d5a0a766a27d519c1b244c3dfd8a24" +dependencies = [ + "async-channel 1.9.0", + "async-global-executor", + "async-io 2.5.0", + "async-lock 3.4.0", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite 2.6.0", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + [[package]] name = "async-stream" version = "0.3.6" @@ -187,9 +390,15 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "async-trait" version = "0.1.88" @@ -198,7 +407,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -210,12 +419,41 @@ dependencies = [ "num-traits", ] +[[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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "aws-lc-rs" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", +] + [[package]] name = "axum" version = "0.8.4" @@ -224,7 +462,7 @@ checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" dependencies = [ "axum-core", "axum-macros", - "base64", + "base64 0.22.1", "bytes", "form_urlencoded", "futures-util", @@ -247,7 +485,7 @@ dependencies = [ "sha1", "sync_wrapper", "tokio", - "tokio-tungstenite", + "tokio-tungstenite 0.26.2", "tower 0.5.2", "tower-layer", "tower-service", @@ -325,7 +563,33 @@ checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", +] + +[[package]] +name = "axum-reverse-proxy" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84bb2eec9f1a2c150ce1204d843d690db0da305f6f2848cbfd4a840c830b4f0b" +dependencies = [ + "axum", + "base64 0.21.7", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "rand 0.9.2", + "rustls", + "sha1", + "tokio", + "tokio-tungstenite 0.21.0", + "tower 0.5.2", + "tracing", + "url", ] [[package]] @@ -343,6 +607,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" @@ -355,6 +625,48 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +[[package]] +name = "bigdecimal" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a22f228ab7a1b23027ccc6c350b72868017af7ea8356fbdf19f8d991c690013" +dependencies = [ + "autocfg", + "libm", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.9.1", + "cexpr", + "clang-sys", + "itertools", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.104", + "which", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.9.1" @@ -364,6 +676,18 @@ dependencies = [ "serde", ] +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "blake2" version = "0.10.6" @@ -382,12 +706,70 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel 2.5.0", + "async-task", + "futures-io", + "futures-lite 2.6.0", + "piper", +] + +[[package]] +name = "borsh" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "bumpalo" version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "byteorder" version = "1.5.0" @@ -409,9 +791,20 @@ version = "1.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" dependencies = [ + "jobserver", + "libc", "shlex", ] +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.1" @@ -439,6 +832,72 @@ dependencies = [ "windows-link", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed87a9d530bb41a67537289bafcac159cb3ee28460e0a4571123d2a778a6a882" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f4f3f3c77c94aff3c7e9aac9a2ca1974a5adf392a8bb751e827d6d127ab966" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "cmake" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -454,6 +913,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[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" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -530,7 +1009,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.104", ] [[package]] @@ -541,7 +1020,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -602,7 +1081,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -612,7 +1091,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn", + "syn 2.0.104", ] [[package]] @@ -635,7 +1114,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -644,6 +1123,12 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "either" version = "1.15.0" @@ -675,7 +1160,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -689,6 +1174,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "event-listener" version = "5.4.0" @@ -700,6 +1191,16 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.0", + "pin-project-lite", +] + [[package]] name = "fast_chemail" version = "0.9.6" @@ -709,6 +1210,15 @@ dependencies = [ "ascii_utils", ] +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -738,6 +1248,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.1" @@ -747,6 +1272,18 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.3.31" @@ -806,6 +1343,34 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand 2.3.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.31" @@ -814,7 +1379,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -896,6 +1461,43 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "h2" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "handlebars" version = "5.1.2" @@ -910,6 +1512,15 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + [[package]] name = "hashbrown" version = "0.14.5" @@ -936,13 +1547,23 @@ dependencies = [ "hashbrown 0.15.4", ] +[[package]] +name = "hdrhistogram" +version = "7.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" +dependencies = [ + "byteorder", + "num-traits", +] + [[package]] name = "headers" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "headers-core", "http", @@ -960,12 +1581,30 @@ dependencies = [ "http", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + [[package]] name = "hex" version = "0.4.3" @@ -1054,6 +1693,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", + "h2", "http", "http-body", "httparse", @@ -1074,12 +1714,14 @@ dependencies = [ "http", "hyper", "hyper-util", + "log", "rustls", + "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.2", + "webpki-roots", ] [[package]] @@ -1088,7 +1730,7 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-channel", "futures-core", @@ -1100,7 +1742,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -1254,13 +1896,44 @@ dependencies = [ "serde", ] +[[package]] +name = "inherent" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c38228f24186d9cc68c729accb4d413be9eaed6ad07ff79e0270d9e56f3de13" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "io-uring" version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" dependencies = [ - "bitflags", + "bitflags 2.9.1", "cfg-if", "libc", ] @@ -1271,6 +1944,15 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "ipnetwork" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e" +dependencies = [ + "serde", +] + [[package]] name = "iri-string" version = "0.7.8" @@ -1281,12 +1963,37 @@ dependencies = [ "serde", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + [[package]] name = "js-sys" version = "0.3.77" @@ -1303,7 +2010,7 @@ version = "9.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" dependencies = [ - "base64", + "base64 0.22.1", "js-sys", "pem", "ring", @@ -1312,6 +2019,15 @@ dependencies = [ "simple_asn1", ] +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1321,12 +2037,28 @@ dependencies = [ "spin", ] +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "libc" version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +[[package]] +name = "libloading" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +dependencies = [ + "cfg-if", + "windows-targets 0.53.3", +] + [[package]] name = "libm" version = "0.2.15" @@ -1343,6 +2075,18 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + [[package]] name = "linux-raw-sys" version = "0.9.4" @@ -1370,6 +2114,9 @@ name = "log" version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +dependencies = [ + "value-bag", +] [[package]] name = "lru-slab" @@ -1377,6 +2124,16 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +[[package]] +name = "mac_address" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0aeb26bf5e836cc1c341c8106051b573f1766dfa05aa87f0b98be5e51b02303" +dependencies = [ + "nix", + "winapi", +] + [[package]] name = "mapp" version = "0.1.0" @@ -1387,10 +2144,15 @@ dependencies = [ "async-stream", "axum", "axum-jwt-auth", + "axum-reverse-proxy", "chrono", + "clap", "dotenvy", "futures-util", "jsonwebtoken", + "rustls", + "sea-query", + "sea-query-binder", "serde", "sqlx", "tokio", @@ -1423,12 +2185,27 @@ version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1466,6 +2243,46 @@ dependencies = [ "version_check", ] +[[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 2.11.1", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1554,6 +2371,56 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.9.1", + "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 2.0.104", +] + +[[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.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "overload" version = "0.1.1" @@ -1606,7 +2473,7 @@ version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" dependencies = [ - "base64", + "base64 0.22.1", "serde", ] @@ -1656,7 +2523,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -1681,6 +2548,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand 2.3.0", + "futures-io", +] + [[package]] name = "pkcs1" version = "0.7.5" @@ -1708,6 +2586,36 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee9b2fa7a4517d2c91ff5bc6c297a427a96749d15f98fcdbb22c05571a4d4b7" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.5.2", + "pin-project-lite", + "rustix 1.0.7", + "windows-sys 0.60.2", +] + [[package]] name = "potential_utf" version = "0.1.2" @@ -1732,6 +2640,16 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prettyplease" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" +dependencies = [ + "proc-macro2", + "syn 2.0.104", +] + [[package]] name = "proc-macro-crate" version = "3.3.0" @@ -1750,6 +2668,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "quinn" version = "0.11.8" @@ -1761,9 +2699,9 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash", + "rustc-hash 2.1.1", "rustls", - "socket2", + "socket2 0.5.10", "thiserror 2.0.12", "tokio", "tracing", @@ -1781,7 +2719,7 @@ dependencies = [ "lru-slab", "rand 0.9.2", "ring", - "rustc-hash", + "rustc-hash 2.1.1", "rustls", "rustls-pki-types", "slab", @@ -1800,7 +2738,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.5.10", "tracing", "windows-sys 0.59.0", ] @@ -1820,6 +2758,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.8.5" @@ -1885,7 +2829,7 @@ version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" dependencies = [ - "bitflags", + "bitflags 2.9.1", ] [[package]] @@ -1917,13 +2861,22 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + [[package]] name = "reqwest" version = "0.12.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-core", "http", @@ -1952,7 +2905,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.2", + "webpki-roots", ] [[package]] @@ -1969,6 +2922,35 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rsa" version = "0.9.8" @@ -1989,28 +2971,77 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rust_decimal" +version = "1.37.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b203a6425500a03e0919c42d3c47caca51e79f1132046626d2c8871c5092035d" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + [[package]] name = "rustc-demangle" version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc-hash" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +[[package]] +name = "rustix" +version = "0.37.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "519165d378b97752ca44bbe15047d5d3409e875f39327546b42ac81d7e18c1b6" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.9.1", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + [[package]] name = "rustix" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags", + "bitflags 2.9.1", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.9.4", "windows-sys 0.59.0", ] @@ -2020,6 +3051,8 @@ version = "0.23.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" dependencies = [ + "aws-lc-rs", + "log", "once_cell", "ring", "rustls-pki-types", @@ -2028,6 +3061,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.2.0", +] + [[package]] name = "rustls-pki-types" version = "1.12.0" @@ -2044,6 +3089,7 @@ version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -2061,12 +3107,113 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sea-query" +version = "0.32.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64c91783d1514b99754fc6a4079081dcc2c587dadbff65c48c7f62297443536a" +dependencies = [ + "bigdecimal", + "chrono", + "inherent", + "ipnetwork", + "mac_address", + "rust_decimal", + "sea-query-derive", + "serde_json", + "time", + "uuid", +] + +[[package]] +name = "sea-query-binder" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0019f47430f7995af63deda77e238c17323359af241233ec768aba1faea7608" +dependencies = [ + "bigdecimal", + "chrono", + "ipnetwork", + "mac_address", + "rust_decimal", + "sea-query", + "serde_json", + "sqlx", + "time", + "uuid", +] + +[[package]] +name = "sea-query-derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bae0cbad6ab996955664982739354128c58d16e126114fe88c2a493642502aab" +dependencies = [ + "darling", + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.104", + "thiserror 2.0.12", +] + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.1", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.9.1", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "1.0.219" @@ -2084,7 +3231,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -2177,6 +3324,12 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + [[package]] name = "simple_asn1" version = "0.6.3" @@ -2204,6 +3357,16 @@ dependencies = [ "serde", ] +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "socket2" version = "0.5.10" @@ -2252,13 +3415,16 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" dependencies = [ - "base64", + "async-io 1.13.0", + "async-std", + "base64 0.22.1", + "bigdecimal", "bytes", "chrono", "crc", "crossbeam-queue", "either", - "event-listener", + "event-listener 5.4.0", "futures-core", "futures-intrusive", "futures-io", @@ -2266,22 +3432,23 @@ dependencies = [ "hashbrown 0.15.4", "hashlink", "indexmap", + "ipnetwork", "log", + "mac_address", "memchr", + "native-tls", "once_cell", "percent-encoding", - "rustls", + "rust_decimal", "serde", "serde_json", "sha2", "smallvec", "thiserror 2.0.12", - "tokio", - "tokio-stream", + "time", "tracing", "url", "uuid", - "webpki-roots 0.26.11", ] [[package]] @@ -2294,7 +3461,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn", + "syn 2.0.104", ] [[package]] @@ -2303,9 +3470,10 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" dependencies = [ + "async-std", "dotenvy", "either", - "heck", + "heck 0.5.0", "hex", "once_cell", "proc-macro2", @@ -2317,8 +3485,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn", - "tokio", + "syn 2.0.104", "url", ] @@ -2329,8 +3496,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ "atoi", - "base64", - "bitflags", + "base64 0.22.1", + "bigdecimal", + "bitflags 2.9.1", "byteorder", "bytes", "chrono", @@ -2354,6 +3522,7 @@ dependencies = [ "percent-encoding", "rand 0.8.5", "rsa", + "rust_decimal", "serde", "sha1", "sha2", @@ -2361,6 +3530,7 @@ dependencies = [ "sqlx-core", "stringprep", "thiserror 2.0.12", + "time", "tracing", "uuid", "whoami", @@ -2373,8 +3543,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", - "base64", - "bitflags", + "base64 0.22.1", + "bigdecimal", + "bitflags 2.9.1", "byteorder", "chrono", "crc", @@ -2387,12 +3558,16 @@ dependencies = [ "hkdf", "hmac", "home", + "ipnetwork", "itoa", "log", + "mac_address", "md-5", "memchr", + "num-bigint", "once_cell", "rand 0.8.5", + "rust_decimal", "serde", "serde_json", "sha2", @@ -2400,6 +3575,7 @@ dependencies = [ "sqlx-core", "stringprep", "thiserror 2.0.12", + "time", "tracing", "uuid", "whoami", @@ -2426,6 +3602,7 @@ dependencies = [ "serde_urlencoded", "sqlx-core", "thiserror 2.0.12", + "time", "tracing", "url", "uuid", @@ -2475,11 +3652,11 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", "rustversion", - "syn", + "syn 2.0.104", ] [[package]] @@ -2488,6 +3665,17 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.104" @@ -2516,19 +3704,25 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ - "fastrand", + "fastrand 2.3.0", "getrandom 0.3.3", "once_cell", - "rustix", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -2558,7 +3752,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -2569,7 +3763,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -2652,7 +3846,7 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2", + "socket2 0.5.10", "tokio-macros", "windows-sys 0.52.0", ] @@ -2665,7 +3859,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -2689,6 +3883,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-tungstenite" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite 0.21.0", +] + [[package]] name = "tokio-tungstenite" version = "0.26.2" @@ -2698,7 +3904,7 @@ dependencies = [ "futures-util", "log", "tokio", - "tungstenite", + "tungstenite 0.26.2", ] [[package]] @@ -2751,9 +3957,13 @@ checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", + "hdrhistogram", + "indexmap", "pin-project-lite", + "slab", "sync_wrapper", "tokio", + "tokio-util", "tower-layer", "tower-service", "tracing", @@ -2765,7 +3975,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags", + "bitflags 2.9.1", "bytes", "http", "http-body", @@ -2781,7 +3991,7 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags", + "bitflags 2.9.1", "bytes", "futures-util", "http", @@ -2825,7 +4035,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -2869,6 +4079,25 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "tungstenite" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "sha1", + "thiserror 1.0.69", + "url", + "utf-8", +] + [[package]] name = "tungstenite" version = "0.26.2" @@ -2954,6 +4183,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "uuid" version = "1.17.0" @@ -2972,6 +4207,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "value-bag" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" + [[package]] name = "vcpkg" version = "0.2.15" @@ -2984,6 +4225,12 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + [[package]] name = "want" version = "0.3.1" @@ -3036,7 +4283,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 2.0.104", "wasm-bindgen-shared", ] @@ -3071,7 +4318,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3105,15 +4352,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.2", -] - [[package]] name = "webpki-roots" version = "1.0.2" @@ -3123,6 +4361,18 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.44", +] + [[package]] name = "whoami" version = "1.6.0" @@ -3176,7 +4426,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -3187,7 +4437,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -3241,6 +4491,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -3265,13 +4524,30 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -3284,6 +4560,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -3296,6 +4578,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -3308,12 +4596,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -3326,6 +4626,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -3338,6 +4644,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -3350,6 +4662,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -3362,6 +4680,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" version = "0.7.12" @@ -3377,7 +4701,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags", + "bitflags 2.9.1", ] [[package]] @@ -3386,6 +4710,15 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "yoke" version = "0.8.0" @@ -3406,7 +4739,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", "synstructure", ] @@ -3427,7 +4760,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -3447,7 +4780,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", "synstructure", ] @@ -3487,5 +4820,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] diff --git a/Cargo.toml b/Cargo.toml index 78c8899..c83230f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,8 @@ name = "mapp" version = "0.1.0" edition = "2021" +authors = ["Developer "] +description = "基于GraphQL的现代地图应用服务器" [dependencies] async-graphql = { version = "7.0.17", features = ["chrono", "uuid"] } @@ -10,7 +12,7 @@ axum = { version = "0.8.4", features = ["ws", "macros"] } chrono = { version = "0.4", features = ["serde"] } serde = { version = "1.0", features = ["derive"] } sqlx = { version = "0.8", features = [ - "runtime-tokio-rustls", + # "runtime-tokio-rustls", "postgres", "chrono", "uuid", @@ -28,3 +30,20 @@ futures-util = "0.3" tower = "0.4" async-stream = "0.3" axum-jwt-auth = "0.5.1" +sea-query = "0.32.6" +sea-query-binder = {version = "0.7.0",features = [ + "sqlx-postgres", + "with-chrono", + "with-json", + "with-rust_decimal", + "with-bigdecimal", + "with-uuid", + "with-time", + "with-ipnetwork", + "with-mac_address", + "runtime-async-std-native-tls", +]} +axum-reverse-proxy = "1.0.3" +rustls = { version = "0.23", features = ["aws-lc-rs"] } +clap = { version = "4.0", features = ["derive"] } + diff --git a/migrations/005_init_datainfo.sql b/migrations/005_init_datainfo.sql new file mode 100644 index 0000000..64ae34c --- /dev/null +++ b/migrations/005_init_datainfo.sql @@ -0,0 +1,59 @@ +-- Add migration script here +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + +-- 数据入库记录表 +CREATE TABLE IF NOT EXISTS data_ingestion ( + id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + ingestion_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + data_time TIMESTAMP NOT NULL, + source VARCHAR(25) NOT NULL, + storage_url TEXT NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- 添加字段注释 +COMMENT ON COLUMN data_ingestion.id IS '数据唯一标识符'; +COMMENT ON COLUMN data_ingestion.ingestion_time IS '入库时间'; +COMMENT ON COLUMN data_ingestion.data_time IS '数据表示的时间'; +COMMENT ON COLUMN data_ingestion.source IS '存放源/数据来源'; +COMMENT ON COLUMN data_ingestion.storage_url IS '存放URL或路径'; + +-- 为快速查找创建索引 +CREATE INDEX IF NOT EXISTS idx_data_ingestion_ingestion_time ON data_ingestion(ingestion_time); +CREATE INDEX IF NOT EXISTS idx_data_ingestion_id_ingestion_time ON data_ingestion(id, ingestion_time); +CREATE INDEX IF NOT EXISTS idx_data_ingestion_data_time ON data_ingestion(data_time); +CREATE INDEX IF NOT EXISTS idx_data_ingestion_source ON data_ingestion(source); + +-- 可选的复合索引(根据实际查询需求启用) +-- 如果经常按时间范围+来源查询,取消注释下面的索引 +-- CREATE INDEX IF NOT EXISTS idx_data_ingestion_data_time_source ON data_ingestion(data_time, source); +-- CREATE INDEX IF NOT EXISTS idx_data_ingestion_source_data_time ON data_ingestion(source, data_time); + +-- 创建更新时间自动更新的触发器函数 +CREATE OR REPLACE FUNCTION update_updated_at_column() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = CURRENT_TIMESTAMP; + RETURN NEW; +END; +$$ language 'plpgsql'; + +-- 为表创建更新时间触发器 +CREATE TRIGGER update_data_ingestion_updated_at + BEFORE UPDATE ON data_ingestion + FOR EACH ROW + EXECUTE FUNCTION update_updated_at_column(); + +-- 创建用于查询的视图(可选) +CREATE OR REPLACE VIEW v_data_ingestion_summary AS +SELECT + id, + source, + COUNT(*) as record_count, + MIN(data_time) as earliest_data_time, + MAX(data_time) as latest_data_time, + MIN(ingestion_time) as first_ingestion_time, + MAX(ingestion_time) as last_ingestion_time +FROM data_ingestion +GROUP BY id, source; \ No newline at end of file diff --git a/src/app.rs b/src/app.rs index 8b91b6d..20bafdb 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,3 +1,4 @@ +use axum_reverse_proxy::ReverseProxy; use std::sync::Arc; use async_graphql::{ @@ -64,11 +65,12 @@ pub fn create_router(pool: PgPool, config: Config) -> Router { }, }; + let router = ReverseProxy::new("/api", &config.tile_server_url.as_str()); Router::new() .route("/", get(graphql_playground)) .route("/graphql", get(graphql_playground).post(graphql_handler)) - // .route("/ws", get(graphql_subscription_handler)) .layer(CorsLayer::permissive()) + .merge(router) .with_state(app_state) } diff --git a/src/cli.rs b/src/cli.rs new file mode 100644 index 0000000..7acc009 --- /dev/null +++ b/src/cli.rs @@ -0,0 +1,68 @@ +use clap::{Args, Parser, Subcommand}; +use std::net::IpAddr; + +#[derive(Parser)] +#[command(author, version, about, long_about = None)] +#[command(name = "mapp")] +#[command(about = "Map应用服务器 - 一个基于GraphQL的地图应用服务器")] +pub struct Cli { + #[command(subcommand)] + pub command: Option, +} + +#[derive(Subcommand)] +pub enum Commands { + /// 启动GraphQL服务器 + Serve(ServeArgs), + /// 运行数据库迁移 + Migrate(MigrateArgs), + /// 显示版本信息 + Version, + /// 显示配置信息 + Config, +} + +#[derive(Args)] +pub struct ServeArgs { + /// 服务器监听端口 + #[arg(short, long, value_name = "PORT")] + pub port: Option, + + /// 服务器监听IP地址 + #[arg(short, long, value_name = "IP", default_value = "0.0.0.0")] + pub host: IpAddr, + + /// 是否启用开发模式 + #[arg(short, long)] + pub dev: bool, + + /// 是否启用详细日志 + #[arg(short, long)] + pub verbose: bool, +} + +#[derive(Args)] +pub struct MigrateArgs { + /// 要迁移到的特定版本 + #[arg(short, long, value_name = "VERSION")] + pub version: Option, + + /// 只显示迁移状态,不执行迁移 + #[arg(short, long)] + pub dry_run: bool, + + /// 强制重新运行所有迁移 + #[arg(short, long)] + pub force: bool, +} + +impl Default for Commands { + fn default() -> Self { + Commands::Serve(ServeArgs { + port: None, + host: "0.0.0.0".parse().unwrap(), + dev: false, + verbose: false, + }) + } +} diff --git a/src/config.rs b/src/config.rs index 31903e2..02fffb1 100644 --- a/src/config.rs +++ b/src/config.rs @@ -5,12 +5,13 @@ pub struct Config { pub database_url: String, pub jwt_secret: String, pub port: u16, + pub tile_server_url: String, } impl Config { pub fn from_env() -> Result { dotenvy::dotenv().ok(); - + Ok(Config { database_url: env::var("DATABASE_URL")?, jwt_secret: env::var("JWT_SECRET")?, @@ -18,6 +19,7 @@ impl Config { .unwrap_or_else(|_| "3000".to_string()) .parse() .unwrap_or(3000), + tile_server_url: env::var("TILE_SERVER")?, }) } -} \ No newline at end of file +} diff --git a/src/graphql/query.rs b/src/graphql/query.rs index f42a65f..b3797be 100644 --- a/src/graphql/query.rs +++ b/src/graphql/query.rs @@ -2,7 +2,7 @@ use crate::auth::get_auth_user; use crate::graphql::guards::RequireRole; use crate::graphql::types::UserInfoRespnose; use crate::models::invite_code::InviteCode; -use crate::models::user::{Role, User}; +use crate::models::user::{Role, User, UserInfoRow}; use crate::services::invite_code_service::InviteCodeService; use crate::services::user_service::UserService; use async_graphql::{Context, Object, Result}; @@ -36,11 +36,12 @@ impl QueryRoot { async fn users( &self, ctx: &Context<'_>, - offset: Option, - limit: Option, + offset: Option, + limit: Option, sort_by: Option, sort_order: Option, - ) -> Result> { + filter: Option, + ) -> Result> { let user_service = ctx.data::()?; info!("users im here"); let offset = offset.unwrap_or(0); @@ -48,7 +49,7 @@ impl QueryRoot { let sort_by = sort_by.unwrap_or("created_at".to_string()); let sort_order = sort_order.unwrap_or("desc".to_string()); user_service - .get_all_users(offset, limit, sort_by, sort_order) + .get_all_users(offset, limit, sort_by, sort_order, filter) .await } @@ -73,18 +74,20 @@ impl QueryRoot { async fn users_info( &self, ctx: &Context<'_>, - offset: Option, - limit: Option, + offset: Option, + limit: Option, + sort_by: Option, + sort_order: Option, + filter: Option, ) -> Result { let user_service = ctx.data::()?; let offset = offset.unwrap_or(0); let limit = limit.unwrap_or(20); - - let sort_by = "created_at"; - let sort_order = "desc"; + let sort_by = sort_by.unwrap_or("created_at".to_string()); + let sort_order = sort_order.unwrap_or("desc".to_string()); user_service - .users_info(offset, limit, sort_by, sort_order) + .users_info(offset, limit, sort_by, sort_order, filter) .await } } diff --git a/src/graphql/types.rs b/src/graphql/types.rs index 2e1a355..1374b9a 100644 --- a/src/graphql/types.rs +++ b/src/graphql/types.rs @@ -68,5 +68,5 @@ pub struct UserInfoRespnose { pub total_admin_users: i64, pub total_user_users: i64, - pub users: Vec, + pub users: Vec, } diff --git a/src/main.rs b/src/main.rs index 793f1aa..e5b3c1d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ mod app; mod auth; +mod cli; mod config; mod db; mod graphql; @@ -7,30 +8,236 @@ mod models; mod services; use app::create_router; +use clap::Parser; +use cli::{Cli, Commands, MigrateArgs, ServeArgs}; use config::Config; use db::{create_pool, run_migrations}; +use rustls; +use std::process; #[tokio::main] async fn main() -> Result<(), Box> { - tracing_subscriber::fmt::init(); + let cli = Cli::parse(); - let config = Config::from_env()?; + match cli.command.unwrap_or_default() { + Commands::Serve(args) => serve_command(args).await, + Commands::Migrate(args) => migrate_command(args).await, + Commands::Version => version_command(), + Commands::Config => config_command(), + } +} + +async fn serve_command(args: ServeArgs) -> Result<(), Box> { + // 初始化日志 + let log_level = if args.verbose { + tracing::Level::DEBUG + } else if args.dev { + tracing::Level::INFO + } else { + tracing::Level::WARN + }; + + tracing_subscriber::fmt() + .with_max_level(log_level) + .with_target(args.verbose) + .with_thread_ids(args.verbose) + .with_file(args.verbose) + .with_line_number(args.verbose) + .init(); + + // 打印启动横幅 + print_banner(); + + // 显示模式信息 + if args.dev { + println!("🔧 运行模式: 开发模式"); + } else { + println!("🚀 运行模式: 生产模式"); + } + + if args.verbose { + println!("📝 日志级别: 详细 (DEBUG)"); + } else if args.dev { + println!("📝 日志级别: 信息 (INFO)"); + } else { + println!("📝 日志级别: 警告 (WARN)"); + } + + rustls::crypto::aws_lc_rs::default_provider() + .install_default() + .map_err(|_| "Failed to install rustls crypto provider")?; + + let mut config = Config::from_env()?; + + // 命令行参数覆盖配置文件 + if let Some(port) = args.port { + config.port = port; + } + + // 显示配置信息 + print_config_info(&config, &args); + println!(); + + println!("🔗 正在连接数据库..."); let pool = create_pool(&config.database_url).await?; + println!("✅ 数据库连接成功"); - run_migrations(&pool).await?; + // 自动运行迁移 + if args.dev { + println!("🗄️ 开发模式:自动运行数据库迁移"); + run_migrations(&pool).await?; + println!("✅ 数据库迁移完成"); + } + println!("⚙️ 正在创建GraphQL路由..."); let router = create_router(pool, config.clone()); - let listener = tokio::net::TcpListener::bind(&format!("0.0.0.0:{}", config.port)).await?; + let bind_addr = format!("{}:{}", args.host, config.port); + println!("🔌 正在绑定到地址: {}", bind_addr); + let listener = tokio::net::TcpListener::bind(&bind_addr).await?; - tracing::info!("GraphQL server running on http://0.0.0.0:{}", config.port); - tracing::info!( - "GraphiQL playground: http://0.0.0.0:{}/graphql", - config.port - ); - tracing::info!("WebSocket subscriptions: ws://0.0.0.0:{}/ws", config.port); + println!(); + println!("🎉 服务器启动成功!"); + + if args.dev { + println!("💡 提示: 使用 Ctrl+C 停止服务器"); + } + + tracing::info!("服务器正在监听 {}", bind_addr); axum::serve(listener, router).await?; Ok(()) } + +async fn migrate_command(args: MigrateArgs) -> Result<(), Box> { + tracing_subscriber::fmt() + .with_max_level(tracing::Level::INFO) + .init(); + + println!("🗄️ 数据库迁移工具"); + println!("━━━━━━━━━━━━━━━━━"); + + let config = Config::from_env()?; + println!("📡 连接数据库: {}", mask_database_url(&config.database_url)); + let pool = create_pool(&config.database_url).await?; + println!("✅ 数据库连接成功"); + + if args.dry_run { + println!("🔍 检查数据库迁移状态..."); + // 这里可以添加检查迁移状态的逻辑 + println!("✅ 数据库迁移状态检查完成"); + return Ok(()); + } + + println!("⚡ 开始运行数据库迁移..."); + run_migrations(&pool).await?; + println!("🎉 数据库迁移完成!"); + + Ok(()) +} + +fn version_command() -> Result<(), Box> { + println!(); + println!("🗺️ Map Application Server"); + println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━"); + println!("📦 版本: {}", env!("CARGO_PKG_VERSION")); + println!( + "🏗️ 构建时间: {}", + option_env!("VERGEN_BUILD_TIMESTAMP").unwrap_or("未知") + ); + println!( + "🔗 Git提交: {}", + option_env!("VERGEN_GIT_SHA").unwrap_or("未知") + ); + println!( + "🦀 Rust版本: {}", + option_env!("VERGEN_RUSTC_SEMVER").unwrap_or("未知") + ); + println!("👨‍💻 作者: {}", env!("CARGO_PKG_AUTHORS")); + println!("📝 描述: {}", env!("CARGO_PKG_DESCRIPTION")); + println!(); + Ok(()) +} + +fn config_command() -> Result<(), Box> { + match Config::from_env() { + Ok(config) => { + println!(); + println!("⚙️ 应用配置信息"); + println!("━━━━━━━━━━━━━━━━━"); + println!("🌐 服务端口: {}", config.port); + println!("🗄️ 数据库URL: {}", mask_database_url(&config.database_url)); + println!( + "🔐 JWT密钥: {}", + if config.jwt_secret.is_empty() { + "❌ 未设置" + } else { + "✅ 已设置" + } + ); + println!("🗺️ 瓦片服务器: {}", config.tile_server_url); + println!(); + println!("💡 提示: 配置通过环境变量加载"); + println!(" DATABASE_URL, JWT_SECRET, PORT, TILE_SERVER"); + } + Err(e) => { + eprintln!(); + eprintln!("❌ 配置加载失败"); + eprintln!("━━━━━━━━━━━━━━━━"); + eprintln!("错误: {}", e); + eprintln!(); + eprintln!("💡 请检查以下环境变量是否正确设置:"); + eprintln!(" - DATABASE_URL: PostgreSQL连接字符串"); + eprintln!(" - JWT_SECRET: JWT签名密钥"); + eprintln!(" - PORT: 服务器端口 (可选,默认3000)"); + eprintln!(" - TILE_SERVER: 瓦片服务器URL"); + eprintln!(); + process::exit(1); + } + } + Ok(()) +} + +fn mask_database_url(url: &str) -> String { + if let Some(at_pos) = url.find('@') { + if let Some(scheme_end) = url.find("://") { + let scheme = &url[..scheme_end + 3]; + let rest = &url[at_pos..]; + format!("{}***{}", scheme, rest) + } else { + "***".to_string() + } + } else { + url.to_string() + } +} + +fn print_banner() { + println!(); + println!("███╗ ███╗ █████╗ ██████╗ ██████╗ "); + println!("████╗ ████║██╔══██╗██╔══██╗██╔══██╗"); + println!("██╔████╔██║███████║██████╔╝██████╔╝"); + println!("██║╚██╔╝██║██╔══██║██╔═══╝ ██╔═══╝ "); + println!("██║ ╚═╝ ██║██║ ██║██║ ██║ "); + println!("╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ "); + println!(); + println!("🗺️ Map Application Server v{}", env!("CARGO_PKG_VERSION")); + println!(" 基于GraphQL的现代地图应用服务器"); + println!(); +} + +fn print_config_info(config: &Config, args: &ServeArgs) { + println!("📋 配置信息:"); + println!(" 🌐 服务地址: {}:{}", args.host, config.port); + println!(" 🗄️ 数据库: {}", mask_database_url(&config.database_url)); + println!( + " 🔐 JWT密钥: {}", + if config.jwt_secret.is_empty() { + "❌ 未设置" + } else { + "✅ 已配置" + } + ); + println!(" 🗺️ 瓦片服务: {}", config.tile_server_url); +} diff --git a/src/models/user.rs b/src/models/user.rs index b944971..c28e211 100644 --- a/src/models/user.rs +++ b/src/models/user.rs @@ -1,5 +1,6 @@ use async_graphql::{Enum, SimpleObject}; use chrono::{DateTime, Utc}; +use sea_query::Iden; use serde::{Deserialize, Serialize}; use sqlx::FromRow; use uuid::Uuid; @@ -45,3 +46,43 @@ pub struct LoginInput { pub username: String, pub password: String, } + +#[derive(Iden, PartialEq, Eq)] +pub enum Users { + Table, + Id, + Username, + Email, + Role, + IsActivate, + CreatedAt, + UpdatedAt, +} + +impl TryFrom for Users { + type Error = async_graphql::Error; + + fn try_from(value: String) -> Result { + match value.as_str() { + "id" => Ok(Users::Id), + "username" => Ok(Users::Username), + "email" => Ok(Users::Email), + "role" => Ok(Users::Role), + "is_activate" => Ok(Users::IsActivate), + "created_at" => Ok(Users::CreatedAt), + "updated_at" => Ok(Users::UpdatedAt), + _ => Err(async_graphql::Error::new("Invalid column name")), + } + } +} + +#[derive(sqlx::FromRow, Debug, SimpleObject)] +pub struct UserInfoRow { + pub id: Uuid, + pub username: String, + pub email: String, + pub role: Role, + pub is_activate: bool, + pub created_at: DateTime, + pub updated_at: DateTime, +} diff --git a/src/services/invite_code_service.rs b/src/services/invite_code_service.rs index 49001dd..8d9cbc3 100644 --- a/src/services/invite_code_service.rs +++ b/src/services/invite_code_service.rs @@ -5,7 +5,7 @@ use uuid::Uuid; use crate::{ graphql::types::CreateInviteCodeInput, - models::invite_code::{InviteCode, UseInviteCodeInput, ValidateInviteCodeInput}, + models::invite_code::{InviteCode, ValidateInviteCodeInput}, }; pub struct InviteCodeService { @@ -41,7 +41,10 @@ impl InviteCodeService { let invite_code = sqlx::query_as!( InviteCode, r#" - SELECT id, code, created_by, used_by, is_used, expires_at, created_at, used_at + SELECT id, code, created_by, used_by, is_used, + expires_at as "expires_at: chrono::DateTime", + created_at as "created_at: chrono::DateTime", + used_at as "used_at: chrono::DateTime" FROM invite_codes WHERE code = $1 "#, @@ -97,7 +100,10 @@ impl InviteCodeService { let invite_codes = sqlx::query_as!( InviteCode, r#" - SELECT id, code, created_by, used_by, is_used, expires_at, created_at, used_at + SELECT id, code, created_by, used_by, is_used, + expires_at as "expires_at: chrono::DateTime", + created_at as "created_at: chrono::DateTime", + used_at as "used_at: chrono::DateTime" FROM invite_codes WHERE created_by = $1 ORDER BY created_at DESC @@ -115,7 +121,10 @@ impl InviteCodeService { let invite_code = sqlx::query_as!( InviteCode, r#" - SELECT id, code, created_by, used_by, is_used, expires_at, created_at, used_at + SELECT id, code, created_by, used_by, is_used, + expires_at as "expires_at: chrono::DateTime", + created_at as "created_at: chrono::DateTime", + used_at as "used_at: chrono::DateTime" FROM invite_codes WHERE id = $1 "#, diff --git a/src/services/user_service.rs b/src/services/user_service.rs index afe1649..38a066b 100644 --- a/src/services/user_service.rs +++ b/src/services/user_service.rs @@ -1,6 +1,8 @@ use argon2::password_hash::{rand_core::OsRng, SaltString}; use argon2::{Argon2, PasswordHash, PasswordHasher, PasswordVerifier}; use async_graphql::{Error, Result}; +use sea_query::{Expr, PostgresQueryBuilder}; +use sea_query_binder::SqlxBinder; use sqlx::PgPool; use tracing::info; use uuid::Uuid; @@ -10,6 +12,7 @@ use crate::graphql::types::{ CreateUserInput, LoginInput, LoginResponse, RegisterInput, UserInfoRespnose, }; use crate::models::user::{Role, User}; + use crate::services::invite_code_service::InviteCodeService; use crate::services::system_config_service::SystemConfigService; @@ -48,7 +51,9 @@ impl UserService { r#" INSERT INTO users (username, email, password_hash, role, is_activate) VALUES ($1, $2, $3, $4, $5) - RETURNING id, username, email, password_hash, role as "role: Role", invite_code_id, is_activate, created_at, updated_at + RETURNING id, username, email, password_hash, role as "role: Role", invite_code_id, is_activate, + created_at as "created_at: chrono::DateTime", + updated_at as "updated_at: chrono::DateTime" "#, input.username, input.email, @@ -87,7 +92,9 @@ impl UserService { User, r#" UPDATE users SET invite_code_id = $1 WHERE id = $2 - RETURNING id, username, email, password_hash, role as "role: Role", invite_code_id, is_activate, created_at, updated_at + RETURNING id, username, email, password_hash, role as "role: Role", invite_code_id, is_activate, + created_at as "created_at: chrono::DateTime", + updated_at as "updated_at: chrono::DateTime" "#, invite_code_id, user.id @@ -114,7 +121,9 @@ impl UserService { r#" INSERT INTO users (username, email, password_hash, role, is_activate) VALUES ($1, $2, $3, $4, $5) - RETURNING id, username, email, password_hash, role as "role: Role", invite_code_id, is_activate, created_at, updated_at + RETURNING id, username, email, password_hash, role as "role: Role", invite_code_id, is_activate, + created_at as "created_at: chrono::DateTime", + updated_at as "updated_at: chrono::DateTime" "#, input.username, input.email, @@ -139,7 +148,9 @@ impl UserService { let user = sqlx::query_as!( User, r#" - SELECT id, username, email, password_hash, role as "role: Role", invite_code_id, is_activate, created_at, updated_at + SELECT id, username, email, password_hash, role as "role: Role", invite_code_id, is_activate, + created_at as "created_at: chrono::DateTime", + updated_at as "updated_at: chrono::DateTime" FROM users WHERE username = $1 "#, input.username @@ -165,7 +176,9 @@ impl UserService { let user = sqlx::query_as!( User, r#" - SELECT id, username, email, password_hash, role as "role: Role", invite_code_id, is_activate, created_at, updated_at + SELECT id, username, email, password_hash, role as "role: Role", invite_code_id, is_activate, + created_at as "created_at: chrono::DateTime", + updated_at as "updated_at: chrono::DateTime" FROM users WHERE id = $1 "#, id @@ -179,32 +192,46 @@ impl UserService { pub async fn get_all_users( &self, - offset: i64, - limit: i64, + offset: u64, + limit: u64, sort_by: String, sort_order: String, - ) -> Result> { - // 验证排序字段,防止SQL注入 - let sort_by = match sort_by.as_str() { - "username" | "email" | "created_at" | "updated_at" | "role" | "is_activate" => sort_by, - _ => "created_at".to_string(), // 默认排序字段 + filter: Option, + ) -> Result> { + use crate::models::user::Users; + use sea_query::{Expr, Order, Query}; + let sort_by = Users::try_from(sort_by)?; + let sort_order = if sort_order == "asc" { + Order::Asc + } else { + Order::Desc }; - let sort_order = if sort_order == "asc" { "ASC" } else { "DESC" }; + let (sql, values) = Query::select() + .columns([ + Users::Id, + Users::Username, + Users::Email, + Users::Role, + Users::IsActivate, + Users::CreatedAt, + Users::UpdatedAt, + ]) + .from(Users::Table) + .and_where_option(filter.map(|r| Expr::col(Users::Role).eq(r))) + .order_by(sort_by, sort_order) + .limit(limit) + .offset(offset) + .build_sqlx(PostgresQueryBuilder); - // 动态构建SQL查询,因为列名和排序方向不能参数化 - let query = format!( - r#"SELECT id, username, email, password_hash, role as "role: Role", invite_code_id, is_activate, created_at, updated_at FROM users ORDER BY {} {} LIMIT $1 OFFSET $2"#, - sort_by, sort_order - ); + info!("sql: {:?}", sql); + info!("values: {:?}", values); - let users = sqlx::query_as!(User, &query, limit, offset) + let users = sqlx::query_as_with::<_, crate::models::user::UserInfoRow, _>(&sql, values) .fetch_all(&self.pool) .await .map_err(|e| Error::new(format!("Database error: {}", e)))?; - info!("users: {:?}", users); - Ok(users) } @@ -245,7 +272,9 @@ impl UserService { r#" INSERT INTO users (username, email, password_hash, role, is_activate) VALUES ($1, $2, $3, $4, $5) - RETURNING id, username, email, password_hash, role as "role: Role", invite_code_id, is_activate, created_at, updated_at + RETURNING id, username, email, password_hash, role as "role: Role", invite_code_id, is_activate, + created_at as "created_at: chrono::DateTime", + updated_at as "updated_at: chrono::DateTime" "#, username, email, @@ -298,52 +327,43 @@ impl UserService { pub async fn users_info( &self, - offset: i64, - limit: i64, + offset: u64, + limit: u64, sort_by: impl Into, sort_order: impl Into, + filter: Option>, ) -> Result { let sort_by = sort_by.into(); let sort_order = sort_order.into(); + let filter = filter.map(|f| f.into()); - let total_users = sqlx::query_scalar!(r#"SELECT COUNT(*) FROM users"#) - .fetch_one(&self.pool) - .await - .map_err(|e| Error::new(format!("Database error: {}", e)))?; + let stats = sqlx::query!( + r#" + SELECT + COUNT(*) as total_users, + COUNT(CASE WHEN is_activate = true THEN 1 END) as total_active_users, + COUNT(CASE WHEN is_activate = false THEN 1 END) as total_inactive_users, + COUNT(CASE WHEN role = 'Admin' THEN 1 END) as total_admin_users, + COUNT(CASE WHEN role = 'User' THEN 1 END) as total_user_users + FROM users + "# + ) + .fetch_one(&self.pool) + .await + .map_err(|e| Error::new(format!("Database error: {}", e)))?; - let total_active_users = - sqlx::query_scalar!(r#"SELECT COUNT(*) FROM users WHERE is_activate = true"#) - .fetch_one(&self.pool) - .await - .map_err(|e| Error::new(format!("Database error: {}", e)))?; - - let total_inactive_users = - sqlx::query_scalar!(r#"SELECT COUNT(*) FROM users WHERE is_activate = false"#) - .fetch_one(&self.pool) - .await - .map_err(|e| Error::new(format!("Database error: {}", e)))?; - - let total_admin_users = - sqlx::query_scalar!(r#"SELECT COUNT(*) FROM users WHERE role = 'Admin'"#) - .fetch_one(&self.pool) - .await - .map_err(|e| Error::new(format!("Database error: {}", e)))?; - - let total_user_users = - sqlx::query_scalar!(r#"SELECT COUNT(*) FROM users WHERE role = 'user'"#) - .fetch_one(&self.pool) - .await - .map_err(|e| Error::new(format!("Database error: {}", e)))?; - - let users = self.get_all_users(offset, limit, sort_by, sort_order).await; + // 并行获取用户列表 + let users = self + .get_all_users(offset, limit, sort_by, sort_order, filter) + .await?; Ok(UserInfoRespnose { - total_users: total_users.unwrap_or(0), - total_active_users: total_active_users.unwrap_or(0), - total_inactive_users: total_inactive_users.unwrap_or(0), - total_admin_users: total_admin_users.unwrap_or(0), - total_user_users: total_user_users.unwrap_or(0), - users: users.unwrap_or_default(), + total_users: stats.total_users.unwrap_or(0), + total_active_users: stats.total_active_users.unwrap_or(0), + total_inactive_users: stats.total_inactive_users.unwrap_or(0), + total_admin_users: stats.total_admin_users.unwrap_or(0), + total_user_users: stats.total_user_users.unwrap_or(0), + users, }) } }