From 35e5bd30b56463b25c8a96ebb2ce4998b16ec8e7 Mon Sep 17 00:00:00 2001 From: Jackz Date: Mon, 14 Apr 2025 21:32:49 -0500 Subject: [PATCH] Switch to server side templating --- server/Cargo.lock | 276 ++++++++++++++++++++- server/Cargo.toml | 3 +- server/src/main.rs | 9 +- server/src/routes.rs | 1 + server/src/routes/ui.rs | 1 + server/src/routes/ui/user.rs | 7 + server/src/util.rs | 2 +- server/templates/layouts/main.html.hbs | 26 ++ server/templates/partials/nav.html.hbs | 24 ++ server/templates/partials/sidebar.html.hbs | 47 ++++ web/src/routes/+page.svelte | 12 +- web/vite.config.ts | 9 + 12 files changed, 402 insertions(+), 15 deletions(-) create mode 100644 server/src/routes/ui.rs create mode 100644 server/src/routes/ui/user.rs create mode 100644 server/templates/layouts/main.html.hbs create mode 100644 server/templates/partials/nav.html.hbs create mode 100644 server/templates/partials/sidebar.html.hbs diff --git a/server/Cargo.lock b/server/Cargo.lock index 956cc4b..b9b7e0a 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -149,6 +149,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.9.0" @@ -277,6 +283,15 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-queue" version = "0.3.12" @@ -348,7 +363,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b035a542cf7abf01f2e3c4d5a7acbaebfefe120ae4efc7bde3df98186e4b8af7" dependencies = [ - "bitflags", + "bitflags 2.9.0", "proc-macro2", "proc-macro2-diagnostics", "quote", @@ -460,6 +475,18 @@ dependencies = [ "version_check", ] +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + [[package]] name = "flume" version = "0.11.1" @@ -492,6 +519,15 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + [[package]] name = "futures" version = "0.3.31" @@ -656,6 +692,20 @@ dependencies = [ "tracing", ] +[[package]] +name = "handlebars" +version = "5.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d08485b96a0e6393e9e4d1b8d48cf74ad6c063cd905eb33f42c1ce3f0377539b" +dependencies = [ + "log", + "pest", + "pest_derive", + "serde", + "serde_json", + "thiserror 1.0.69", +] + [[package]] name = "hashbrown" version = "0.15.2" @@ -976,6 +1026,26 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" +[[package]] +name = "inotify" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + [[package]] name = "int-enum" version = "1.2.0" @@ -1015,6 +1085,26 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kqueue" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1036,6 +1126,17 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.0", + "libc", + "redox_syscall", +] + [[package]] name = "libsqlite3-sys" version = "0.30.1" @@ -1129,6 +1230,18 @@ dependencies = [ "adler2", ] +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + [[package]] name = "mio" version = "1.0.3" @@ -1159,6 +1272,34 @@ dependencies = [ "version_check", ] +[[package]] +name = "normpath" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8911957c4b1549ac0dc74e30db9c8b0e66ddcd6d7acc33098f4c63a64a6d7ed" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "notify" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" +dependencies = [ + "bitflags 2.9.0", + "crossbeam-channel", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "log", + "mio 0.8.11", + "walkdir", + "windows-sys 0.48.0", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1320,6 +1461,51 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pest" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +dependencies = [ + "memchr", + "thiserror 2.0.12", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d725d9cfd79e87dccc9341a2ef39d1b6f6353d68c4b33c177febbe1a402c97c5" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7d01726be8ab66ab32f9df467ae8b1148906685bbe75c82d1e65d7f5b3f841" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -1447,7 +1633,7 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" dependencies = [ - "bitflags", + "bitflags 2.9.0", ] [[package]] @@ -1570,6 +1756,19 @@ dependencies = [ "version_check", ] +[[package]] +name = "rocket_dyn_templates" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bbab919c9e67df3f7ac6624a32ef897df4cd61c0969f4d66f3ced0534660d7a" +dependencies = [ + "handlebars", + "normpath", + "notify", + "rocket", + "walkdir", +] + [[package]] name = "rocket_http" version = "0.5.1" @@ -1630,7 +1829,7 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" dependencies = [ - "bitflags", + "bitflags 2.9.0", "errno", "libc", "linux-raw-sys", @@ -1649,6 +1848,15 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -1857,7 +2065,7 @@ dependencies = [ "serde_json", "sha2", "smallvec", - "thiserror", + "thiserror 2.0.12", "tokio", "tokio-stream", "tracing", @@ -1912,7 +2120,7 @@ checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" dependencies = [ "atoi", "base64", - "bitflags", + "bitflags 2.9.0", "byteorder", "bytes", "chrono", @@ -1942,7 +2150,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 2.0.12", "tracing", "uuid", "whoami", @@ -1956,7 +2164,7 @@ checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" dependencies = [ "atoi", "base64", - "bitflags", + "bitflags 2.9.0", "byteorder", "chrono", "crc", @@ -1981,7 +2189,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 2.0.12", "tracing", "uuid", "whoami", @@ -2046,6 +2254,7 @@ dependencies = [ "int-enum", "log", "rocket", + "rocket_dyn_templates", "serde", "serde_json", "sqlx", @@ -2105,13 +2314,33 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + [[package]] name = "thiserror" version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2200,7 +2429,7 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio", + "mio 1.0.3", "parking_lot", "pin-project-lite", "signal-hook-registry", @@ -2367,6 +2596,12 @@ dependencies = [ "serde", ] +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "uncased" version = "0.9.10" @@ -2460,6 +2695,16 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -2574,6 +2819,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -2811,7 +3065,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags", + "bitflags 2.9.0", ] [[package]] diff --git a/server/Cargo.toml b/server/Cargo.toml index 731aef6..419c828 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -14,4 +14,5 @@ anyhow = "1.0.98" serde = "1.0.219" serde_json = "1.0.140" int-enum = "1.2.0" -dotenvy = "0.15.7" \ No newline at end of file +dotenvy = "0.15.7" +rocket_dyn_templates = { version = "0.2.0", features = ["handlebars"] } \ No newline at end of file diff --git a/server/src/main.rs b/server/src/main.rs index cb5b345..62f6f0d 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use log::debug; use rocket::{catch, launch, routes, Request, State}; use rocket::data::ByteUnit; +use rocket_dyn_templates::Template; use sqlx::{migrate, Pool, Postgres}; use sqlx::postgres::PgPoolOptions; use sqlx::types::Json; @@ -11,6 +12,7 @@ use crate::managers::repos::RepoManager; use crate::objs::library::Library; use crate::util::{setup_logger, JsonErrorResponse, ResponseError}; use routes::api; +use crate::routes::ui; mod routes; mod util; @@ -29,7 +31,7 @@ const MAX_UPLOAD_SIZE: ByteUnit = ByteUnit::Mebibyte(100_000); async fn rocket() -> _ { setup_logger(); dotenvy::dotenv().ok(); - debug!("{}", std::env::var("DATABASE_URL").unwrap().as_str()); + let pool = PgPoolOptions::new() .max_connections(5) .connect(std::env::var("DATABASE_URL").unwrap().as_str()) @@ -54,9 +56,14 @@ async fn rocket() -> _ { .manage(pool) .manage(repo_manager) .manage(libraries_manager) + .mount("/", routes![ + ui::user::index + ]) .mount("/api", routes![ api::library::move_file, api::library::upload_file, api::library::download_file, api::library::list_files, api::library::get_file, api::library::delete_file, ]) + .attach(Template::fairing()) + } #[catch(404)] diff --git a/server/src/routes.rs b/server/src/routes.rs index 5050ca9..7b35f3a 100644 --- a/server/src/routes.rs +++ b/server/src/routes.rs @@ -19,3 +19,4 @@ use crate::storage::FileEntry; use crate::util::{JsonErrorResponse, ResponseError}; pub mod api; +pub mod ui; diff --git a/server/src/routes/ui.rs b/server/src/routes/ui.rs new file mode 100644 index 0000000..018ff2e --- /dev/null +++ b/server/src/routes/ui.rs @@ -0,0 +1 @@ +pub mod user; \ No newline at end of file diff --git a/server/src/routes/ui/user.rs b/server/src/routes/ui/user.rs new file mode 100644 index 0000000..cdb5065 --- /dev/null +++ b/server/src/routes/ui/user.rs @@ -0,0 +1,7 @@ +use rocket::get; +use rocket_dyn_templates::{context, Template}; + +#[get("/")] +pub fn index() -> Template { + Template::render("index", context! { test: "value" }) +} \ No newline at end of file diff --git a/server/src/util.rs b/server/src/util.rs index 7d3353e..3047c5c 100644 --- a/server/src/util.rs +++ b/server/src/util.rs @@ -12,7 +12,7 @@ pub(crate) fn setup_logger() { tracing_subscriber::registry() .with( tracing_subscriber::filter::EnvFilter::try_from_default_env() - .unwrap_or_else(|_| format!("{}=trace,storage-server=trace", env!("CARGO_CRATE_NAME")).into()), + .unwrap_or_else(|_| format!("warn,rocket=trace,storage-server=trace").into()), ) .with(tracing_subscriber::fmt::layer()) .init(); diff --git a/server/templates/layouts/main.html.hbs b/server/templates/layouts/main.html.hbs new file mode 100644 index 0000000..ce932b1 --- /dev/null +++ b/server/templates/layouts/main.html.hbs @@ -0,0 +1,26 @@ + + + + + + + + storage-app + + + + + {{> partials/nav }} +
+ +
+ {{> @partial-block }} +
+
+ + diff --git a/server/templates/partials/nav.html.hbs b/server/templates/partials/nav.html.hbs new file mode 100644 index 0000000..9f835c6 --- /dev/null +++ b/server/templates/partials/nav.html.hbs @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/server/templates/partials/sidebar.html.hbs b/server/templates/partials/sidebar.html.hbs new file mode 100644 index 0000000..cb3d9a7 --- /dev/null +++ b/server/templates/partials/sidebar.html.hbs @@ -0,0 +1,47 @@ + + + + + + \ No newline at end of file diff --git a/web/src/routes/+page.svelte b/web/src/routes/+page.svelte index fdadeb1..9db37ce 100644 --- a/web/src/routes/+page.svelte +++ b/web/src/routes/+page.svelte @@ -1,5 +1,5 @@
-

My Files

+

Libraries

@@ -20,6 +20,16 @@ Owner + + + + My Library + + + + Me + +
diff --git a/web/vite.config.ts b/web/vite.config.ts index ab14900..56a23e6 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -17,6 +17,15 @@ export default defineConfig({ compiler: 'svelte', }) ], + server: { + proxy: { + '^/api': { + target: "http://localhost:8080", + changeOrigin: true, + ws: true + } + } + }, test: { workspace: [ {