From 1c327aaffbeff4c0d91ed89b11fc9c05c3c3de5c Mon Sep 17 00:00:00 2001 From: Aravinth Manivannan Date: Fri, 10 Jan 2025 15:51:27 +0530 Subject: [PATCH] feat: bootstrap templating engine --- Cargo.lock | 499 +++++++++++++----- Cargo.toml | 3 +- src/main.rs | 15 +- web_ui/.gitignore | 1 + web_ui/Cargo.toml | 15 + web_ui/Makefile | 2 + web_ui/src/identity/mod.rs | 17 + web_ui/src/identity/owner_update_email.rs | 67 +++ web_ui/src/identity/owner_verify_email.rs | 67 +++ web_ui/src/lib.rs | 11 + web_ui/src/log.rs | 25 + web_ui/src/utils.rs | 149 ++++++ .../identity/employee_exit_organization.html | 14 + web_ui/templates/identity/employee_login.html | 27 + .../templates/identity/employee_register.html | 37 ++ .../templates/identity/owner_add_store.html | 25 + .../identity/owner_change_password.html | 31 ++ .../templates/identity/owner_delete_user.html | 20 + web_ui/templates/identity/owner_login.html | 27 + web_ui/templates/identity/owner_register.html | 43 ++ .../identity/owner_update_email.html | 25 + .../identity/owner_update_store.html | 25 + .../identity/owner_verify_email.html | 14 + web_ui/templates/nav_segment.html | 25 + web_ui/templates/tailwind_config.html | 25 + 25 files changed, 1051 insertions(+), 158 deletions(-) create mode 100644 web_ui/.gitignore create mode 100644 web_ui/Cargo.toml create mode 100644 web_ui/Makefile create mode 100644 web_ui/src/identity/mod.rs create mode 100644 web_ui/src/identity/owner_update_email.rs create mode 100644 web_ui/src/identity/owner_verify_email.rs create mode 100644 web_ui/src/lib.rs create mode 100644 web_ui/src/log.rs create mode 100644 web_ui/src/utils.rs create mode 100644 web_ui/templates/identity/employee_exit_organization.html create mode 100644 web_ui/templates/identity/employee_login.html create mode 100644 web_ui/templates/identity/employee_register.html create mode 100644 web_ui/templates/identity/owner_add_store.html create mode 100644 web_ui/templates/identity/owner_change_password.html create mode 100644 web_ui/templates/identity/owner_delete_user.html create mode 100644 web_ui/templates/identity/owner_login.html create mode 100644 web_ui/templates/identity/owner_register.html create mode 100644 web_ui/templates/identity/owner_update_email.html create mode 100644 web_ui/templates/identity/owner_update_store.html create mode 100644 web_ui/templates/identity/owner_verify_email.html create mode 100644 web_ui/templates/nav_segment.html create mode 100644 web_ui/templates/tailwind_config.html diff --git a/Cargo.lock b/Cargo.lock index 1aa0aa5..8bb847a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -81,7 +81,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -216,7 +216,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -348,9 +348,9 @@ checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "argon2-creds" @@ -395,7 +395,7 @@ checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -460,9 +460,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be" dependencies = [ "serde", ] @@ -510,9 +510,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.11.1" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786a307d683a5bf92e6fd5fd69a7eb613751668d1d8d67d802846dfe367c62c8" +checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" dependencies = [ "memchr", "serde", @@ -547,9 +547,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.4" +version = "1.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf" +checksum = "ad0cf6e91fde44c773c6ee7ec6bba798504641a8bc2eb7e37a04ffbf4dfaa55a" dependencies = [ "jobserver", "libc", @@ -588,7 +588,7 @@ checksum = "93698b29de5e97ad0ae26447b344c482a7284c737d9ddc5f9e52b74a336671bb" dependencies = [ "chrono", "chrono-tz-build", - "phf 0.11.2", + "phf 0.11.3", ] [[package]] @@ -598,8 +598,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c088aee841df9c3041febbb73934cfc39708749bf96dc827e3359cd39ef11b1" dependencies = [ "parse-zoneinfo", - "phf 0.11.2", - "phf_codegen 0.11.2", + "phf 0.11.3", + "phf_codegen 0.11.3", ] [[package]] @@ -852,7 +852,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -900,7 +900,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -922,7 +922,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -954,7 +954,7 @@ checksum = "74ef43543e701c01ad77d3a5922755c6a1d71b22d942cb8042be4994b380caff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -996,7 +996,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -1016,7 +1016,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core 0.20.2", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -1029,7 +1029,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -1049,7 +1049,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", "unicode-xid", ] @@ -1079,7 +1079,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -1180,6 +1180,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "erased-serde" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" +dependencies = [ + "serde", + "typeid", +] + [[package]] name = "errno" version = "0.3.10" @@ -1353,7 +1363,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -1668,15 +1678,15 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http 1.2.0", "hyper", "hyper-util", - "rustls 0.23.20", + "rustls 0.23.21", "rustls-pki-types", "tokio", "tokio-rustls", @@ -1857,7 +1867,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -1876,16 +1886,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "idna" version = "1.0.3" @@ -1931,9 +1931,9 @@ dependencies = [ [[package]] name = "impl-more" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae21c3177a27788957044151cc2800043d127acaa460a47ebb9b84dfa2c6aa0" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" [[package]] name = "indexmap" @@ -2067,7 +2067,7 @@ dependencies = [ "percent-encoding", "quoted_printable", "rsa", - "rustls 0.23.20", + "rustls 0.23.21", "rustls-pemfile 2.2.0", "rustls-pki-types", "sha2", @@ -2082,9 +2082,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.168" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libm" @@ -2105,9 +2105,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" @@ -2144,9 +2144,12 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "3d6ea2a48c204030ee31a7d7fc72c93294c92fe87ecb1789881c9543516e1a0d" +dependencies = [ + "value-bag", +] [[package]] name = "mac" @@ -2209,7 +2212,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -2301,7 +2304,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -2398,9 +2401,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -2440,7 +2443,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -2449,6 +2452,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-src" +version = "300.4.1+3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" version = "0.9.104" @@ -2457,6 +2469,7 @@ checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] @@ -2537,7 +2550,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ "memchr", - "thiserror 2.0.8", + "thiserror 2.0.11", "ucd-trie", ] @@ -2561,7 +2574,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -2586,11 +2599,11 @@ dependencies = [ [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "phf_shared 0.11.2", + "phf_shared 0.11.3", ] [[package]] @@ -2605,12 +2618,12 @@ dependencies = [ [[package]] name = "phf_codegen" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "phf_generator 0.11.2", - "phf_shared 0.11.2", + "phf_generator 0.11.3", + "phf_shared 0.11.3", ] [[package]] @@ -2625,11 +2638,11 @@ dependencies = [ [[package]] name = "phf_generator" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared 0.11.2", + "phf_shared 0.11.3", "rand", ] @@ -2639,43 +2652,43 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" dependencies = [ - "siphasher", + "siphasher 0.3.11", ] [[package]] name = "phf_shared" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "siphasher", + "siphasher 1.0.1", ] [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -2760,9 +2773,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "predicates" -version = "3.1.2" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97" +checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" dependencies = [ "anstyle", "predicates-core", @@ -2770,15 +2783,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" [[package]] name = "predicates-tree" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" dependencies = [ "predicates-core", "termtree", @@ -2819,10 +2832,32 @@ dependencies = [ ] [[package]] -name = "proc-macro2" -version = "1.0.92" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +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.96", +] + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -2847,9 +2882,9 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.20", + "rustls 0.23.21", "socket2", - "thiserror 2.0.8", + "thiserror 2.0.11", "tokio", "tracing", ] @@ -2865,10 +2900,10 @@ dependencies = [ "rand", "ring", "rustc-hash", - "rustls 0.23.20", + "rustls 0.23.21", "rustls-pki-types", "slab", - "thiserror 2.0.8", + "thiserror 2.0.11", "tinyvec", "tracing", "web-time", @@ -2890,9 +2925,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -2979,9 +3014,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64 0.22.1", "bytes", @@ -3005,7 +3040,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.20", + "rustls 0.23.21", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", @@ -3017,6 +3052,7 @@ dependencies = [ "tokio-native-tls", "tokio-rustls", "tokio-util", + "tower", "tower-service", "url", "wasm-bindgen", @@ -3105,7 +3141,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.90", + "syn 2.0.96", "walkdir", ] @@ -3153,9 +3189,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.42" +version = "0.38.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ "bitflags", "errno", @@ -3177,9 +3213,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" dependencies = [ "log", "once_cell", @@ -3293,9 +3329,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -3324,7 +3360,16 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", +] + +[[package]] +name = "serde_fmt" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d4ddca14104cd60529e8c7f7ba71a2c8acd8f7f5cfcdc2faf97eeb7c3010a4" +dependencies = [ + "serde", ] [[package]] @@ -3413,6 +3458,12 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.9" @@ -3759,7 +3810,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -3770,7 +3821,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -3779,6 +3830,84 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "sval" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6dc0f9830c49db20e73273ffae9b5240f63c42e515af1da1fceefb69fceafd8" + +[[package]] +name = "sval_buffer" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "429922f7ad43c0ef8fd7309e14d750e38899e32eb7e8da656ea169dd28ee212f" +dependencies = [ + "sval", + "sval_ref", +] + +[[package]] +name = "sval_dynamic" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f16ff5d839396c11a30019b659b0976348f3803db0626f736764c473b50ff4" +dependencies = [ + "sval", +] + +[[package]] +name = "sval_fmt" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c01c27a80b6151b0557f9ccbe89c11db571dc5f68113690c1e028d7e974bae94" +dependencies = [ + "itoa", + "ryu", + "sval", +] + +[[package]] +name = "sval_json" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0deef63c70da622b2a8069d8600cf4b05396459e665862e7bdb290fd6cf3f155" +dependencies = [ + "itoa", + "ryu", + "sval", +] + +[[package]] +name = "sval_nested" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a39ce5976ae1feb814c35d290cf7cf8cd4f045782fe1548d6bc32e21f6156e9f" +dependencies = [ + "sval", + "sval_buffer", + "sval_ref", +] + +[[package]] +name = "sval_ref" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb7c6ee3751795a728bc9316a092023529ffea1783499afbc5c66f5fabebb1fa" +dependencies = [ + "sval", +] + +[[package]] +name = "sval_serde" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a5572d0321b68109a343634e3a5d576bf131b82180c6c442dee06349dfc652a" +dependencies = [ + "serde", + "sval", + "sval_nested", +] + [[package]] name = "syn" version = "1.0.109" @@ -3792,9 +3921,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -3818,7 +3947,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -3844,12 +3973,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if", "fastrand", + "getrandom", "once_cell", "rustix", "windows-sys 0.59.0", @@ -3899,9 +4029,9 @@ dependencies = [ [[package]] name = "termtree" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" [[package]] name = "thiserror" @@ -3914,11 +4044,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.8" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f5383f3e0071702bf93ab5ee99b52d26936be9dedd9413067cbdcddcb6141a" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ - "thiserror-impl 2.0.8", + "thiserror-impl 2.0.11", ] [[package]] @@ -3929,18 +4059,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "thiserror-impl" -version = "2.0.8" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f357fcec90b3caef6623a099691be676d033b40a058ac95d2a6ade6fa0c943" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -3995,9 +4125,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -4010,9 +4140,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.42.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -4028,13 +4158,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -4053,7 +4183,7 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.20", + "rustls 0.23.21", "tokio", ] @@ -4115,6 +4245,27 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -4154,7 +4305,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -4187,6 +4338,12 @@ dependencies = [ "url", ] +[[package]] +name = "typeid" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" + [[package]] name = "typenum" version = "1.17.0" @@ -4348,9 +4505,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "b913a3b5fe84142e269d63cc62b64319ccaf89b748fc31fe025177f767a756c4" dependencies = [ "getrandom", "serde", @@ -4375,18 +4532,18 @@ dependencies = [ [[package]] name = "validator" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db79c75af171630a3148bd3e6d7c4f42b6a9a014c2945bc5ed0020cbb8d9478e" +checksum = "d0b4a29d8709210980a09379f27ee31549b73292c87ab9899beee1c0d3be6303" dependencies = [ - "idna 0.5.0", + "idna 1.0.3", "once_cell", "regex", "serde", "serde_derive", "serde_json", "url", - "validator_derive 0.18.2", + "validator_derive 0.19.0", ] [[package]] @@ -4407,16 +4564,16 @@ dependencies = [ [[package]] name = "validator_derive" -version = "0.18.2" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0bcf92720c40105ac4b2dda2a4ea3aa717d4d6a862cc217da653a4bd5c6b10" +checksum = "bac855a2ce6f843beb229757e6e570a42e837bcb15e5f449dd48d5747d41bf77" dependencies = [ "darling 0.20.10", "once_cell", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -4429,6 +4586,42 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "value-bag" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" +dependencies = [ + "value-bag-serde1", + "value-bag-sval2", +] + +[[package]] +name = "value-bag-serde1" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb773bd36fd59c7ca6e336c94454d9c66386416734817927ac93d81cb3c5b0b" +dependencies = [ + "erased-serde", + "serde", + "serde_fmt", +] + +[[package]] +name = "value-bag-sval2" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a916a702cac43a88694c97657d449775667bcd14b70419441d05b7fea4a83a" +dependencies = [ + "sval", + "sval_buffer", + "sval_dynamic", + "sval_fmt", + "sval_json", + "sval_ref", + "sval_serde", +] + [[package]] name = "vanikam" version = "0.1.0" @@ -4463,7 +4656,8 @@ dependencies = [ "twilio_client", "url", "uuid", - "validator 0.18.1", + "validator 0.19.0", + "web_ui", ] [[package]] @@ -4530,7 +4724,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", "wasm-bindgen-shared", ] @@ -4565,7 +4759,7 @@ checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4609,6 +4803,21 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web_ui" +version = "0.1.0" +dependencies = [ + "derive_builder 0.20.2", + "derive_more 0.99.18", + "lazy_static", + "rust-embed", + "serde", + "serde_json", + "tera", + "tracing", + "url", +] + [[package]] name = "webpki-roots" version = "0.25.4" @@ -4832,9 +5041,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" dependencies = [ "memchr", ] @@ -4893,7 +5102,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", "synstructure", ] @@ -4915,7 +5124,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -4935,7 +5144,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", "synstructure", ] @@ -4964,7 +5173,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 3a015ad..75ab30c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" [workspace] exclude = ["utils/db-migrations"] #, "utils/cache-bust"] -members = [".", "mailpit_client", "twilio_client"] +members = [".", "mailpit_client", "twilio_client", "web_ui"] [dependencies] actix-identity = "0.8.0" @@ -38,6 +38,7 @@ url = { version = "2.5.0", features = ["serde"] } uuid = { version = "1.10.0", features = ["v4", "serde"] } validator = { version = "0.19.0", features = ["derive"] } twilio_client = { path = "./twilio_client" } +web_ui = { path = "./web_ui" } [dev-dependencies] #reqwest = { version = "0.12.4", features = ["json"] } diff --git a/src/main.rs b/src/main.rs index 6ee53c1..fc62f9b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,6 +16,7 @@ mod inventory; mod ordering; mod settings; #[cfg(test)] +#[macro_use] mod tests; mod types; mod utils; @@ -33,6 +34,7 @@ async fn main() { } pretty_env_logger::init(); + web_ui::init(); let db = db::sqlx_postgres::Postgres::init(&settings.database.url).await; db.migrate().await; @@ -58,21 +60,10 @@ async fn main() { .wrap( middleware::DefaultHeaders::new().add(("Permissions-Policy", "interest-cohort=()")), ) - .configure(billing::adapters::load_adapters( + .configure(utils::load_adapters::load_adapters( db.pool.clone(), settings.clone(), )) - .configure(identity::adapters::load_adapters( - db.pool.clone(), - settings.clone(), - )) - .configure(billing::adapters::load_adapters( - db.pool.clone(), - settings.clone(), - )) - // .configure(auth::adapter::load_adapters(db.pool.clone(), &settings)) - .configure(utils::random_string::GenerateRandomString::inject()) - .configure(utils::uuid::GenerateUUID::inject()) }) .bind(&socket_addr) .unwrap() diff --git a/web_ui/.gitignore b/web_ui/.gitignore new file mode 100644 index 0000000..3fec32c --- /dev/null +++ b/web_ui/.gitignore @@ -0,0 +1 @@ +tmp/ diff --git a/web_ui/Cargo.toml b/web_ui/Cargo.toml new file mode 100644 index 0000000..3d5d3b6 --- /dev/null +++ b/web_ui/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "web_ui" +version = "0.1.0" +edition = "2024" + +[dependencies] +derive_builder = "0.20.0" +derive_more = { version = "0.99.17", features = ["error"]} +lazy_static = "1.5.0" +rust-embed = { version = "8.4.0", features = ["debug-embed"]} +serde = { version = "1.0.201", features = ["derive"] } +serde_json = "1.0.117" +tera = "1.19.0" +tracing = { version = "0.1.40", features = ["log"] } +url = { version = "2.5.0", features = ["serde"] } diff --git a/web_ui/Makefile b/web_ui/Makefile new file mode 100644 index 0000000..585864c --- /dev/null +++ b/web_ui/Makefile @@ -0,0 +1,2 @@ +check: ## Check for syntax errors on all workspaces + cargo check --tests --all-features diff --git a/web_ui/src/identity/mod.rs b/web_ui/src/identity/mod.rs new file mode 100644 index 0000000..411f72e --- /dev/null +++ b/web_ui/src/identity/mod.rs @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2024 Aravinth Manivannan +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +pub mod owner_update_email; +pub mod owner_verify_email; + +pub fn register_templates(t: &mut tera::Tera) { + for template in [ + owner_update_email::ONWER_UPDATE_EMAIL_PAGE, + owner_verify_email::ONWER_VERIFY_EMAIL_PAGE, + ] + .iter() + { + template.register(t).expect(template.name); + } +} diff --git a/web_ui/src/identity/owner_update_email.rs b/web_ui/src/identity/owner_update_email.rs new file mode 100644 index 0000000..472497d --- /dev/null +++ b/web_ui/src/identity/owner_update_email.rs @@ -0,0 +1,67 @@ +// SPDX-FileCopyrightText: 2024 Aravinth Manivannan +// +// SPDX-License-Identifier: AGPL-3.0-or-later +use std::cell::RefCell; + +use derive_builder::*; +use derive_more::*; +use serde::*; +use tera::Context; +use url::Url; + +pub use super::*; +use crate::utils::*; + +pub const ONWER_UPDATE_EMAIL_PAGE: TemplateFile = TemplateFile::new( + "identity.owner_update_email", + "identity/owner_update_email.html", +); + +pub fn register_templates(t: &mut tera::Tera) { + ONWER_UPDATE_EMAIL_PAGE + .register(t) + .expect(ONWER_UPDATE_EMAIL_PAGE.name); +} + +pub struct OwnerUpdateEmailPage { + ctx: RefCell, +} + +impl OwnerUpdateEmailPage { + pub fn new() -> Self { + let mut ctx = context(); + + //ctx.insert(PAYLOAD_KEY, p); + + let ctx = RefCell::new(ctx); + Self { ctx } + } + + pub fn render(&self) -> String { + TEMPLATES + .render(ONWER_UPDATE_EMAIL_PAGE.name, &self.ctx.borrow()) + .unwrap() + } + + pub fn page() -> String { + let p = Self::new(); + p.render() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn render_page_and_write() { + const FILE: &str = "./tmp/identity-owner_update_email.html"; + + let tw = TestWriterBuilder::default() + .file(FILE.into()) + .contents(OwnerUpdateEmailPage::page()) + .build() + .unwrap(); + tw.write(); + } +} diff --git a/web_ui/src/identity/owner_verify_email.rs b/web_ui/src/identity/owner_verify_email.rs new file mode 100644 index 0000000..8e5785d --- /dev/null +++ b/web_ui/src/identity/owner_verify_email.rs @@ -0,0 +1,67 @@ +// SPDX-FileCopyrightText: 2024 Aravinth Manivannan +// +// SPDX-License-Identifier: AGPL-3.0-or-later +use std::cell::RefCell; + +use derive_builder::*; +use derive_more::*; +use serde::*; +use tera::Context; +use url::Url; + +pub use super::*; +use crate::utils::*; + +pub const ONWER_VERIFY_EMAIL_PAGE: TemplateFile = TemplateFile::new( + "identity.owner_verify_email", + "identity/owner_verify_email.html", +); + +pub fn register_templates(t: &mut tera::Tera) { + ONWER_VERIFY_EMAIL_PAGE + .register(t) + .expect(ONWER_VERIFY_EMAIL_PAGE.name); +} + +pub struct OwnerVerifyEmailPage { + ctx: RefCell, +} + +impl OwnerVerifyEmailPage { + pub fn new() -> Self { + let mut ctx = context(); + + //ctx.insert(PAYLOAD_KEY, p); + + let ctx = RefCell::new(ctx); + Self { ctx } + } + + pub fn render(&self) -> String { + TEMPLATES + .render(ONWER_VERIFY_EMAIL_PAGE.name, &self.ctx.borrow()) + .unwrap() + } + + pub fn page() -> String { + let p = Self::new(); + p.render() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn render_page_and_write() { + const FILE: &str = "./tmp/identity-owner_verify_email.html"; + + let tw = TestWriterBuilder::default() + .file(FILE.into()) + .contents(OwnerVerifyEmailPage::page()) + .build() + .unwrap(); + tw.write(); + } +} diff --git a/web_ui/src/lib.rs b/web_ui/src/lib.rs new file mode 100644 index 0000000..d02df30 --- /dev/null +++ b/web_ui/src/lib.rs @@ -0,0 +1,11 @@ +// SPDX-FileCopyrightText: 2024 Aravinth Manivannan +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +pub mod identity; +mod log; +mod utils; + +pub fn init() { + lazy_static::initialize(&utils::TEMPLATES); +} diff --git a/web_ui/src/log.rs b/web_ui/src/log.rs new file mode 100644 index 0000000..f1d278b --- /dev/null +++ b/web_ui/src/log.rs @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2024 Aravinth Manivannan +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +#[allow(unused_imports)] +#[cfg(test)] +pub(crate) use println as info; +#[allow(unused_imports)] +#[cfg(test)] +pub(crate) use println as error; + +#[allow(unused_imports)] +#[cfg(test)] +pub(crate) use println as trace; + +#[allow(unused_imports)] +#[cfg(test)] +pub(crate) use println as debug; + +#[allow(unused_imports)] +#[cfg(test)] +pub(crate) use println as warn; + +#[cfg(not(test))] +pub use tracing::{debug, error, info, trace, warn}; diff --git a/web_ui/src/utils.rs b/web_ui/src/utils.rs new file mode 100644 index 0000000..f6674b6 --- /dev/null +++ b/web_ui/src/utils.rs @@ -0,0 +1,149 @@ +// SPDX-FileCopyrightText: 2024 Aravinth Manivannan +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +use lazy_static::lazy_static; +use rust_embed::RustEmbed; +use serde::*; +use tera::*; +#[allow(unused_imports)] +#[cfg(test)] +pub use tests::*; + +pub struct TemplateFile { + pub name: &'static str, + pub path: &'static str, +} + +impl TemplateFile { + pub const fn new(name: &'static str, path: &'static str) -> Self { + Self { name, path } + } + + pub fn register(&self, t: &mut Tera) -> std::result::Result<(), tera::Error> { + t.add_raw_template(self.name, &Templates::get_template(self).expect(self.name)) + } + + #[cfg(test)] + #[allow(dead_code)] + pub fn register_from_file(&self, t: &mut Tera) -> std::result::Result<(), tera::Error> { + use std::path::Path; + t.add_template_file(Path::new("templates/").join(self.path), Some(self.name)) + } +} + +pub const PAYLOAD_KEY: &str = "payload"; + +pub const NAV_SEGMENT: TemplateFile = TemplateFile::new("nav_segment.html", "nav_segment.html"); + +pub const TAILWIND_CONFIG: TemplateFile = + TemplateFile::new("tailwind_config.html", "tailwind_config.html"); + +lazy_static! { + pub static ref TEMPLATES: Tera = { + let mut tera = Tera::default(); + for t in [NAV_SEGMENT, TAILWIND_CONFIG].iter() { + t.register(&mut tera).unwrap(); + } + tera.autoescape_on(vec![".html", ".sql"]); + crate::identity::register_templates(&mut tera); + tera + }; +} + +#[derive(RustEmbed)] +#[folder = "templates/"] +pub struct Templates; + +impl Templates { + pub fn get_template(t: &TemplateFile) -> Option { + match Self::get(t.path) { + Some(file) => Some(String::from_utf8_lossy(&file.data).into_owned()), + None => None, + } + } +} + +pub fn context() -> Context { + let ctx = Context::new(); + // let footer = Footer::new(s); + // ctx.insert("footer", &footer); + // ctx.insert("page", &PAGES); + // ctx.insert("assets", &*ASSETS); + ctx +} + +//pub fn auth_ctx(username: Option<&str>, s: &Settings) -> Context { +// use routes::GistProfilePathComponent; +// let mut profile_link = None; +// if let Some(name) = username { +// profile_link = Some( +// PAGES +// .gist +// .get_profile_route(GistProfilePathComponent { username: name }), +// ); +// } +// let mut ctx = Context::new(); +// let footer = Footer::new(s); +// ctx.insert("footer", &footer); +// ctx.insert("page", &PAGES); +// ctx.insert("assets", &*ASSETS); +// ctx.insert("loggedin_user", &profile_link); +// ctx +//} + +#[derive(Serialize)] +pub struct Footer<'a> { + // version: &'a str, + admin_email: &'a str, + source_code: &'a str, + // git_hash: &'a str, + // settings: &'a Settings, + // demo_user: &'a str, + // demo_password: &'a str, +} + +impl<'a> Footer<'a> { + pub fn new(admin_email: &'a str, source_code: &'a str) -> Self { + Self { + // version: VERSION, + source_code, + admin_email, + // git_hash: &GIT_COMMIT_HASH[..8], + // demo_user: crate::demo::DEMO_USER, + // demo_password: crate::demo::DEMO_PASSWORD, + // settings, + } + } +} + + +#[cfg(test)] +pub mod tests { + use super::*; + use derive_builder::*; + use derive_more::*; + use tracing::info; + + use std::fs; + use std::path::Path; + + #[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize, Builder)] + pub struct TestWriter { + file: String, + contents: String, + } + + impl TestWriter { + pub fn write(&self) { + let p = Path::new(&self.file); + if p.exists() { + info!("{:?} exists; removing", p.canonicalize().unwrap()); + fs::remove_file(&self.file).unwrap(); + } + + let _ = fs::write(&self.file, self.contents.as_bytes()); + info!("contents written to file: {:?}", p.canonicalize().unwrap()); + } + } +} diff --git a/web_ui/templates/identity/employee_exit_organization.html b/web_ui/templates/identity/employee_exit_organization.html new file mode 100644 index 0000000..801785d --- /dev/null +++ b/web_ui/templates/identity/employee_exit_organization.html @@ -0,0 +1,14 @@ + + + + + + Exit organization | Vanikam + + + +
+ +
+ + diff --git a/web_ui/templates/identity/employee_login.html b/web_ui/templates/identity/employee_login.html new file mode 100644 index 0000000..56a8ac9 --- /dev/null +++ b/web_ui/templates/identity/employee_login.html @@ -0,0 +1,27 @@ + + + + + + Login | Vanikam + + + +
+ + + + + +
+ +

New here? Click here to register!

+ + + diff --git a/web_ui/templates/identity/employee_register.html b/web_ui/templates/identity/employee_register.html new file mode 100644 index 0000000..5184221 --- /dev/null +++ b/web_ui/templates/identity/employee_register.html @@ -0,0 +1,37 @@ + + + + + + Register | Vanikam + + + +
+ + + + + + + + + +
+ +

Already have an account? Click here to log in!

+ + + diff --git a/web_ui/templates/identity/owner_add_store.html b/web_ui/templates/identity/owner_add_store.html new file mode 100644 index 0000000..e2e77bf --- /dev/null +++ b/web_ui/templates/identity/owner_add_store.html @@ -0,0 +1,25 @@ + + + + + + Create Store | Vanikam + + + +
+ + + + + +
+ + + diff --git a/web_ui/templates/identity/owner_change_password.html b/web_ui/templates/identity/owner_change_password.html new file mode 100644 index 0000000..242f9a6 --- /dev/null +++ b/web_ui/templates/identity/owner_change_password.html @@ -0,0 +1,31 @@ + + + + + + Change Password | Vanikam + + + +
+ + + + + + + + +
+ + + diff --git a/web_ui/templates/identity/owner_delete_user.html b/web_ui/templates/identity/owner_delete_user.html new file mode 100644 index 0000000..13d6e67 --- /dev/null +++ b/web_ui/templates/identity/owner_delete_user.html @@ -0,0 +1,20 @@ + + + + + + Delete account | Vanikam + + + +
+ + + + +
+ + diff --git a/web_ui/templates/identity/owner_login.html b/web_ui/templates/identity/owner_login.html new file mode 100644 index 0000000..095f9a7 --- /dev/null +++ b/web_ui/templates/identity/owner_login.html @@ -0,0 +1,27 @@ + + + + + + Login | Vanikam + + + +
+ + + + + +
+ +

