From bc6ede32b960d46a70a7a7a6a61fe0a322440543 Mon Sep 17 00:00:00 2001 From: StNicolay Date: Fri, 14 Mar 2025 18:46:24 +0300 Subject: [PATCH] Added search --- ...d98bf5e1223c97e13365d6e038ad38c27da97.json | 64 +++++ ...3cec252dca6be4d7e6e60431d2443f174f0dd.json | 24 ++ ...457b87af81437de825e04e8dd1adecac93035.json | 24 ++ ...5e8c3854a734d3c261dc95c3e0794ed554df7.json | 64 +++++ ...8599a3ddfeefd338ba6ebe0f0197fa7af8e10.json | 24 ++ Cargo.lock | 254 +++++++++--------- Cargo.toml | 1 + sql/search_accounts.sql | 8 + src/dispatching/default.rs | 49 +++- src/entity/account.rs | 70 +++-- 10 files changed, 431 insertions(+), 151 deletions(-) create mode 100644 .sqlx/query-08f83b456815ff1a67216760eacd98bf5e1223c97e13365d6e038ad38c27da97.json create mode 100644 .sqlx/query-2ba08d88b7d49ff8042d463f8e93cec252dca6be4d7e6e60431d2443f174f0dd.json create mode 100644 .sqlx/query-a3fc391326beccf9a6763a6470d457b87af81437de825e04e8dd1adecac93035.json create mode 100644 .sqlx/query-b043677068be951bdd2414112fd5e8c3854a734d3c261dc95c3e0794ed554df7.json create mode 100644 .sqlx/query-e998a36bc4951f4eabbe4fc79628599a3ddfeefd338ba6ebe0f0197fa7af8e10.json create mode 100644 sql/search_accounts.sql diff --git a/.sqlx/query-08f83b456815ff1a67216760eacd98bf5e1223c97e13365d6e038ad38c27da97.json b/.sqlx/query-08f83b456815ff1a67216760eacd98bf5e1223c97e13365d6e038ad38c27da97.json new file mode 100644 index 0000000..5a02af4 --- /dev/null +++ b/.sqlx/query-08f83b456815ff1a67216760eacd98bf5e1223c97e13365d6e038ad38c27da97.json @@ -0,0 +1,64 @@ +{ + "db_name": "MySQL", + "query": "SELECT * FROM account WHERE user_id = ? AND name = ?", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "user_id", + "type_info": { + "type": "LongLong", + "flags": "NOT_NULL | PRIMARY_KEY | UNSIGNED | NO_DEFAULT_VALUE", + "max_size": 20 + } + }, + { + "ordinal": 1, + "name": "name", + "type_info": { + "type": "VarString", + "flags": "NOT_NULL | PRIMARY_KEY | NO_DEFAULT_VALUE", + "max_size": 1020 + } + }, + { + "ordinal": 2, + "name": "salt", + "type_info": { + "type": "String", + "flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE", + "max_size": 64 + } + }, + { + "ordinal": 3, + "name": "enc_login", + "type_info": { + "type": "VarString", + "flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE", + "max_size": 256 + } + }, + { + "ordinal": 4, + "name": "enc_password", + "type_info": { + "type": "VarString", + "flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE", + "max_size": 256 + } + } + ], + "parameters": { + "Right": 2 + }, + "nullable": [ + false, + false, + false, + false, + false + ] + }, + "hash": "08f83b456815ff1a67216760eacd98bf5e1223c97e13365d6e038ad38c27da97" +} diff --git a/.sqlx/query-2ba08d88b7d49ff8042d463f8e93cec252dca6be4d7e6e60431d2443f174f0dd.json b/.sqlx/query-2ba08d88b7d49ff8042d463f8e93cec252dca6be4d7e6e60431d2443f174f0dd.json new file mode 100644 index 0000000..0b102ff --- /dev/null +++ b/.sqlx/query-2ba08d88b7d49ff8042d463f8e93cec252dca6be4d7e6e60431d2443f174f0dd.json @@ -0,0 +1,24 @@ +{ + "db_name": "MySQL", + "query": "SELECT salt FROM account WHERE user_id = ? AND name = ?", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "salt", + "type_info": { + "type": "String", + "flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE", + "max_size": 64 + } + } + ], + "parameters": { + "Right": 2 + }, + "nullable": [ + false + ] + }, + "hash": "2ba08d88b7d49ff8042d463f8e93cec252dca6be4d7e6e60431d2443f174f0dd" +} diff --git a/.sqlx/query-a3fc391326beccf9a6763a6470d457b87af81437de825e04e8dd1adecac93035.json b/.sqlx/query-a3fc391326beccf9a6763a6470d457b87af81437de825e04e8dd1adecac93035.json new file mode 100644 index 0000000..3825918 --- /dev/null +++ b/.sqlx/query-a3fc391326beccf9a6763a6470d457b87af81437de825e04e8dd1adecac93035.json @@ -0,0 +1,24 @@ +{ + "db_name": "MySQL", + "query": "SELECT name FROM account WHERE user_id = ? ORDER BY name", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "name", + "type_info": { + "type": "VarString", + "flags": "NOT_NULL | PRIMARY_KEY | NO_DEFAULT_VALUE", + "max_size": 1020 + } + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false + ] + }, + "hash": "a3fc391326beccf9a6763a6470d457b87af81437de825e04e8dd1adecac93035" +} diff --git a/.sqlx/query-b043677068be951bdd2414112fd5e8c3854a734d3c261dc95c3e0794ed554df7.json b/.sqlx/query-b043677068be951bdd2414112fd5e8c3854a734d3c261dc95c3e0794ed554df7.json new file mode 100644 index 0000000..abd10d0 --- /dev/null +++ b/.sqlx/query-b043677068be951bdd2414112fd5e8c3854a734d3c261dc95c3e0794ed554df7.json @@ -0,0 +1,64 @@ +{ + "db_name": "MySQL", + "query": "SELECT * FROM account WHERE user_id = ?", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "user_id", + "type_info": { + "type": "LongLong", + "flags": "NOT_NULL | PRIMARY_KEY | UNSIGNED | NO_DEFAULT_VALUE", + "max_size": 20 + } + }, + { + "ordinal": 1, + "name": "name", + "type_info": { + "type": "VarString", + "flags": "NOT_NULL | PRIMARY_KEY | NO_DEFAULT_VALUE", + "max_size": 1020 + } + }, + { + "ordinal": 2, + "name": "salt", + "type_info": { + "type": "String", + "flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE", + "max_size": 64 + } + }, + { + "ordinal": 3, + "name": "enc_login", + "type_info": { + "type": "VarString", + "flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE", + "max_size": 256 + } + }, + { + "ordinal": 4, + "name": "enc_password", + "type_info": { + "type": "VarString", + "flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE", + "max_size": 256 + } + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false, + false, + false + ] + }, + "hash": "b043677068be951bdd2414112fd5e8c3854a734d3c261dc95c3e0794ed554df7" +} diff --git a/.sqlx/query-e998a36bc4951f4eabbe4fc79628599a3ddfeefd338ba6ebe0f0197fa7af8e10.json b/.sqlx/query-e998a36bc4951f4eabbe4fc79628599a3ddfeefd338ba6ebe0f0197fa7af8e10.json new file mode 100644 index 0000000..8400a53 --- /dev/null +++ b/.sqlx/query-e998a36bc4951f4eabbe4fc79628599a3ddfeefd338ba6ebe0f0197fa7af8e10.json @@ -0,0 +1,24 @@ +{ + "db_name": "MySQL", + "query": "SELECT `name` FROM `account` WHERE SHA2(`name`, 256) = ? AND `user_id` = ?;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "name", + "type_info": { + "type": "VarString", + "flags": "NOT_NULL | PRIMARY_KEY | NO_DEFAULT_VALUE", + "max_size": 1020 + } + } + ], + "parameters": { + "Right": 2 + }, + "nullable": [ + false + ] + }, + "hash": "e998a36bc4951f4eabbe4fc79628599a3ddfeefd338ba6ebe0f0197fa7af8e10" +} diff --git a/Cargo.lock b/Cargo.lock index 292fc90..938916a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,9 +44,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "anyhow" -version = "1.0.96" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" dependencies = [ "backtrace", ] @@ -62,7 +62,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -115,9 +115,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "bitflags" @@ -127,9 +127,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" dependencies = [ "serde", ] @@ -157,15 +157,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.15" +version = "1.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" dependencies = [ "shlex", ] @@ -202,9 +202,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ "num-traits", ] @@ -382,7 +382,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -402,7 +402,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "unicode-xid", ] @@ -426,7 +426,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -446,9 +446,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" dependencies = [ "serde", ] @@ -615,7 +615,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -648,6 +648,15 @@ dependencies = [ "slab", ] +[[package]] +name = "fuzzy-matcher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" +dependencies = [ + "thread_local", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -795,9 +804,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -958,7 +967,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1009,9 +1018,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", "hashbrown", @@ -1052,9 +1061,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" @@ -1077,9 +1086,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.169" +version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "libm" @@ -1099,15 +1108,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" [[package]] name = "litemap" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "lock_api" @@ -1168,9 +1177,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ "adler2", ] @@ -1254,9 +1263,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.3" +version = "1.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" [[package]] name = "opaque-debug" @@ -1306,12 +1315,13 @@ dependencies = [ "anyhow", "arrayvec", "base64 0.22.1", - "bitflags 2.8.0", + "bitflags 2.9.0", "chacha20poly1305", "derive_more 2.0.1", "dotenvy", "foldhash", "futures", + "fuzzy-matcher", "hex", "itertools 0.14.0", "parking_lot", @@ -1371,22 +1381,22 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1424,9 +1434,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "poly1305" @@ -1441,9 +1451,9 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] @@ -1474,18 +1484,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -1551,11 +1561,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] @@ -1648,9 +1658,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.9" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e75ec5e92c4d8aede845126adc388046234541629e76029599ed35a003c7ed24" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", @@ -1662,9 +1672,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" dependencies = [ "const-oid", "digest", @@ -1697,11 +1707,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.44" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "errno", "libc", "linux-raw-sys", @@ -1781,15 +1791,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "salsa20" @@ -1830,35 +1840,35 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "serde" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "serde_json" -version = "1.0.139" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -2053,7 +2063,7 @@ dependencies = [ "serde_json", "sha2", "smallvec", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tokio-stream", "tracing", @@ -2071,7 +2081,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -2094,7 +2104,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.98", + "syn 2.0.100", "tempfile", "tokio", "url", @@ -2108,7 +2118,7 @@ checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" dependencies = [ "atoi", "base64 0.22.1", - "bitflags 2.8.0", + "bitflags 2.9.0", "byteorder", "bytes", "crc", @@ -2137,7 +2147,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.11", + "thiserror 2.0.12", "tracing", "whoami", ] @@ -2150,7 +2160,7 @@ checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" dependencies = [ "atoi", "base64 0.22.1", - "bitflags 2.8.0", + "bitflags 2.9.0", "byteorder", "crc", "dotenvy", @@ -2174,7 +2184,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.11", + "thiserror 2.0.12", "tracing", "whoami", ] @@ -2244,9 +2254,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.98" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -2267,7 +2277,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -2374,11 +2384,10 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.17.1" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" +checksum = "488960f40a3fd53d72c2a29a58722561dee8afdd175bd88e3db4677d7b2ba600" dependencies = [ - "cfg-if", "fastrand", "getrandom 0.3.1", "once_cell", @@ -2397,11 +2406,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl 2.0.12", ] [[package]] @@ -2412,18 +2421,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -2448,9 +2457,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -2463,9 +2472,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.0" +version = "1.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" dependencies = [ "backtrace", "bytes", @@ -2487,7 +2496,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -2513,9 +2522,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" dependencies = [ "bytes", "futures-core", @@ -2584,7 +2593,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -2659,9 +2668,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-normalization" @@ -2726,9 +2735,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.14.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d59ca99a559661b96bf898d8fce28ed87935fd2bea9f05983c1464dd6c71b1" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" dependencies = [ "getrandom 0.3.1", ] @@ -2809,7 +2818,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "wasm-bindgen-shared", ] @@ -2844,7 +2853,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3078,9 +3087,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" dependencies = [ "memchr", ] @@ -3101,7 +3110,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] @@ -3136,49 +3145,48 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "synstructure", ] [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "synstructure", ] @@ -3207,5 +3215,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] diff --git a/Cargo.toml b/Cargo.toml index 45ff4ed..2ed09b9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ derive_more = { version = "2", features = [ dotenvy = "0.15" foldhash = "0.1.4" futures = "0.3" +fuzzy-matcher = "0.3" hex = "0.4" itertools = "0.14" parking_lot = "0.12" diff --git a/sql/search_accounts.sql b/sql/search_accounts.sql new file mode 100644 index 0000000..4e0a6d7 --- /dev/null +++ b/sql/search_accounts.sql @@ -0,0 +1,8 @@ +SELECT + name, + similarity (name, $1) as "similarity!" +FROM + users +ORDER BY + "similarity!" DESC +LIMIT 20 \ No newline at end of file diff --git a/src/dispatching/default.rs b/src/dispatching/default.rs index 766763b..1f142b4 100644 --- a/src/dispatching/default.rs +++ b/src/dispatching/default.rs @@ -1,9 +1,48 @@ -use crate::prelude::*; +use tokio::task::spawn_blocking; + +use crate::{ + markups::{account_markup, menu_markup_sync}, + prelude::*, +}; /// Handles the messages which weren't matched by any commands or states -pub async fn default(bot: Throttle, msg: Message, locale: LocaleRef) -> crate::Result<()> { - bot.send_message(msg.chat.id, &locale.unknown_command_use_help) - .reply_markup(deletion_markup(locale)) - .await?; +pub async fn default( + bot: Throttle, + msg: Message, + db: Pool, + locale: LocaleRef, +) -> crate::Result<()> { + let user_id = msg.get_user_id()?; + + if msg.text().is_none() || !MasterPass::exists(user_id, &db).await? { + bot.send_message(msg.chat.id, &locale.unknown_command_use_help) + .reply_markup(deletion_markup(locale)) + .await?; + return Ok(()); + } + + let names = Account::search(user_id, msg.text().unwrap().to_owned(), &db).await?; + + match names.as_slice() { + [] => { + bot.send_message(msg.chat.id, &locale.no_accounts_found) + .reply_markup(deletion_markup(locale)) + .await?; + } + [name] => { + let text = locale.show_hidden_account(name); + bot.send_message(msg.chat.id, text) + .reply_markup(account_markup(name, true, locale)) + .parse_mode(teloxide::types::ParseMode::MarkdownV2) + .await?; + } + _ => { + let markup = spawn_blocking(|| menu_markup_sync("get", names)).await?; + bot.send_message(msg.chat.id, &locale.choose_account) + .reply_markup(markup) + .await?; + } + } + Ok(()) } diff --git a/src/entity/account.rs b/src/entity/account.rs index 4a0ce76..64099d4 100644 --- a/src/entity/account.rs +++ b/src/entity/account.rs @@ -1,6 +1,7 @@ use super::Pool; use futures::{Stream, TryStreamExt}; use sqlx::{Executor, FromRow, MySql, query, query_as}; +use tokio::task::spawn_blocking; #[derive(Clone, Debug, PartialEq, Eq, FromRow, Default)] pub struct Account { @@ -29,17 +30,17 @@ impl Account { /// Gets all user's account from DB pub fn get_all(user_id: u64, pool: &Pool) -> impl Stream> + '_ { - query_as("SELECT * FROM account WHERE user_id = ?") - .bind(user_id) - .fetch(pool) + query_as!(Self, "SELECT * FROM account WHERE user_id = ?", user_id).fetch(pool) } /// Streams the names of the user accounts pub fn get_names(user_id: u64, pool: &Pool) -> impl Stream> + '_ { - query_as::<_, (String,)>("SELECT name FROM account WHERE user_id = ? ORDER BY name") - .bind(user_id) - .fetch(pool) - .map_ok(|(name,)| name) + query!( + "SELECT name FROM account WHERE user_id = ? ORDER BY name", + user_id + ) + .fetch(pool) + .map_ok(|record| record.name) } /// Checks if the account exists @@ -56,11 +57,33 @@ impl Account { /// Gets the account from the DB pub async fn get(user_id: u64, account_name: &str, pool: &Pool) -> super::Result> { - query_as("SELECT * FROM account WHERE user_id = ? AND name = ?") - .bind(user_id) - .bind(account_name) - .fetch_optional(pool) - .await + query_as!( + Self, + "SELECT * FROM account WHERE user_id = ? AND name = ?", + user_id, + account_name + ) + .fetch_optional(pool) + .await + } + + /// Searches for an account + pub async fn search( + user_id: u64, + search_str: String, + pool: &Pool, + ) -> crate::Result> { + use fuzzy_matcher::{FuzzyMatcher, skim::SkimMatcherV2}; + + let mut accounts: Vec = Self::get_names(user_id, pool).try_collect().await?; + + spawn_blocking(move || { + let matcher = SkimMatcherV2::default().ignore_case(); + accounts.retain(|name| matcher.fuzzy_match(name, &search_str).is_some()); + accounts + }) + .await + .map_err(Into::into) } // Deletes the account from DB @@ -93,25 +116,26 @@ impl Account { pool: &Pool, ) -> super::Result> { let hash = hex::encode(hash); - let name = query_as::<_, (String,)>( + let name = query!( "SELECT `name` FROM `account` WHERE SHA2(`name`, 256) = ? AND `user_id` = ?;", + hash, + user_id, ) - .bind(hash) - .bind(user_id) .fetch_optional(pool) .await?; - Ok(name.map(|(name,)| name)) + Ok(name.map(|record| record.name)) } pub async fn get_salt(user_id: u64, name: &str, pool: &Pool) -> super::Result>> { - let salt = - query_as::<_, (Vec,)>("SELECT salt FROM account WHERE user_id = ? AND name = ?") - .bind(user_id) - .bind(name) - .fetch_optional(pool) - .await?; + let salt = query!( + "SELECT salt FROM account WHERE user_id = ? AND name = ?", + user_id, + name + ) + .fetch_optional(pool) + .await?; - Ok(salt.map(|(salt,)| salt)) + Ok(salt.map(|record| record.salt)) } pub async fn update_name( user_id: u64,