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 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
@@ -115,13 +86,15 @@
"org.rust.cargo.project.model.PROJECT_DISCOVERY": "true",
"org.rust.cargo.project.model.impl.CargoExternalSystemProjectAware.subscribe.first.balloon": "",
"org.rust.first.attach.projects": "true",
- "settings.editor.selected.configurable": "ml.llm.LLMConfigurable",
+ "settings.editor.selected.configurable": "preferences.pluginManager",
"to.speed.mode.migration.done": "true",
"vue.rearranger.settings.migration": "true"
}
}
+
+
@@ -180,7 +153,11 @@
-
+
+
+
+
+
@@ -190,7 +167,23 @@
1756218076891
-
+
+
+ 1759077528343
+
+
+
+ 1759077528343
+
+
+
+ 1759077533456
+
+
+
+ 1759077533456
+
+
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