From 34a928e98c06e021d4de55201fe55c47909b9ee9 Mon Sep 17 00:00:00 2001 From: eraden Date: Mon, 24 Apr 2023 10:01:23 +0200 Subject: [PATCH] Add Trunk.toml --- Cargo.lock | 185 ++++++++++++++++++- server/Cargo.toml | 2 +- server/src/main.rs | 5 +- server/src/routes/unrestricted/businesses.rs | 42 +++++ web/Cargo.toml | 5 +- web/Trunk.toml | 4 + web/src/main.rs | 1 + web/src/pages/local_businesses.rs | 45 +++++ web/src/pages/mod.rs | 1 + 9 files changed, 286 insertions(+), 4 deletions(-) create mode 100644 web/src/pages/local_businesses.rs create mode 100644 web/src/pages/mod.rs diff --git a/Cargo.lock b/Cargo.lock index caf7905..91a8c9c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -288,6 +288,15 @@ dependencies = [ "syn", ] +[[package]] +name = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -459,6 +468,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.6.2", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.13.0" @@ -581,6 +605,16 @@ dependencies = [ "generic-array", ] +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -758,6 +792,28 @@ version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -777,7 +833,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.5.3", ] [[package]] @@ -927,6 +983,12 @@ dependencies = [ "polyval", ] +[[package]] +name = "gimli" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" + [[package]] name = "gumdrop" version = "0.8.1" @@ -1246,6 +1308,15 @@ dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +dependencies = [ + "adler", +] + [[package]] name = "mio" version = "0.8.4" @@ -1306,6 +1377,15 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.30.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.13.0" @@ -1660,6 +1740,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc_version" version = "0.4.0" @@ -1696,6 +1782,12 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.1.0" @@ -1984,14 +2076,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67817393b3c9828db84614f64db9a1ebb94729ce3a3751c41e7ff23d3f8e7f00" dependencies = [ "ahash", + "futures", "indexmap", "js-sys", "paste", "sycamore-core", + "sycamore-futures", "sycamore-macro", "sycamore-reactive", "sycamore-web", "wasm-bindgen", + "wasm-bindgen-futures", "web-sys", ] @@ -2005,6 +2100,18 @@ dependencies = [ "sycamore-reactive", ] +[[package]] +name = "sycamore-futures" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69e4f2b65a22059f711cb36adc454791248e9abdc0b6b04c5dda396098674f2" +dependencies = [ + "futures", + "sycamore-reactive", + "tokio", + "wasm-bindgen-futures", +] + [[package]] name = "sycamore-macro" version = "0.8.2" @@ -2057,6 +2164,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + [[package]] name = "thiserror" version = "1.0.31" @@ -2358,6 +2477,12 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + [[package]] name = "unicode_categories" version = "0.1.1" @@ -2482,6 +2607,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" dependencies = [ "cfg-if", + "serde", + "serde_json", "wasm-bindgen-macro", ] @@ -2500,6 +2627,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.81" @@ -2529,11 +2668,55 @@ version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" +[[package]] +name = "wasm-bindgen-test" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b30cf2cba841a812f035c40c50f53eb9c56181192a9dd2c71b65e6a87a05ba" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ad594bf33e73cafcac2ae9062fc119d4f75f9c77e25022f91c9a64bd5b6463" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "wasm_request" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34794d2ba7b0563e69c9c82877274956153197771d62b86066b9154840ece516" +dependencies = [ + "failure", + "js-sys", + "serde", + "serde_derive", + "serde_json", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test", + "web-sys", +] + [[package]] name = "web" version = "0.1.0" dependencies = [ + "serde", + "serde_json", "sycamore", + "wasm_request", ] [[package]] diff --git a/server/Cargo.toml b/server/Cargo.toml index 2787ab7..2bf9e9c 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -33,4 +33,4 @@ tracing-actix-web = { version = "*" } tracing-subscriber = { version = "*" } uuid = { version = "*", features = ["serde"] } validator = { version = "0.14", features = ["derive"] } -base64 = "0.13.0" +base64 = { version = "0.13.0" } diff --git a/server/src/main.rs b/server/src/main.rs index 31fbad7..a768970 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -5,6 +5,7 @@ use actix_identity::{CookieIdentityPolicy, IdentityService}; use actix_web::web::Data; use actix_web::{web, App, HttpServer}; +use tracing::info; use crate::routes::render_index; @@ -42,7 +43,7 @@ async fn main() -> std::io::Result<()> { .ok() .and_then(|s| s.parse().ok()) .or_else(|| opts.port.and_then(|s| s.parse().ok())) - .unwrap_or(8080), + .unwrap_or(8000), ); let pool = sqlx::postgres::PgPoolOptions::new() @@ -54,6 +55,8 @@ async fn main() -> std::io::Result<()> { queries::test_dictionary(&pool).await; + info!("Listen on {addr:?}"); + HttpServer::new(move || { let policy = CookieIdentityPolicy::new(&[0; 32]) .name("auth-cookie") diff --git a/server/src/routes/unrestricted/businesses.rs b/server/src/routes/unrestricted/businesses.rs index 1e88910..974517f 100644 --- a/server/src/routes/unrestricted/businesses.rs +++ b/server/src/routes/unrestricted/businesses.rs @@ -54,6 +54,47 @@ pub async fn businesses_page(req: HttpRequest, db: Data, id: Identity) - ) } +#[get("all.json")] +#[tracing::instrument] +pub async fn businesses_json(req: HttpRequest, db: Data, id: Identity) -> HttpResult { + let pool = db.into_inner(); + let mut t = crate::ok_or_internal!(&req, pool.begin().await); + let record = match id.identity() { + Some(id) => queries::account_by_id(&mut t, id).await, + _ => None, + }; + let (services, mut items, mut contacts) = { + use crate::model::db::{LocalBusiness, LocalBusinessItem}; + let services: Vec = queries::visible_businesses(&mut t) + .await + .unwrap_or_default(); + + let items: Vec = queries::visible_business_items(&mut t) + .await + .unwrap_or_default(); + + let contacts = queries::all_contacts(&mut t).await.unwrap_or_default(); + (services, items, contacts) + }; + + let services: Vec<_> = services + .into_iter() + .map(|service| view::LocalBusiness::from((service, &mut items, &mut contacts))) + .collect::>(); + + t.commit().await.ok(); + + HttpResult::json( + StatusCode::OK, + IndexTemplate { + businesses: services, + account: record, + page: Page::LocalBusinesses, + ..Default::default() + }, + ) +} + #[derive(Default, Debug, Serialize, Template)] #[template(path = "businesses/show.html")] pub struct ShowTemplate { @@ -125,6 +166,7 @@ pub async fn show_business_page( pub fn configure(config: &mut ServiceConfig) { config.service( web::scope("/local-businesses") + .service(businesses_json) .service(show_business_page) .service(businesses_page), ); diff --git a/web/Cargo.toml b/web/Cargo.toml index 1076915..e494881 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -4,4 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -sycamore = "0.8.2" +sycamore = { version = "0.8.2", features = ['suspense'] } +wasm_request = { version = "0.1.1" } +serde = { version = "*" } +serde_json = { version = "*" } diff --git a/web/Trunk.toml b/web/Trunk.toml index 71a1860..e5245b5 100644 --- a/web/Trunk.toml +++ b/web/Trunk.toml @@ -6,3 +6,7 @@ dist = "dist" stage = "build" command = "zsh" command_arguments = ["-c", "tailwindcss -i assets/tailwind.css -o $TRUNK_STAGING_DIR/tailwind.css"] + +[[proxy]] +rewrite = "/api" +backend = "http://localhost:8000/" diff --git a/web/src/main.rs b/web/src/main.rs index 51a3493..e5ee69d 100644 --- a/web/src/main.rs +++ b/web/src/main.rs @@ -1,4 +1,5 @@ mod components; +mod pages; use components::Card; use sycamore::prelude::*; diff --git a/web/src/pages/local_businesses.rs b/web/src/pages/local_businesses.rs new file mode 100644 index 0000000..b87715a --- /dev/null +++ b/web/src/pages/local_businesses.rs @@ -0,0 +1,45 @@ +use serde::{Deserialize, Serialize}; +use sycamore::futures::spawn_local_scoped; +use sycamore::prelude::*; + +#[derive(Debug, Default, Serialize, Deserialize)] +pub struct LocalBusiness { + pub id: i32, + pub owner_id: i32, + pub name: String, + pub description: String, + pub state: db::LocalBusinessState, + pub items: Vec, + pub contacts: Vec, +} + +#[derive(Debug, Default, Serialize, Deserialize)] +pub struct IndexTemplate { + businesses: Vec, + account: Option, + error: Option, + page: Page, + h: Helper, +} + +#[component] +pub fn LocalBusinesses(cx: Scope) -> View { + let submit_registration = || { + spawn_local_scoped(cx, async move { + let req = wasm_request::get_options::>( + "/api/local-businesses/all.json", + wasm_request::Method::Get, + None, + None, + ); + wasm_request::request(req).await.unwrap_or_default(); + }) + }; + + view!( + cx, + article() { + // + } + ) +} diff --git a/web/src/pages/mod.rs b/web/src/pages/mod.rs new file mode 100644 index 0000000..cf3856c --- /dev/null +++ b/web/src/pages/mod.rs @@ -0,0 +1 @@ +pub mod local_businesses;