diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 009bd31..c30eca1 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -12,56 +12,27 @@ - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + @@ -180,7 +153,11 @@ - + + + + + - diff --git a/Cargo.lock b/Cargo.lock index c290852..9b79936 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,17 +17,6 @@ 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", - "once_cell", - "version_check", -] - [[package]] name = "aho-corasick" version = "1.1.3" @@ -37,12 +26,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - [[package]] name = "allocator-api2" version = "0.2.21" @@ -114,45 +97,6 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - [[package]] name = "atoi" version = "2.0.0" @@ -255,20 +199,6 @@ 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", - "serde", -] - [[package]] name = "bitflags" version = "2.9.1" @@ -278,18 +208,6 @@ 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 = "block-buffer" version = "0.10.4" @@ -299,57 +217,12 @@ dependencies = [ "generic-array", ] -[[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" @@ -378,12 +251,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - [[package]] name = "chrono" version = "0.4.42" @@ -391,8 +258,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ "iana-time-zone", + "js-sys", "num-traits", "serde", + "wasm-bindgen", "windows-link", ] @@ -483,16 +352,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "deranged" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" -dependencies = [ - "powerfmt", - "serde_core", -] - [[package]] name = "digest" version = "0.10.7" @@ -513,7 +372,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -629,12 +488,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "futures-channel" version = "0.3.31" @@ -725,7 +578,19 @@ checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.7+wasi-0.2.4", ] [[package]] @@ -734,15 +599,6 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" -[[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.15.5" @@ -769,12 +625,6 @@ dependencies = [ "hashbrown 0.15.5", ] -[[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" @@ -1038,17 +888,6 @@ dependencies = [ "hashbrown 0.16.0", ] -[[package]] -name = "inherent" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c727f80bfa4a6c6e2508d2f05b6f4bfce242030bd88ed15ae5331c5b5d30fba7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - [[package]] name = "io-uring" version = "0.7.9" @@ -1093,7 +932,7 @@ checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -1215,20 +1054,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.59.0", ] -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - [[package]] name = "num-bigint-dig" version = "0.8.4" @@ -1246,12 +1075,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - [[package]] name = "num-integer" version = "0.1.46" @@ -1303,58 +1126,27 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" -[[package]] -name = "ordered-float" -version = "4.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" -dependencies = [ - "num-traits", -] - -[[package]] -name = "ouroboros" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" -dependencies = [ - "aliasable", - "ouroboros_macro", - "static_assertions", -] - -[[package]] -name = "ouroboros_macro" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.104", -] - [[package]] name = "ox_speak_server" version = "0.1.0" dependencies = [ "arc-swap", "axum", + "chrono", "dotenvy", "env_logger", "envy", "hyper", "log", "parking_lot", - "sea-orm", "serde", "serde_json", "socket2", + "sqlx", "tokio", "tower", "tower-http", + "uuid", ] [[package]] @@ -1401,15 +1193,6 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" -[[package]] -name = "pgvector" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc58e2d255979a31caa7cabfa7aac654af0354220719ab7a68520ae7a91e8c0b" -dependencies = [ - "serde", -] - [[package]] name = "pin-project-lite" version = "0.2.16" @@ -1473,12 +1256,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - [[package]] name = "ppv-lite86" version = "0.2.21" @@ -1488,37 +1265,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "proc-macro-crate" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.104", -] - [[package]] name = "proc-macro2" version = "1.0.95" @@ -1528,39 +1274,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", - "version_check", - "yansi", -] - -[[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 = "quote" version = "1.0.40" @@ -1571,10 +1284,10 @@ dependencies = [ ] [[package]] -name = "radium" -version = "0.7.0" +name = "r-efi" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" @@ -1603,7 +1316,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.16", ] [[package]] @@ -1645,41 +1358,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] -name = "rend" -version = "0.4.2" +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ - "bytecheck", -] - -[[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", + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", ] [[package]] @@ -1702,28 +1391,46 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rust_decimal" -version = "1.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8975fc98059f365204d635119cf9c5a60ae67b841ed49b5422a9a7e56cdfac0" -dependencies = [ - "arrayvec", - "borsh", - "bytes", - "num-traits", - "rand", - "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 = "rustls" +version = "0.23.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -1742,100 +1449,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sea-bae" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f694a6ab48f14bc063cfadff30ab551d3c7e46d8f81836c51989d548f44a2a25" -dependencies = [ - "heck 0.4.1", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] -name = "sea-orm" -version = "1.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335d87ec8e5c6eb4b2afb866dc53ed57a5cba314af63ce288db83047aa0fed4d" -dependencies = [ - "async-stream", - "async-trait", - "bigdecimal", - "chrono", - "futures-util", - "log", - "ouroboros", - "pgvector", - "rust_decimal", - "sea-orm-macros", - "sea-query", - "sea-query-binder", - "serde", - "serde_json", - "sqlx", - "strum", - "thiserror", - "time", - "tracing", - "url", - "uuid", -] - -[[package]] -name = "sea-orm-macros" -version = "1.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68de7a2258410fd5e6ba319a4fe6c4af7811507fc714bbd76534ae6caa60f95f" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "sea-bae", - "syn 2.0.104", - "unicode-ident", -] - -[[package]] -name = "sea-query" -version = "0.32.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a5d1c518eaf5eda38e5773f902b26ab6d5e9e9e2bb2349ca6c64cf96f80448c" -dependencies = [ - "bigdecimal", - "chrono", - "inherent", - "ordered-float", - "rust_decimal", - "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", - "rust_decimal", - "sea-query", - "serde_json", - "sqlx", - "time", - "uuid", -] - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - [[package]] name = "serde" version = "1.0.228" @@ -1863,7 +1476,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -1949,12 +1562,6 @@ dependencies = [ "rand_core", ] -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - [[package]] name = "slab" version = "0.4.10" @@ -2019,7 +1626,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" dependencies = [ "base64", - "bigdecimal", "bytes", "chrono", "crc", @@ -2037,18 +1643,18 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rust_decimal", + "rustls", "serde", "serde_json", "sha2", "smallvec", "thiserror", - "time", "tokio", "tokio-stream", "tracing", "url", "uuid", + "webpki-roots 0.26.11", ] [[package]] @@ -2061,7 +1667,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.104", + "syn", ] [[package]] @@ -2072,7 +1678,7 @@ checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" dependencies = [ "dotenvy", "either", - "heck 0.5.0", + "heck", "hex", "once_cell", "proc-macro2", @@ -2084,7 +1690,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.104", + "syn", "tokio", "url", ] @@ -2097,7 +1703,6 @@ checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ "atoi", "base64", - "bigdecimal", "bitflags", "byteorder", "bytes", @@ -2122,7 +1727,6 @@ dependencies = [ "percent-encoding", "rand", "rsa", - "rust_decimal", "serde", "sha1", "sha2", @@ -2130,7 +1734,6 @@ dependencies = [ "sqlx-core", "stringprep", "thiserror", - "time", "tracing", "uuid", "whoami", @@ -2144,7 +1747,6 @@ checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", "base64", - "bigdecimal", "bitflags", "byteorder", "chrono", @@ -2162,10 +1764,8 @@ dependencies = [ "log", "md-5", "memchr", - "num-bigint", "once_cell", "rand", - "rust_decimal", "serde", "serde_json", "sha2", @@ -2173,7 +1773,6 @@ dependencies = [ "sqlx-core", "stringprep", "thiserror", - "time", "tracing", "uuid", "whoami", @@ -2200,7 +1799,6 @@ dependencies = [ "serde_urlencoded", "sqlx-core", "thiserror", - "time", "tracing", "url", "uuid", @@ -2212,12 +1810,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "stringprep" version = "0.1.5" @@ -2229,29 +1821,12 @@ dependencies = [ "unicode-properties", ] -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" - [[package]] name = "subtle" 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" @@ -2277,15 +1852,9 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "thiserror" version = "2.0.16" @@ -2303,38 +1872,7 @@ checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", -] - -[[package]] -name = "time" -version = "0.3.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" - -[[package]] -name = "time-macros" -version = "0.2.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" -dependencies = [ - "num-conv", - "time-core", + "syn", ] [[package]] @@ -2390,7 +1928,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -2404,36 +1942,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "toml_datetime" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.23.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" -dependencies = [ - "indexmap", - "toml_datetime", - "toml_parser", - "winnow", -] - -[[package]] -name = "toml_parser" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" -dependencies = [ - "winnow", -] - [[package]] name = "tower" version = "0.5.2" @@ -2496,7 +2004,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -2541,6 +2049,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.7" @@ -2571,6 +2085,7 @@ version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ + "getrandom 0.3.3", "js-sys", "serde", "wasm-bindgen", @@ -2594,6 +2109,24 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + [[package]] name = "wasite" version = "0.1.0" @@ -2623,7 +2156,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.104", + "syn", "wasm-bindgen-shared", ] @@ -2645,7 +2178,7 @@ checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2659,6 +2192,24 @@ dependencies = [ "unicode-ident", ] +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "whoami" version = "1.6.1" @@ -2690,7 +2241,7 @@ checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -2701,7 +2252,7 @@ checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -2737,6 +2288,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.59.0" @@ -2942,13 +2502,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] -name = "winnow" -version = "0.7.13" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" -dependencies = [ - "memchr", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" @@ -2956,21 +2513,6 @@ 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 = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - [[package]] name = "yoke" version = "0.8.0" @@ -2991,7 +2533,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", "synstructure", ] @@ -3012,7 +2554,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -3032,7 +2574,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", "synstructure", ] @@ -3072,5 +2614,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] diff --git a/Cargo.toml b/Cargo.toml index f2990cd..9dea515 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,4 +29,6 @@ tower = "0.5" tower-http = "0.6" hyper = "1.7" -sea-orm = { version = "1.1", features = [ "sqlx-sqlite", "runtime-tokio", "macros" ] } \ No newline at end of file +sqlx = { version = "0.8", features = ["runtime-tokio", "tls-rustls", "sqlite", "postgres", "mysql", "uuid", "chrono", "migrate"] } +uuid = { version = "1.18", features = ["v4", "v7", "serde"] } +chrono = { version = "0.4", features = ["serde"] } \ No newline at end of file diff --git a/src/app/app.rs b/src/app/app.rs index e7b5203..db7bedd 100644 --- a/src/app/app.rs +++ b/src/app/app.rs @@ -1,6 +1,8 @@ use std::io; use std::sync::Arc; use std::net::SocketAddr; +use crate::app::http::router::configure_routes; +use crate::network::http::server::HttpServer; use crate::network::udp::server::UdpServer; use crate::utils::config::Config; use crate::utils::logger::ContextLogger; @@ -24,8 +26,16 @@ impl App { } }; + let http_server = match HttpServer::new("127.0.0.1:8080") { + Ok(http_server) => http_server, + Err(e) => { + return Err(io::Error::new(io::ErrorKind::Other, format!("Failed to create HTTP server: {}", e))) + } + }; + let context = Context { - udp_server + udp_server, + http_server, }; Ok(Self { @@ -34,8 +44,18 @@ impl App { logger }) } + + pub async fn run(self) -> io::Result<()> { + self.logger.info("Starting application"); + self.context.udp_server.run().await?; + + self.context.http_server.run().await?; + + Ok(()) + } } struct Context { - udp_server: UdpServer + udp_server: UdpServer, + http_server: HttpServer } \ No newline at end of file diff --git a/src/db/context.rs b/src/db/context.rs new file mode 100644 index 0000000..dec4d0e --- /dev/null +++ b/src/db/context.rs @@ -0,0 +1,57 @@ +use std::sync::Arc; +use sqlx::SqlitePool; +use crate::db::{AttachmentRepository, CategoryRepository, ChannelRepository, ChannelUser, ChannelUserRepository, MessageRepository, ServerRepository, ServerUser, ServerUserRepository, UserRepository}; +use crate::utils::logger::ContextLogger; + +struct Repositories { + server_repository: ServerRepository, + category_repository: CategoryRepository, + channel_repository: ChannelRepository, + user_repository: UserRepository, + message_repository: MessageRepository, + attachment_repository: AttachmentRepository, + + server_user: ServerUserRepository, + channel_user: ChannelUserRepository +} + +pub struct DbContext { + pool: Arc, + + repositories: Arc, + + // logger + logger: ContextLogger, +} + +impl DbContext { + pub async fn new(database_url: &str) -> Result { + let logger = ContextLogger::new("DB"); + + logger.info(&format!("Creating DB context on {}", database_url)); + let pool = SqlitePool::connect(database_url).await?; + logger.info("DB context created"); + let pool = Arc::new(pool); + + let repositories = Arc::new(Repositories { + server_repository: ServerRepository::new(pool.clone()), + category_repository: CategoryRepository::new(pool.clone()), + channel_repository: ChannelRepository::new(pool.clone()), + user_repository: UserRepository::new(pool.clone()), + message_repository: MessageRepository::new(pool.clone()), + attachment_repository: AttachmentRepository::new(pool.clone()), + server_user: ServerUserRepository::new(pool.clone()), + channel_user: ChannelUserRepository::new(pool.clone()) + }); + + Ok(Self { + pool, + repositories, + logger, + }) + } + + pub fn repositories(&self) -> Arc { + self.repositories.clone() + } +} \ No newline at end of file diff --git a/src/db/mod.rs b/src/db/mod.rs new file mode 100644 index 0000000..776bd28 --- /dev/null +++ b/src/db/mod.rs @@ -0,0 +1,6 @@ +pub mod models; +pub mod repositories; +mod context; + +pub use models::*; +pub use repositories::*; \ No newline at end of file diff --git a/src/db/models/_channel_user.rs b/src/db/models/_channel_user.rs new file mode 100644 index 0000000..6c9ca2f --- /dev/null +++ b/src/db/models/_channel_user.rs @@ -0,0 +1,29 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use sqlx::FromRow; +use uuid::Uuid; + +#[derive(Debug, Clone, FromRow, Serialize, Deserialize)] +pub struct ChannelUser { + pub id: Uuid, + pub channel_id: Uuid, + pub user_id: Uuid, + pub username: Option, + pub joined_at: DateTime, + pub updated_at: DateTime, + pub last_read_at: DateTime, +} + +impl ChannelUser { + pub fn new(channel_id: Uuid, user_id: Uuid) -> Self { + Self { + id: Uuid::now_v7(), + channel_id, + user_id, + username: None, + joined_at: Utc::now(), + updated_at: Utc::now(), + last_read_at: Utc::now(), + } + } +} \ No newline at end of file diff --git a/src/db/models/_server_user.rs b/src/db/models/_server_user.rs new file mode 100644 index 0000000..51dd86e --- /dev/null +++ b/src/db/models/_server_user.rs @@ -0,0 +1,28 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use sqlx::FromRow; +use uuid::Uuid; + +#[derive(Debug, Clone, FromRow, Serialize, Deserialize)] +pub struct ServerUser { + pub id: Uuid, + pub server_id: Uuid, + pub user_id: Uuid, + #[sqlx(default)] + pub username: Option, + pub joined_at: DateTime, + pub updated_at: DateTime, +} + +impl ServerUser { + pub fn new(server_id: Uuid, user_id: Uuid) -> Self { + Self { + id: Uuid::now_v7(), + server_id, + user_id, + username: None, + joined_at: Utc::now(), + updated_at: Utc::now(), + } + } +} \ No newline at end of file diff --git a/src/db/models/attachment.rs b/src/db/models/attachment.rs new file mode 100644 index 0000000..ddb03be --- /dev/null +++ b/src/db/models/attachment.rs @@ -0,0 +1,27 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use sqlx::FromRow; +use uuid::Uuid; + +#[derive(Debug, Clone, FromRow, Serialize, Deserialize)] +pub struct Attachment { + pub id: Uuid, + pub message_id: Uuid, + pub filename: String, + pub file_size: i64, + pub mime_type: String, + pub created_at: DateTime, +} + +impl Attachment { + pub fn new(message_id: Uuid, filename: String, file_size: i64, mime_type: String) -> Self { + Self { + id: Uuid::new_v4(), + message_id, + filename, + file_size, + mime_type, + created_at: Utc::now(), + } + } +} \ No newline at end of file diff --git a/src/db/models/category.rs b/src/db/models/category.rs new file mode 100644 index 0000000..4d71c02 --- /dev/null +++ b/src/db/models/category.rs @@ -0,0 +1,25 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use sqlx::FromRow; +use uuid::Uuid; + +#[derive(Debug, Clone, FromRow, Serialize, Deserialize)] +pub struct Category { + pub id: Uuid, + pub server_id: Uuid, + pub name: String, + pub created_at: DateTime, + pub updated_at: DateTime, +} + +impl Category { + pub fn new(server_id: Uuid, name: String) -> Self { + Self { + id: Uuid::now_v7(), + server_id, + name, + created_at: Utc::now(), + updated_at: Utc::now(), + } + } +} \ No newline at end of file diff --git a/src/db/models/channel.rs b/src/db/models/channel.rs new file mode 100644 index 0000000..de9be24 --- /dev/null +++ b/src/db/models/channel.rs @@ -0,0 +1,56 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +#[derive(Debug, Clone, sqlx::FromRow, Serialize, Deserialize)] +pub struct Channel { + pub id: Uuid, // Blob(16) sqlite + #[sqlx(default)] + pub server_id: Option, + #[sqlx(default)] + pub category_id: Option, + #[sqlx(default)] + pub position: i32, + #[sqlx(rename = "type")] + pub channel_type: ChannelType, + pub name: Option, // Not necessary for DMs + pub created_at: DateTime, + pub updated_at: DateTime, +} + +#[derive(Debug, Clone, Serialize, Deserialize, sqlx::Type)] +#[sqlx(type_name = "text")] +#[serde(rename_all = "snake_case")] +pub enum ChannelType { + Text, + Voice, + Dm +} + +impl Channel { + pub fn new_server_channel(server_id: Uuid, name: String, channel_type: ChannelType) -> Self { + Self { + id: Uuid::now_v7(), + server_id: Some(server_id), + category_id: None, + position: 0, + channel_type, + name: Some(name), + created_at: Utc::now(), + updated_at: Utc::now() + } + } + + pub fn new_dm_channel() -> Self { + Self { + id: Uuid::now_v7(), + server_id: None, + category_id: None, + channel_type: ChannelType::Dm, + name: None, + position: 0, + created_at: Utc::now(), + updated_at: Utc::now(), + } + } +} \ No newline at end of file diff --git a/src/db/models/message.rs b/src/db/models/message.rs new file mode 100644 index 0000000..6f1dc46 --- /dev/null +++ b/src/db/models/message.rs @@ -0,0 +1,41 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use sqlx::FromRow; +use uuid::Uuid; + +#[derive(Debug, Clone, FromRow, Serialize, Deserialize)] +pub struct Message { + pub id: Uuid, + pub channel_id: Uuid, + pub user_id: Uuid, + pub content: String, + pub created_at: DateTime, + pub edited_at: DateTime, + pub reply_to_id: Option, +} + +impl Message { + pub fn new(channel_id: Uuid, user_id: Uuid, content: String) -> Self { + Self { + id: Uuid::now_v7(), + channel_id, + user_id, + content, + created_at: Utc::now(), + edited_at: Utc::now(), + reply_to_id: None, + } + } + + pub fn with_reply(channel_id: Uuid, user_id: Uuid, content: String, reply_to_id: Uuid) -> Self { + Self { + id: Uuid::now_v7(), + channel_id, + user_id, + content, + created_at: Utc::now(), + edited_at: Utc::now(), + reply_to_id: Some(reply_to_id), + } + } +} \ No newline at end of file diff --git a/src/db/models/mod.rs b/src/db/models/mod.rs new file mode 100644 index 0000000..e357120 --- /dev/null +++ b/src/db/models/mod.rs @@ -0,0 +1,17 @@ +mod user; +mod server; +mod _server_user; +mod channel; +mod category; +mod _channel_user; +mod message; +mod attachment; + +pub use user::*; +pub use server::*; +pub use channel::*; +pub use category::*; +pub use message::*; +pub use attachment::*; +pub use _server_user::*; +pub use _channel_user::*; \ No newline at end of file diff --git a/src/db/models/server.rs b/src/db/models/server.rs new file mode 100644 index 0000000..20910f5 --- /dev/null +++ b/src/db/models/server.rs @@ -0,0 +1,25 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use sqlx::FromRow; +use uuid::Uuid; + +#[derive(Debug, Clone, PartialEq, FromRow, Serialize, Deserialize)] +pub struct Server { + pub id: Uuid, // Blob(16) sqlite + pub username: String, + pub password: Option, + pub created_at: DateTime, + pub updated_at: DateTime, +} + +impl Server { + pub fn new(username: String, password: Option) -> Self { + Self { + id: Uuid::now_v7(), + username, + password, + created_at: Utc::now(), + updated_at: Utc::now(), + } + } +} \ No newline at end of file diff --git a/src/db/models/user.rs b/src/db/models/user.rs new file mode 100644 index 0000000..a413464 --- /dev/null +++ b/src/db/models/user.rs @@ -0,0 +1,25 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use sqlx::FromRow; +use uuid::Uuid; + +#[derive(Debug, Clone, PartialEq, FromRow, Serialize, Deserialize)] +pub struct User { + pub id: Uuid, // Blob(16) sqlite + pub username: String, + pub pub_key: String, // TEXT + pub created_at: DateTime, + pub updated_at: DateTime, +} + +impl User { + pub fn new(username: String, pub_key: String) -> Self { + Self { + id: Uuid::now_v7(), + username, + pub_key, + created_at: Utc::now(), + updated_at: Utc::now(), + } + } +} \ No newline at end of file diff --git a/src/db/repositories/_channel_user_repository.rs b/src/db/repositories/_channel_user_repository.rs new file mode 100644 index 0000000..7525ad4 --- /dev/null +++ b/src/db/repositories/_channel_user_repository.rs @@ -0,0 +1,14 @@ +use std::sync::Arc; +use sqlx::SqlitePool; + +pub struct ChannelUserRepository { + pool: Arc +} + +impl ChannelUserRepository { + pub fn new(pool: Arc) -> Self { + Self { + pool + } + } +} \ No newline at end of file diff --git a/src/db/repositories/_server_user_repository.rs b/src/db/repositories/_server_user_repository.rs new file mode 100644 index 0000000..2775884 --- /dev/null +++ b/src/db/repositories/_server_user_repository.rs @@ -0,0 +1,14 @@ +use std::sync::Arc; +use sqlx::SqlitePool; + +pub struct ServerUserRepository { + pool: Arc +} + +impl ServerUserRepository { + pub fn new(pool: Arc) -> Self { + Self { + pool + } + } +} \ No newline at end of file diff --git a/src/db/repositories/attachment_repository.rs b/src/db/repositories/attachment_repository.rs new file mode 100644 index 0000000..3d6a8d8 --- /dev/null +++ b/src/db/repositories/attachment_repository.rs @@ -0,0 +1,14 @@ +use std::sync::Arc; +use sqlx::SqlitePool; + +pub struct AttachmentRepository { + pool: Arc +} + +impl AttachmentRepository { + pub fn new(pool: Arc) -> Self { + Self { + pool + } + } +} diff --git a/src/db/repositories/category_repository.rs b/src/db/repositories/category_repository.rs new file mode 100644 index 0000000..9fd37a5 --- /dev/null +++ b/src/db/repositories/category_repository.rs @@ -0,0 +1,14 @@ +use std::sync::Arc; +use sqlx::SqlitePool; + +pub struct CategoryRepository{ + pool: Arc +} + +impl CategoryRepository { + pub fn new(pool: Arc) -> Self { + Self { + pool + } + } +} diff --git a/src/db/repositories/channel_repository.rs b/src/db/repositories/channel_repository.rs new file mode 100644 index 0000000..d4abef5 --- /dev/null +++ b/src/db/repositories/channel_repository.rs @@ -0,0 +1,15 @@ +use std::sync::Arc; +use sqlx::SqlitePool; + +pub struct ChannelRepository { + pool: Arc +} + + +impl ChannelRepository { + pub fn new(pool: Arc) -> Self { + Self { + pool + } + } +} diff --git a/src/db/repositories/message_repository.rs b/src/db/repositories/message_repository.rs new file mode 100644 index 0000000..b2aa100 --- /dev/null +++ b/src/db/repositories/message_repository.rs @@ -0,0 +1,15 @@ +use std::sync::Arc; +use sqlx::SqlitePool; + +pub struct MessageRepository{ + pool: Arc +} + + +impl MessageRepository { + pub fn new(pool: Arc) -> Self { + Self { + pool + } + } +} diff --git a/src/db/repositories/mod.rs b/src/db/repositories/mod.rs new file mode 100644 index 0000000..39f5ade --- /dev/null +++ b/src/db/repositories/mod.rs @@ -0,0 +1,17 @@ +mod _channel_user_repository; +mod _server_user_repository; +mod user_repository; +mod server_repository; +mod channel_repository; +mod category_repository; +mod message_repository; +mod attachment_repository; + +pub use user_repository::*; +pub use server_repository::*; +pub use channel_repository::*; +pub use category_repository::*; +pub use message_repository::*; +pub use attachment_repository::*; +pub use _server_user_repository::*; +pub use _channel_user_repository::*; diff --git a/src/db/repositories/server_repository.rs b/src/db/repositories/server_repository.rs new file mode 100644 index 0000000..0a28497 --- /dev/null +++ b/src/db/repositories/server_repository.rs @@ -0,0 +1,15 @@ +use std::sync::Arc; +use sqlx::SqlitePool; + +pub struct ServerRepository{ + pool: Arc +} + + +impl ServerRepository { + pub fn new(pool: Arc) -> Self { + Self{ + pool + } + } +} diff --git a/src/db/repositories/user_repository.rs b/src/db/repositories/user_repository.rs new file mode 100644 index 0000000..bb8b311 --- /dev/null +++ b/src/db/repositories/user_repository.rs @@ -0,0 +1,14 @@ +use std::sync::Arc; +use sqlx::{SqlitePool}; + +pub struct UserRepository { + pool: Arc +} + +impl UserRepository { + pub fn new(pool: Arc) -> Self { + Self { + pool + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 4703bfa..235ee46 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,4 +2,4 @@ pub mod utils; pub mod network; pub mod app; -pub mod store; \ No newline at end of file +pub mod db; \ No newline at end of file diff --git a/src/network/http/mod.rs b/src/network/http/mod.rs index 9310323..bfe15ae 100644 --- a/src/network/http/mod.rs +++ b/src/network/http/mod.rs @@ -1 +1 @@ -mod server; \ No newline at end of file +pub mod server; \ No newline at end of file diff --git a/src/network/http/server.rs b/src/network/http/server.rs index 83464cc..c995084 100644 --- a/src/network/http/server.rs +++ b/src/network/http/server.rs @@ -1,6 +1,6 @@ use std::io; use std::net::SocketAddr; -use axum::{Router, routing::get, http::StatusCode, Json}; +use axum::{Router}; use tokio::net::TcpListener; use crate::utils::logger::ContextLogger; @@ -20,34 +20,13 @@ impl HttpServer { Ok(Self { bind_addr, logger }) } - pub async fn run(self) -> io::Result<()> { + pub async fn run(self, router: Router) -> io::Result<()> { self.logger.info(&format!("Starting HTTP server on {}", self.bind_addr)); let listener = TcpListener::bind(self.bind_addr).await?; - let app = create_app(self.logger.clone()); - axum::serve(listener, app) + axum::serve(listener, router) .await .map_err(|e| io::Error::new(io::ErrorKind::Other, e)) } -} - -fn create_app(logger: ContextLogger) -> Router { - Router::new() - .route("/", get(|| async { "OX Speak Server - HTTP API" })) - .route("/health", get(|| async { StatusCode::OK })) - .route("/api/status", get(status_handler)) - .with_state(logger) -} - -async fn status_handler( - axum::extract::State(logger): axum::extract::State -) -> Json { - logger.info("Status endpoint called"); - - Json(serde_json::json!({ - "status": "ok", - "service": "ox-speak-server", - "workers": tokio::runtime::Handle::current().metrics().num_workers() - })) } \ No newline at end of file diff --git a/src/network/mod.rs b/src/network/mod.rs index 2f82e64..c98df72 100644 --- a/src/network/mod.rs +++ b/src/network/mod.rs @@ -1,2 +1,2 @@ pub mod udp; -mod http; \ No newline at end of file +pub mod http; \ No newline at end of file diff --git a/src/store/mod.rs b/src/store/mod.rs deleted file mode 100644 index e69de29..0000000