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)
-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 @@
+
+
+
+
+
+
+
+ {{alert.message}}
+
+
+
+
+
+
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 @@
+
+
+
+ Oops, it looks like the page you're looking for doesn't exist.
+
+
+
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 @@
+
+
+
+
+ Name |
+ Address |
+
+
+
+
+ {{ unit.name }} |
+ |
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+ Name |
+ Gender |
+ Phone Number |
+ Marital Status |
+ Unit |
+
+
+
+
+ {{ member.name }} |
+ {{ convertToSentenceCase(member.gender) }} |
+ {{ member.phoneNumber }} |
+ {{ convertToSentenceCase(member.maritalStatus) }} |
+ {{ member.unit }} |
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+ Username |
+ Roles |
+ Email |
+ Action |
+
+
+
+
+ {{ user.username }} |
+ {{ rolesToString(user.roles) }} |
+ {{ user.email }} |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
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",