diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml new file mode 100644 index 0000000..31b339f --- /dev/null +++ b/.github/workflows/rust.yml @@ -0,0 +1,21 @@ +name: Rust + +on: + push: + branches: ['main'] + pull_request: + branches: ['main'] + +env: + CARGO_TERM_COLOR: always + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Build + run: cargo build --verbose + - name: Run tests + run: cargo test --verbose diff --git a/Cargo.lock b/Cargo.lock index 5e33158..6138113 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -38,12 +38,6 @@ version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "async-smtp" version = "0.9.1" @@ -69,7 +63,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn", ] [[package]] @@ -179,44 +173,12 @@ dependencies = [ "zeroize", ] -[[package]] -name = "binread" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16598dfc8e6578e9b597d9910ba2e73618385dc9f4b1d43dd92c349d6be6418f" -dependencies = [ - "binread_derive", - "lazy_static", - "rustversion", -] - -[[package]] -name = "binread_derive" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d9672209df1714ee804b1f4d4f68c8eb2a90b1f7a07acf472f88ce198ef1fed" -dependencies = [ - "either", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "bitflags" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - [[package]] name = "blowfish" version = "0.9.1" @@ -245,41 +207,6 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" -[[package]] -name = "candid" -version = "0.10.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c30ee7f886f296b6422c0ff017e89dd4f831521dfdcc76f3f71aae1ce817222" -dependencies = [ - "anyhow", - "binread", - "byteorder", - "candid_derive", - "hex", - "ic_principal", - "leb128", - "num-bigint", - "num-traits", - "paste", - "pretty", - "serde", - "serde_bytes", - "stacker", - "thiserror", -] - -[[package]] -name = "candid_derive" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3de398570c386726e7a59d9887b68763c481477f9a043fb998a2e09d428df1a9" -dependencies = [ - "lazy_static", - "proc-macro2", - "quote", - "syn 2.0.74", -] - [[package]] name = "cc" version = "1.1.10" @@ -322,24 +249,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "cpufeatures" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - [[package]] name = "crypto-common" version = "0.1.6" @@ -365,22 +274,6 @@ dependencies = [ "powerfmt", ] -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - [[package]] name = "enum-as-inner" version = "0.6.0" @@ -390,7 +283,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.74", + "syn", ] [[package]] @@ -464,7 +357,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn", ] [[package]] @@ -538,12 +431,6 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - [[package]] name = "hostname" version = "0.3.1" @@ -658,66 +545,6 @@ dependencies = [ "cc", ] -[[package]] -name = "ic-cdk" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c44983d6e97135d86132111bae5b86c34c498d96b4f182638bebcc7ac07e03c" -dependencies = [ - "candid", - "ic-cdk-macros", - "ic0", - "serde", - "serde_bytes", -] - -[[package]] -name = "ic-cdk-macros" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af44fb4ec3a4b18831c9d3303ca8fa2ace846c4022d50cb8df4122635d3782e" -dependencies = [ - "candid", - "proc-macro2", - "quote", - "serde", - "serde_tokenstream", - "syn 2.0.74", -] - -[[package]] -name = "ic-cdk-timers" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61fdca8e1d9ffb65ae68019b342c182009de9dc206fd849db0b0e90ee19f6fa4" -dependencies = [ - "futures", - "ic-cdk", - "ic0", - "serde", - "serde_bytes", - "slotmap", -] - -[[package]] -name = "ic0" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de254dd67bbd58073e23dc1c8553ba12fa1dc610a19de94ad2bbcd0460c067f" - -[[package]] -name = "ic_principal" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1762deb6f7c8d8c2bdee4b6c5a47b60195b74e9b5280faa5ba29692f8e17429c" -dependencies = [ - "crc32fast", - "data-encoding", - "serde", - "sha2", - "thiserror", -] - [[package]] name = "idna" version = "0.4.0" @@ -795,18 +622,6 @@ dependencies = [ "simple_asn1", ] -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "leb128" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" - [[package]] name = "libc" version = "0.2.155" @@ -851,10 +666,7 @@ dependencies = [ "async-smtp", "axum", "bcrypt", - "candid", "chrono", - "ic-cdk", - "ic-cdk-timers", "jsonwebtoken", "serde", "serde_json", @@ -931,7 +743,6 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", - "serde", ] [[package]] @@ -996,12 +807,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "pem" version = "3.0.4" @@ -1035,7 +840,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn", ] [[package]] @@ -1065,17 +870,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "pretty" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55c4d17d994b637e2f4daf6e5dc5d660d209d5642377d675d7a1c3ab69fa579" -dependencies = [ - "arrayvec", - "typed-arena", - "unicode-width", -] - [[package]] name = "proc-macro2" version = "1.0.86" @@ -1085,15 +879,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "psm" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" -dependencies = [ - "cc", -] - [[package]] name = "quick-error" version = "1.2.3" @@ -1206,15 +991,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde_bytes" -version = "0.11.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" -dependencies = [ - "serde", -] - [[package]] name = "serde_derive" version = "1.0.207" @@ -1223,7 +999,7 @@ checksum = "6aea2634c86b0e8ef2cfdc0c340baede54ec27b1e46febd7f80dffb2aa44a00e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn", ] [[package]] @@ -1248,18 +1024,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_tokenstream" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8790a7c3fe883e443eaa2af6f705952bc5d6e8671a220b9335c8cae92c037e74" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "syn 2.0.74", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1272,26 +1036,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - [[package]] name = "simple_asn1" version = "0.6.2" @@ -1313,15 +1057,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "slotmap" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" -dependencies = [ - "version_check", -] - [[package]] name = "smallvec" version = "1.13.2" @@ -1344,36 +1079,12 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -[[package]] -name = "stacker" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" -dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "winapi", -] - [[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.74" @@ -1414,7 +1125,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn", ] [[package]] @@ -1473,9 +1184,7 @@ dependencies = [ "bytes", "libc", "mio", - "parking_lot", "pin-project-lite", - "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.52.0", @@ -1489,7 +1198,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn", ] [[package]] @@ -1540,7 +1249,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn", ] [[package]] @@ -1598,12 +1307,6 @@ dependencies = [ "trust-dns-proto", ] -[[package]] -name = "typed-arena" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" - [[package]] name = "typenum" version = "1.17.0" @@ -1631,12 +1334,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-width" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" - [[package]] name = "untrusted" version = "0.9.0" @@ -1688,7 +1385,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.74", + "syn", "wasm-bindgen-shared", ] @@ -1710,7 +1407,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1925,7 +1622,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn", ] [[package]] diff --git a/README.md b/README.md index 69c5a14..e944161 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,20 @@ ![Logo](https://github.com/codaholichq/mailpass/blob/main/docs/banner.webp)
- status + status status GitHub repo size GitHub closed issues GitHub stars visitors - + 𝕏