New here? Click here to register!

+ + + diff --git a/web_ui/templates/identity/owner_register.html b/web_ui/templates/identity/owner_register.html new file mode 100644 index 0000000..94b5a43 --- /dev/null +++ b/web_ui/templates/identity/owner_register.html @@ -0,0 +1,43 @@ + + + + + + Register | Vanikam + + + +
+ + + + + + + + + + + + +
+ +

Already have an account? Click here to log in!

+ + + diff --git a/web_ui/templates/identity/owner_update_email.html b/web_ui/templates/identity/owner_update_email.html new file mode 100644 index 0000000..c205d3c --- /dev/null +++ b/web_ui/templates/identity/owner_update_email.html @@ -0,0 +1,25 @@ + + + + + + Update Email | Vanikam + + + +
+ + + + + +
+ + + diff --git a/web_ui/templates/identity/owner_update_store.html b/web_ui/templates/identity/owner_update_store.html new file mode 100644 index 0000000..9c58a96 --- /dev/null +++ b/web_ui/templates/identity/owner_update_store.html @@ -0,0 +1,25 @@ + + + + + + Update Store | Vanikam + + + +
+ + + + + +
+ + + diff --git a/web_ui/templates/identity/owner_verify_email.html b/web_ui/templates/identity/owner_verify_email.html new file mode 100644 index 0000000..3453545 --- /dev/null +++ b/web_ui/templates/identity/owner_verify_email.html @@ -0,0 +1,14 @@ + + + + + + Verify email | Vanikam + + + +
+ +
+ + diff --git a/web_ui/templates/nav_segment.html b/web_ui/templates/nav_segment.html new file mode 100644 index 0000000..21976d4 --- /dev/null +++ b/web_ui/templates/nav_segment.html @@ -0,0 +1,25 @@ + diff --git a/web_ui/templates/tailwind_config.html b/web_ui/templates/tailwind_config.html new file mode 100644 index 0000000..876a1da --- /dev/null +++ b/web_ui/templates/tailwind_config.html @@ -0,0 +1,25 @@ + + +