-Welcome to `MailPass`, a web application that checks if an email address exists before sending any email. +Welcome to `MailPass`, a (dApp) decentralized application that checks if an email address exists before sending any email. Read the [Changelog file](https://github.com/codaholichq/mailpass/blob/main/docs/CHANGELOG.md) to see the new changes. @@ -43,7 +43,7 @@ This project helps newsletter owners to: - Vue 3.3.4 - Pinia 2.1.6 - DFinity -- VSCode 1.92.1 +- VSCode 1.92.2 ## Features - [x] Swagger diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 01b79e2..a16fd12 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -5,13 +5,13 @@ edition = "2021" repository = "https://github.com/codaholichq/mailpass" keywords = ["email", "smtp", "mx", "validation", "verification"] categories = ["SaaS", "B2B"] -description = "Checks if an email address exists before sending any email" +description = "A dApp that checks if an email address exists without sending a mail." readme = "README.md" authors = ["Emmy Steven"] license = "MIT" -# [lib] -# crate-type = ["cdylib"] +[lib] +crate-type = ["cdylib", "lib"] [dependencies] async-smtp = { version = "0.9.1" } @@ -21,9 +21,5 @@ chrono = "0.4.38" jsonwebtoken = "9.3.0" serde = { version = "1.0.207", features = ["derive"] } serde_json = "1.0.124" -tokio = { version = "1.39.2", features = ["full"] } +tokio = { version = "1.39.2", features = ["macros", "rt"] } trust-dns-resolver = "0.23.2" - -candid = "0.10" -ic-cdk = "0.15.0" -ic-cdk-timers = "0.9.0" diff --git a/backend/can.did b/backend/can.did deleted file mode 100644 index aa419a2..0000000 --- a/backend/can.did +++ /dev/null @@ -1,3 +0,0 @@ -service : { - "greet": (text) -> (text) query; -} diff --git a/backend/src/lib.rs b/backend/src/lib.rs index a1308e4..8ce11cc 100644 --- a/backend/src/lib.rs +++ b/backend/src/lib.rs @@ -14,8 +14,3 @@ pub async fn run_server() { axum::serve(listener, app).await.unwrap(); } - -#[ic_cdk::query] -fn greet(name: String) -> String { - format!("Hello, {}!", name) -} diff --git a/dfx.json b/dfx.json deleted file mode 100644 index 50ec4e3..0000000 --- a/dfx.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "canisters": { - - "mailpass": { - "candid": "backend/can.did", - "package": "mailpass", - "type": "rust" - }, - - "frontend": { - "dependencies": [ - "mailpass" - ], - "source": [ - "frontend/dist" - ], - "type": "assets", - "workspace": "frontend" - } - }, - - "defaults": { - "build": { - "args": "", - "packtool": "" - } - }, - - "output_env_file": ".env", - "version": 1 -} \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1ac06cf..bfd50b1 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,9 +8,6 @@ "name": "frontend", "version": "0.0.0", "dependencies": { - "@dfinity/agent": "2.0.0", - "@dfinity/candid": "2.0.0", - "@dfinity/principal": "2.0.0", "pinia": "^2.1.6", "vue": "^3.3.4" }, @@ -64,39 +61,6 @@ "node": ">=6.9.0" } }, - "node_modules/@dfinity/agent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-2.0.0.tgz", - "integrity": "sha512-Cc2VDAMfxCNIQoaEeKPf0rbS/Y21HAF+eEFj6GfijNnUxS42i4zwUF2PUvEJZqaB2FQwA9SC7MDyuwL8BR2oJA==", - "dependencies": { - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.1", - "base64-arraybuffer": "^0.2.0", - "borc": "^2.1.1", - "buffer": "^6.0.3", - "simple-cbor": "^0.4.1" - }, - "peerDependencies": { - "@dfinity/candid": "^2.0.0", - "@dfinity/principal": "^2.0.0" - } - }, - "node_modules/@dfinity/candid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-2.0.0.tgz", - "integrity": "sha512-poxIEnzErcKBM5yroabQ3VqQpiYZnqYZdLJWFuIQZzioGdP1mlnVLHx7IbgHN4HBlqVXYPFmEzMU02FnyYUA1Q==", - "peerDependencies": { - "@dfinity/principal": "^2.0.0" - } - }, - "node_modules/@dfinity/principal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-2.0.0.tgz", - "integrity": "sha512-cqJ5kOrPpxco+wvJC4TFBhdr4lkw9mnwKGAYunesyqdzSYi8lnFB4dShNqlHFWdwoxNAw6OZkt/B+0nLa+7Yqw==", - "dependencies": { - "@noble/hashes": "^1.3.1" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -469,26 +433,6 @@ "version": "1.5.0", "license": "MIT" }, - "node_modules/@noble/curves": { - "version": "1.5.0", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.4.0", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.20.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", @@ -760,7 +704,8 @@ }, "node_modules/@vue/devtools-api": { "version": "6.6.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz", + "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==" }, "node_modules/@vue/reactivity": { "version": "3.4.37", @@ -820,37 +765,6 @@ "node": ">= 8" } }, - "node_modules/base64-arraybuffer": { - "version": "0.2.0", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "dev": true, @@ -862,44 +776,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/borc": { - "version": "2.1.2", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.0", - "buffer": "^5.5.0", - "commander": "^2.15.0", - "ieee754": "^1.1.13", - "iso-url": "~0.4.7", - "json-text-sequence": "~0.1.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/borc/node_modules/buffer": { - "version": "5.7.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/braces": { "version": "3.0.3", "dev": true, @@ -911,28 +787,6 @@ "node": ">=8" } }, - "node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/chokidar": { "version": "3.6.0", "dev": true, @@ -956,18 +810,10 @@ "fsevents": "~2.3.2" } }, - "node_modules/commander": { - "version": "2.20.3", - "license": "MIT" - }, "node_modules/csstype": { "version": "3.1.3", "license": "MIT" }, - "node_modules/delimit-stream": { - "version": "0.1.0", - "license": "BSD-2-Clause" - }, "node_modules/dotenv": { "version": "16.4.5", "dev": true, @@ -1065,33 +911,11 @@ "node": ">= 6" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/immutable": { "version": "4.3.7", "dev": true, "license": "MIT" }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, "node_modules/is-binary-path": { "version": "2.1.0", "dev": true, @@ -1130,20 +954,6 @@ "node": ">=0.12.0" } }, - "node_modules/iso-url": { - "version": "0.4.7", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/json-text-sequence": { - "version": "0.1.1", - "license": "MIT", - "dependencies": { - "delimit-stream": "0.1.0" - } - }, "node_modules/magic-string": { "version": "0.30.11", "license": "MIT", @@ -1191,8 +1001,9 @@ } }, "node_modules/pinia": { - "version": "2.2.1", - "license": "MIT", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.2.2.tgz", + "integrity": "sha512-ja2XqFWZC36mupU4z1ZzxeTApV7DOw44cV4dhQ9sGwun+N89v/XP7+j7q6TanS1u1tdbK4r+1BUx7heMaIdagA==", "dependencies": { "@vue/devtools-api": "^6.6.3", "vue-demi": "^0.14.10" @@ -1216,8 +1027,9 @@ }, "node_modules/pinia/node_modules/vue-demi": { "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", "hasInstallScript": true, - "license": "MIT", "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" @@ -1279,18 +1091,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "3.6.0", "dev": true, @@ -1337,24 +1137,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/sass": { "version": "1.77.8", "dev": true, @@ -1371,10 +1153,6 @@ "node": ">=14.0.0" } }, - "node_modules/simple-cbor": { - "version": "0.4.1", - "license": "ISC" - }, "node_modules/source-map-js": { "version": "1.2.0", "license": "BSD-3-Clause", @@ -1382,13 +1160,6 @@ "node": ">=0.10.0" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/to-fast-properties": { "version": "2.0.0", "license": "MIT", @@ -1419,10 +1190,6 @@ "node": ">=14.17" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, "node_modules/vite": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index c251e6a..265c89a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,19 +5,14 @@ "type": "module", "scripts": { - "setup": "npm i && dfx canister create mailpass && dfx generate mailpass && dfx deploy", "start": "vite --port 8080", - "prebuild": "dfx generate", "build": "tsc && vite build", "format": "prettier --write \"src/**/*.{json,js,jsx,ts,tsx,css,scss}\"" }, "dependencies": { "pinia": "^2.1.6", - "vue": "^3.3.4", - "@dfinity/agent": "2.0.0", - "@dfinity/candid": "2.0.0", - "@dfinity/principal": "2.0.0" + "vue": "^3.3.4" }, "devDependencies": { diff --git a/frontend/src/.editorconfig b/frontend/src/.editorconfig new file mode 100644 index 0000000..5427234 --- /dev/null +++ b/frontend/src/.editorconfig @@ -0,0 +1,7 @@ +[*.{js,jsx,ts,tsx,vue}] +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 100 \ No newline at end of file diff --git a/frontend/src/assets/base.css b/frontend/src/assets/base.css new file mode 100644 index 0000000..8816868 --- /dev/null +++ b/frontend/src/assets/base.css @@ -0,0 +1,86 @@ +/* color palette from */ +:root { + --vt-c-white: #ffffff; + --vt-c-white-soft: #f8f8f8; + --vt-c-white-mute: #f2f2f2; + + --vt-c-black: #181818; + --vt-c-black-soft: #222222; + --vt-c-black-mute: #282828; + + --vt-c-indigo: #2c3e50; + + --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); + --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); + --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); + --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); + + --vt-c-text-light-1: var(--vt-c-indigo); + --vt-c-text-light-2: rgba(60, 60, 60, 0.66); + --vt-c-text-dark-1: var(--vt-c-white); + --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); +} + +/* semantic color variables for this project */ +:root { + --color-background: var(--vt-c-white); + --color-background-soft: var(--vt-c-white-soft); + --color-background-mute: var(--vt-c-white-mute); + + --color-border: var(--vt-c-divider-light-2); + --color-border-hover: var(--vt-c-divider-light-1); + + --color-heading: var(--vt-c-text-light-1); + --color-text: var(--vt-c-text-light-1); + + --section-gap: 160px; +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--vt-c-black); + --color-background-soft: var(--vt-c-black-soft); + --color-background-mute: var(--vt-c-black-mute); + + --color-border: var(--vt-c-divider-dark-2); + --color-border-hover: var(--vt-c-divider-dark-1); + + --color-heading: var(--vt-c-text-dark-1); + --color-text: var(--vt-c-text-dark-2); + } +} + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + font-weight: normal; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/frontend/src/assets/logo.png b/frontend/src/assets/logo.png new file mode 100644 index 0000000..6fc6cd9 Binary files /dev/null and b/frontend/src/assets/logo.png differ diff --git a/frontend/src/assets/main.css b/frontend/src/assets/main.css new file mode 100644 index 0000000..3054e55 --- /dev/null +++ b/frontend/src/assets/main.css @@ -0,0 +1,14 @@ +@import './base.css'; + +a, +.green { + text-decoration: none; + color: hsla(160, 100%, 37%, 1); + transition: 0.4s; +} + +@media (hover: hover) { + a:hover { + background-color: hsla(160, 100%, 37%, 0.2); + } +} diff --git a/frontend/src/components/Alert.vue b/frontend/src/components/Alert.vue new file mode 100644 index 0000000..f12315a --- /dev/null +++ b/frontend/src/components/Alert.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/frontend/src/components/Footer.vue b/frontend/src/components/Footer.vue new file mode 100644 index 0000000..555f752 --- /dev/null +++ b/frontend/src/components/Footer.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/frontend/src/components/Header.vue b/frontend/src/components/Header.vue new file mode 100644 index 0000000..5316c7b --- /dev/null +++ b/frontend/src/components/Header.vue @@ -0,0 +1,80 @@ + + + diff --git a/frontend/src/http/index.js b/frontend/src/http/index.js new file mode 100644 index 0000000..f348f9e --- /dev/null +++ b/frontend/src/http/index.js @@ -0,0 +1,35 @@ +import axios from 'axios'; +import { useAuthStore } from '@/stores'; + +const api = axios.create({ + baseURL: import.meta.env.VITE_API_URL +}); + +api.interceptors.request.use((config) => { + const { user } = useAuthStore(); + const token = user?.data.accessToken; + + if (token) { + config.headers['Authorization'] = `Bearer ${token}`; + } + return config; +}); + +function request(method) { + return (url, body) => { + const requestOptions = { method } + + if (body) { + requestOptions.headers = { 'Content-Type': 'application/json' }; + requestOptions.data = body; + } + return api(url, requestOptions).then(response => response.data); + } +} + +export const http = { + get: request('GET'), + post: request('POST'), + put: request('PUT'), + delete: request('DELETE') +}; diff --git a/frontend/src/plugins/icon.js b/frontend/src/plugins/icon.js new file mode 100644 index 0000000..bd888cb --- /dev/null +++ b/frontend/src/plugins/icon.js @@ -0,0 +1,29 @@ +import { library } from "@fortawesome/fontawesome-svg-core"; +import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"; +import { + faHome, + faUser, + faEdit, + faUserPlus, + faTrashAlt, + faSignInAlt, + faSignOutAlt, + faMagnifyingGlass +} from "@fortawesome/free-solid-svg-icons"; + +library.add( + faHome, + faUser, + faEdit, + faUserPlus, + faTrashAlt, + faSignInAlt, + faSignOutAlt, + faMagnifyingGlass +); + +export default { + install(app) { + app.component("Icon", FontAwesomeIcon); + } +}; diff --git a/frontend/src/plugins/index.js b/frontend/src/plugins/index.js new file mode 100644 index 0000000..bc27515 --- /dev/null +++ b/frontend/src/plugins/index.js @@ -0,0 +1,2 @@ +export { default as icon } from './icon'; +export { default as validation } from './validation' diff --git a/frontend/src/plugins/validation.js b/frontend/src/plugins/validation.js new file mode 100644 index 0000000..46c305a --- /dev/null +++ b/frontend/src/plugins/validation.js @@ -0,0 +1,9 @@ +import { Form, Field, ErrorMessage } from "vee-validate"; + +export default { + install(app) { + app.component("Form", Form); + app.component("Field", Field); + app.component("ErrorMessage", ErrorMessage); + } +}; diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js new file mode 100644 index 0000000..64c2c91 --- /dev/null +++ b/frontend/src/router/index.js @@ -0,0 +1,81 @@ +import { createRouter, createWebHistory } from 'vue-router' + +const router = createRouter({ + history: createWebHistory(), + routes: [ + { + path: '/', + name: 'Login', + alias: "/login", + meta: { requiresAuth: false }, + component: () => import('@/views/auth/Login.vue') + }, + + { + path: '/dashboard/members/add', + name: 'AddMember', + meta: { requiresAuth: true }, + component: () => import('@/views/members/AddMember.vue') + }, + + { + path: '/dashboard/members', + name: 'GetMembers', + meta: { requiresAuth: true }, + component: () => import('@/views/members/GetMembers.vue') + }, + + { + path: '/dashboard/users/add', + name: 'AddUser', + meta: { requiresAuth: true }, + component: () => import('@/views/users/AddUser.vue') + }, + + { + path: '/dashboard/users', + name: 'GetUsers', + meta: { requiresAuth: true }, + component: () => import('@/views/users/GetUsers.vue') + }, + + { + path: '/dashboard/units', + name: 'GetUnits', + meta: { requiresAuth: true }, + component: () => import('@/views/Units/GetUnits.vue') + }, + + { + path: '/dashboard/units/add', + name: 'AddUnit', + meta: { requiresAuth: true }, + component: () => import('@/views/Units/AddUnit.vue') + }, + + { + path: '/:pathMatch(.*)*', + name: 'NotFound', + meta: { requiresAuth: false }, + component: () => import('@/views/NotFound.vue') + } + ] +}) + +router.beforeEach((to, from, next) => { + if (to.meta.requiresAuth) { + const token = localStorage.getItem('token'); + if (token) { + // User is authenticated, proceed to the route + next(); + } else { + // User is not authenticated, redirect to login + next('/login'); + } + } else { + // Non-protected route, allow access + next(); + } +}); + +export default router diff --git a/frontend/src/services/index.js b/frontend/src/services/index.js new file mode 100644 index 0000000..f73aa9a --- /dev/null +++ b/frontend/src/services/index.js @@ -0,0 +1,3 @@ +export * from './user.service' +export * from './unit.service' +export * from './member.service' diff --git a/frontend/src/services/member.service.js b/frontend/src/services/member.service.js new file mode 100644 index 0000000..d176ff1 --- /dev/null +++ b/frontend/src/services/member.service.js @@ -0,0 +1,30 @@ +import { http } from "@/http"; + +const create = async (data) => { + return await http.post("member", data).then(response => { + return response.data; + }); +} + +const getAll = async () => { + return await http.get("member").then(response => { + return response.data; + }); +} + +const search = async (data) => { + try { + return await http.get(`member/search?email=${data}`).then(response => { + return response.data; + }) + } catch (error) { + console.error(error); + throw error; + } +} + +export const memberService = { + create, + getAll, + search +} diff --git a/frontend/src/services/unit.service.js b/frontend/src/services/unit.service.js new file mode 100644 index 0000000..3152735 --- /dev/null +++ b/frontend/src/services/unit.service.js @@ -0,0 +1,18 @@ +import { http } from "@/http"; + +const create = async (data) => { + return await http.post("unit", data).then(response => { + return response.data; + }); +} + +const getAll = async () => { + return await http.get("unit").then(response => { + return response.data; + }); +} + +export const unitService = { + create, + getAll +} diff --git a/frontend/src/services/user.service.js b/frontend/src/services/user.service.js new file mode 100644 index 0000000..d14fca9 --- /dev/null +++ b/frontend/src/services/user.service.js @@ -0,0 +1,23 @@ +import { http } from '@/http'; + +const create = async (data) => { + return await http.post("user", data).then(response => { + return response.data; + }); +} + +const getAll = async () => { + return await http.get("user").then(response => { + return response.data; + }); +} + +const remove = async (id) => { + return await http.delete(`user/${id}`); +} + +export const userService = { + create, + getAll, + remove +} diff --git a/frontend/src/stores/alert.store.js b/frontend/src/stores/alert.store.js new file mode 100644 index 0000000..4c7fdac --- /dev/null +++ b/frontend/src/stores/alert.store.js @@ -0,0 +1,23 @@ +import { defineStore } from 'pinia'; + +export const useAlertStore = defineStore({ + id: 'alert', + + state: () => ({ + alert: null + }), + + actions: { + success(message) { + this.alert = { message, type: 'alert-success' }; + }, + + error(message) { + this.alert = { message, type: 'alert-danger' }; + }, + + clear() { + this.alert = null; + } + } +}); diff --git a/frontend/src/stores/auth.store.js b/frontend/src/stores/auth.store.js new file mode 100644 index 0000000..177ecbb --- /dev/null +++ b/frontend/src/stores/auth.store.js @@ -0,0 +1,55 @@ +import { defineStore } from 'pinia'; +import jwt_decode from 'jwt-decode'; +import { http } from '@/http'; +import router from '@/router' + +export const useAuthStore = defineStore({ + id: 'auth', + + state: () => ({ + user: JSON.parse(localStorage.getItem('token')), + returnUrl: null + }), + + getters: { + isLoggedIn() { + const user = this.user; + if (user !== null) { + const decoded = jwt_decode(user.data.accessToken); + const currentTime = Math.floor(Date.now() / 1000); + + if (decoded.exp && decoded.exp > currentTime) return true; + } + this.user = null; + localStorage.removeItem('token'); + return false; + }, + + isAdmin() { + const user = this.user; + return user !== null ? user.data.roles.includes("ADMIN") : false; + }, + + username() { + const user = this.user; + return user !== null ? user.data.username : null; + } + }, + + actions: { + async login(data) { + const user = await http.post("auth", data); + + this.user = user; + localStorage.setItem('token', JSON.stringify(user)); + + router.push(this.returnUrl || '/'); + }, + + async logout() { + this.user = null; + localStorage.removeItem('token'); + router.push('/login'); + } + } +}); diff --git a/frontend/src/stores/index.js b/frontend/src/stores/index.js new file mode 100644 index 0000000..d885a1d --- /dev/null +++ b/frontend/src/stores/index.js @@ -0,0 +1,5 @@ +export * from './user.store' +export * from './unit.store' +export * from './auth.store'; +export * from './alert.store' +export * from './member.store'; diff --git a/frontend/src/stores/member.store.js b/frontend/src/stores/member.store.js new file mode 100644 index 0000000..6cebdd3 --- /dev/null +++ b/frontend/src/stores/member.store.js @@ -0,0 +1,43 @@ +import { defineStore } from 'pinia'; +import { http } from '@/http'; + +export const useMemberStore = defineStore({ + id: 'member', + + state: () => ({ + members: [], + member: {} + }), + + getters: { + listAll() { + return this.members; + } + }, + + actions: { + async add(data) { + const member = await http.post("member", data); + this.members.push(member); + return this.members; + }, + + async fetchAll() { + const members = await http.get("member"); + this.members = members.data; + console.log(members.data) + }, + + async search(data) { + try { + const response = await http.get(`member/search?email=${data}`); + this.member = response.data + return response.data; + } catch (error) { + console.error(error); + throw error; + } + } + } + +}) diff --git a/frontend/src/stores/unit.store.js b/frontend/src/stores/unit.store.js new file mode 100644 index 0000000..184092a --- /dev/null +++ b/frontend/src/stores/unit.store.js @@ -0,0 +1,30 @@ +import {defineStore} from 'pinia'; +import { http } from '@/http'; + +export const useUnitStore = defineStore({ + id: 'unit', + + state: () => ({ + units: [] + }), + + getters: { + listAll() { + return this.units; + } + }, + + actions: { + async fetchAll() { + const units = await http.get("unit"); + this.units = units.data; + }, + + async add(data) { + const units = await http.post("unit", data); + this.units.push(units); + return units; + } + } + +}) diff --git a/frontend/src/stores/user.store.js b/frontend/src/stores/user.store.js new file mode 100644 index 0000000..39eab14 --- /dev/null +++ b/frontend/src/stores/user.store.js @@ -0,0 +1,41 @@ +import { defineStore } from 'pinia'; +import { http } from '@/http'; + +export const useUserStore = defineStore({ + id: 'user', + + state: () => ({ + users: [] + }), + + getters: { + listAll() { + return this.users; + }, + + getById(id) { + const user = http.get("user", id) + this.users.push(user) + return user.data.id; + } + }, + + actions: { + async add(data) { + const user = await http.post("user", data); + this.users.push(user); + return this.user; + }, + + async delete(id) { + const user = await http.delete(`user/${id}`); + this.users.remove(user); + }, + + async fetchAll() { + const users = await http.get("user"); + this.users = users.data; + }, + } + +}) diff --git a/frontend/src/views/NotFound.vue b/frontend/src/views/NotFound.vue new file mode 100644 index 0000000..78c6021 --- /dev/null +++ b/frontend/src/views/NotFound.vue @@ -0,0 +1,9 @@ + + + + + diff --git a/frontend/src/views/Units/AddUnit.vue b/frontend/src/views/Units/AddUnit.vue new file mode 100644 index 0000000..7df38ec --- /dev/null +++ b/frontend/src/views/Units/AddUnit.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/frontend/src/views/Units/GetUnits.vue b/frontend/src/views/Units/GetUnits.vue new file mode 100644 index 0000000..cfe3e94 --- /dev/null +++ b/frontend/src/views/Units/GetUnits.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/frontend/src/views/auth/ForgotPass.vue b/frontend/src/views/auth/ForgotPass.vue new file mode 100644 index 0000000..5176044 --- /dev/null +++ b/frontend/src/views/auth/ForgotPass.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/auth/Login.vue b/frontend/src/views/auth/Login.vue new file mode 100644 index 0000000..52de96c --- /dev/null +++ b/frontend/src/views/auth/Login.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/frontend/src/views/auth/ResetPass.vue b/frontend/src/views/auth/ResetPass.vue new file mode 100644 index 0000000..5176044 --- /dev/null +++ b/frontend/src/views/auth/ResetPass.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/members/AddMember.vue b/frontend/src/views/members/AddMember.vue new file mode 100644 index 0000000..b0a3232 --- /dev/null +++ b/frontend/src/views/members/AddMember.vue @@ -0,0 +1,209 @@ + + + diff --git a/frontend/src/views/members/GetMembers.vue b/frontend/src/views/members/GetMembers.vue new file mode 100644 index 0000000..043d53b --- /dev/null +++ b/frontend/src/views/members/GetMembers.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/frontend/src/views/users/AddUser.vue b/frontend/src/views/users/AddUser.vue new file mode 100644 index 0000000..7c5cf84 --- /dev/null +++ b/frontend/src/views/users/AddUser.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/frontend/src/views/users/GetUsers.vue b/frontend/src/views/users/GetUsers.vue new file mode 100644 index 0000000..d831ed9 --- /dev/null +++ b/frontend/src/views/users/GetUsers.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 014c379..154977d 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -20,7 +20,7 @@ export default defineConfig({ server: { proxy: { '/api': { - target: 'http://127.0.0.1:4943', + target: 'http://127.0.0.1:3000', changeOrigin: true, }, }, diff --git a/package-lock.json b/package-lock.json index 3e7bacd..e8f1a2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,9 +16,6 @@ "frontend": { "version": "0.0.0", "dependencies": { - "@dfinity/agent": "2.0.0", - "@dfinity/candid": "2.0.0", - "@dfinity/principal": "2.0.0", "pinia": "^2.1.6", "vue": "^3.3.4" }, @@ -33,39 +30,6 @@ "vite-plugin-environment": "^1.1.3" } }, - "frontend/node_modules/@dfinity/agent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-2.0.0.tgz", - "integrity": "sha512-Cc2VDAMfxCNIQoaEeKPf0rbS/Y21HAF+eEFj6GfijNnUxS42i4zwUF2PUvEJZqaB2FQwA9SC7MDyuwL8BR2oJA==", - "dependencies": { - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.1", - "base64-arraybuffer": "^0.2.0", - "borc": "^2.1.1", - "buffer": "^6.0.3", - "simple-cbor": "^0.4.1" - }, - "peerDependencies": { - "@dfinity/candid": "^2.0.0", - "@dfinity/principal": "^2.0.0" - } - }, - "frontend/node_modules/@dfinity/candid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-2.0.0.tgz", - "integrity": "sha512-poxIEnzErcKBM5yroabQ3VqQpiYZnqYZdLJWFuIQZzioGdP1mlnVLHx7IbgHN4HBlqVXYPFmEzMU02FnyYUA1Q==", - "peerDependencies": { - "@dfinity/principal": "^2.0.0" - } - }, - "frontend/node_modules/@dfinity/principal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-2.0.0.tgz", - "integrity": "sha512-cqJ5kOrPpxco+wvJC4TFBhdr4lkw9mnwKGAYunesyqdzSYi8lnFB4dShNqlHFWdwoxNAw6OZkt/B+0nLa+7Yqw==", - "dependencies": { - "@noble/hashes": "^1.3.1" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", @@ -482,28 +446,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, - "node_modules/@noble/curves": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.5.0.tgz", - "integrity": "sha512-J5EKamIHnKPyClwVrzmaf5wSdQXgdHcPZIZLu3bwnbeCx8/7NPK5q2ZBWF+5FvYGByjiQQsJYX6jfgB2wDPn3A==", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.20.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", @@ -846,41 +788,6 @@ "node": ">= 8" } }, - "node_modules/base64-arraybuffer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", - "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -893,46 +800,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/borc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", - "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", - "dependencies": { - "bignumber.js": "^9.0.0", - "buffer": "^5.5.0", - "commander": "^2.15.0", - "ieee754": "^1.1.13", - "iso-url": "~0.4.7", - "json-text-sequence": "~0.1.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/borc/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -945,29 +812,6 @@ "node": ">=8" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -992,21 +836,11 @@ "fsevents": "~2.3.2" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, - "node_modules/delimit-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", - "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==" - }, "node_modules/dotenv": { "version": "16.4.5", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", @@ -1115,36 +949,12 @@ "node": ">= 6" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/immutable": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", "dev": true }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1187,22 +997,6 @@ "node": ">=0.12.0" } }, - "node_modules/iso-url": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", - "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", - "engines": { - "node": ">=10" - } - }, - "node_modules/json-text-sequence": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", - "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==", - "dependencies": { - "delimit-stream": "0.1.0" - } - }, "node_modules/magic-string": { "version": "0.30.11", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", @@ -1321,19 +1115,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1381,25 +1162,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/sass": { "version": "1.77.8", "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz", @@ -1417,11 +1179,6 @@ "node": ">=14.0.0" } }, - "node_modules/simple-cbor": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/simple-cbor/-/simple-cbor-0.4.1.tgz", - "integrity": "sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w==" - }, "node_modules/source-map-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", @@ -1430,14 +1187,6 @@ "node": ">=0.10.0" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -1471,11 +1220,6 @@ "node": ">=14.17" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, "node_modules/vite": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz",