From 49330792763f5b77810d46ef49997573f3539568 Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Mon, 25 Nov 2024 23:21:32 -0600 Subject: [PATCH] wip --- .gitignore | 2 +- Cargo.lock | 500 +----------------- Cargo.toml | 2 +- bun.lockb | Bin 91932 -> 92764 bytes core/Cargo.toml | 11 +- core/entity/Cargo.toml | 11 - core/entity/src/generated/mod.rs | 5 - core/entity/src/generated/node.rs | 19 - core/entity/src/generated/prelude.rs | 3 - core/entity/src/lib.rs | 1 - core/migration/Cargo.toml | 16 - core/migration/src/lib.rs | 10 - core/migration/src/main.rs | 6 - .../20241125030145_initial.down.sql | 4 + core/migrations/20241125030145_initial.up.sql | 41 ++ core/src/dal.rs | 14 +- package.json | 1 + .../composite/sidebar/Sidebar.svelte | 3 - src/components/pages/MailAccounts.svelte | 1 + src/routes/+page.svelte | 6 +- svelte.config.js | 9 +- 21 files changed, 82 insertions(+), 583 deletions(-) delete mode 100644 core/entity/Cargo.toml delete mode 100644 core/entity/src/generated/mod.rs delete mode 100644 core/entity/src/generated/node.rs delete mode 100644 core/entity/src/generated/prelude.rs delete mode 100644 core/entity/src/lib.rs delete mode 100644 core/migration/Cargo.toml delete mode 100644 core/migration/src/lib.rs delete mode 100644 core/migration/src/main.rs create mode 100644 core/migrations/20241125030145_initial.down.sql create mode 100644 core/migrations/20241125030145_initial.up.sql create mode 100644 src/components/pages/MailAccounts.svelte diff --git a/.gitignore b/.gitignore index 5d87a51..eb20bb0 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,4 @@ vite.config.js.timestamp-* vite.config.ts.timestamp-* /target -test.db \ No newline at end of file +test.db* \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 8d9f6f5..f6fded3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -91,60 +91,11 @@ dependencies = [ "libc", ] -[[package]] -name = "anstream" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" - -[[package]] -name = "anstyle-parse" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" -dependencies = [ - "anstyle", - "windows-sys 0.59.0", -] - [[package]] name = "anyhow" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "arrayvec" @@ -152,125 +103,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "async-attributes" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "slab", -] - -[[package]] -name = "async-global-executor" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" -dependencies = [ - "async-channel 2.3.1", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite", - "once_cell", - "tokio", -] - -[[package]] -name = "async-io" -version = "2.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" -dependencies = [ - "async-lock", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix", - "slab", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "async-lock" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" -dependencies = [ - "event-listener 5.3.1", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-std" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" -dependencies = [ - "async-attributes", - "async-channel 1.9.0", - "async-global-executor", - "async-io", - "async-lock", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - [[package]] name = "async-stream" version = "0.3.6" @@ -293,12 +125,6 @@ dependencies = [ "syn 2.0.87", ] -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - [[package]] name = "async-trait" version = "0.1.83" @@ -499,19 +325,6 @@ dependencies = [ "objc2", ] -[[package]] -name = "blocking" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" -dependencies = [ - "async-channel 2.3.1", - "async-task", - "futures-io", - "futures-lite", - "piper", -] - [[package]] name = "borsh" version = "1.3.0" @@ -740,46 +553,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "clap" -version = "4.5.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "clap_lex" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" - [[package]] name = "cocoa" version = "0.26.0" @@ -810,12 +583,6 @@ dependencies = [ "objc", ] -[[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - [[package]] name = "combine" version = "4.6.7" @@ -1213,13 +980,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "entity" -version = "0.1.0" -dependencies = [ - "sea-orm", -] - [[package]] name = "equivalent" version = "1.0.1" @@ -1257,12 +1017,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - [[package]] name = "event-listener" version = "5.3.1" @@ -1274,16 +1028,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "event-listener-strategy" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" -dependencies = [ - "event-listener 5.3.1", - "pin-project-lite", -] - [[package]] name = "fastrand" version = "2.1.1" @@ -1461,19 +1205,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" -[[package]] -name = "futures-lite" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f1fa2f9765705486b33fd2acf1577f8ec449c2ba1f318ae5447697b7c08d210" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - [[package]] name = "futures-macro" version = "0.3.31" @@ -1746,18 +1477,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - [[package]] name = "gobject-sys" version = "0.18.0" @@ -1892,12 +1611,6 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - [[package]] name = "hex" version = "0.4.3" @@ -2298,12 +2011,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - [[package]] name = "itertools" version = "0.12.1" @@ -2448,15 +2155,6 @@ dependencies = [ "selectors", ] -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - [[package]] name = "lazy_static" version = "1.5.0" @@ -2560,9 +2258,6 @@ name = "log" version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" -dependencies = [ - "value-bag", -] [[package]] name = "mac" @@ -2593,15 +2288,6 @@ dependencies = [ "tendril", ] -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - [[package]] name = "matches" version = "0.1.10" @@ -2639,14 +2325,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "migration" -version = "0.1.0" -dependencies = [ - "async-std", - "sea-orm-migration", -] - [[package]] name = "mime" version = "0.3.17" @@ -2675,7 +2353,7 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", @@ -3187,10 +2865,9 @@ dependencies = [ name = "panorama-core" version = "0.1.0" dependencies = [ - "entity", - "migration", + "anyhow", "prost", - "sea-orm", + "sqlx", "tonic", "tonic-build", ] @@ -3427,17 +3104,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "piper" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - [[package]] name = "pkcs1" version = "0.7.5" @@ -3491,21 +3157,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "polling" -version = "3.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi 0.4.0", - "pin-project-lite", - "rustix", - "tracing", - "windows-sys 0.59.0", -] - [[package]] name = "powerfmt" version = "0.2.0" @@ -3843,17 +3494,8 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -3864,15 +3506,9 @@ checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.5" @@ -4168,23 +3804,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "sea-orm-cli" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a157f42d291ccbd6e913b9d9b12dbe2ccbcf0472efc60c8715dd1254083aec" -dependencies = [ - "chrono", - "clap", - "dotenvy", - "glob", - "regex", - "sea-schema", - "tracing", - "tracing-subscriber", - "url", -] - [[package]] name = "sea-orm-macros" version = "1.1.1" @@ -4199,23 +3818,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sea-orm-migration" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63ba07e9f2479cc671758fcb1edee42ff2e32c34b3e67ab41d0af1e41f73c74e" -dependencies = [ - "async-trait", - "clap", - "dotenvy", - "futures", - "sea-orm", - "sea-orm-cli", - "sea-schema", - "tracing", - "tracing-subscriber", -] - [[package]] name = "sea-query" version = "0.32.0" @@ -4227,7 +3829,6 @@ dependencies = [ "inherent", "ordered-float", "rust_decimal", - "sea-query-derive", "serde_json", "time", "uuid", @@ -4249,43 +3850,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "sea-query-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9834af2c4bd8c5162f00c89f1701fb6886119a88062cf76fe842ea9e232b9839" -dependencies = [ - "darling", - "heck 0.4.1", - "proc-macro2", - "quote", - "syn 2.0.87", - "thiserror", -] - -[[package]] -name = "sea-schema" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aab1592d17860a9a8584d9b549aebcd06f7bdc3ff615f71752486ba0b05b1e6e" -dependencies = [ - "futures", - "sea-query", - "sea-schema-derive", -] - -[[package]] -name = "sea-schema-derive" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "debdc8729c37fdbf88472f97fd470393089f997a909e535ff67c544d18cfccf0" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "syn 2.0.87", -] - [[package]] name = "seahash" version = "4.1.0" @@ -4491,15 +4055,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - [[package]] name = "shared_child" version = "1.0.1" @@ -4676,7 +4231,7 @@ dependencies = [ "crc", "crossbeam-queue", "either", - "event-listener 5.3.1", + "event-listener", "futures-channel", "futures-core", "futures-intrusive", @@ -5370,16 +4925,6 @@ dependencies = [ "syn 2.0.87", ] -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - [[package]] name = "time" version = "0.3.36" @@ -5668,21 +5213,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "tracing-subscriber" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "matchers", - "once_cell", - "regex", - "sharded-slab", - "thread_local", - "tracing", - "tracing-core", -] - [[package]] name = "tray-icon" version = "0.19.1" @@ -5850,12 +5380,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - [[package]] name = "uuid" version = "1.11.0" @@ -5866,12 +5390,6 @@ dependencies = [ "serde", ] -[[package]] -name = "value-bag" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" - [[package]] name = "vcpkg" version = "0.2.15" diff --git a/Cargo.toml b/Cargo.toml index 177d9a7..47049e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,2 +1,2 @@ workspace.resolver = "2" -workspace.members = ["src-tauri", "core", "core/migration", "core/entity"] +workspace.members = ["src-tauri", "core"] diff --git a/bun.lockb b/bun.lockb index 1fa71e7ec10fa48a22fe9ab3235e4964cad56bfa..5251820cd2a65d774541f7c0b7934aa3eb2e2af4 100755 GIT binary patch delta 14397 zcmeHud3;S*8}43P4mlw*4<`dbW30$LNSu?@?3iLYm70zSLL?%hv?`(XQFFZ55)ERg zDq5;Ot>IIpMO$N48%nGFjBOQd)l}~D?!nRT_Pe*g-|fA>`$sp=dfs=fcg<_Bwf8=6 zUO8g=@}y}&RI@%m4)sVYUf62-6Px1Jb%>fZalnVsF?W5_H@!Oj=FZfrW1r*-iLdX< z9Q9N8TvlZSW1aa0}%=xB) zL&4|3-ry5@d?nZudQQz^{Wj;}~!NxG74vfER$d z7d|?tqBc$+ga&cGE?|Ff0czof=72fAH<&w;q4O$K#`Rr8;D>*u$w=VgXr*&~5^|GB zUugJW8jE7NxJF-;MUW4muPE-5{#N9+RoAz{7FOLTrw z=Rz71%_Go8m3CkoNW-Mk2nh9%aKFAJ zJpuj_jHuFofjNE|xDj{~xFI+TjQ^#nI){VVPJp?hZ=i7chhWw>)T664x|i&2p$+JI zFwe{aFfWktU^eRm=4z9`+-?h)i~X&+mVOb8F)aNU%qw*(n9HdEb2%^S>7(`dOfdI1 zSxYY|4TZo33q9dtGp(S*U@l;Sb6jrzcuCp=ombjOXHm=HdCn2zCXOnSaQzeUX2fp< zdw`egc5}cyF@s>k9qFE+amz$WY6ATu=(Q!gRJu4xk{Tc)Ia%vjV=!k70rNdroT4qY zoT6-Jo^x2vNa(yY`+#}LbON(oGEFrFl}tcsJj_kgv}vgW=IY}S&nvz+*atkXjn?e8 z(D?=(RfO`<)CXuDmp0R?4TA^Lxwc3>|A@STq0YP_X&7{FWe}K$WkgPX(WLzB5@}RX zK|Z=BJ%NIFT(X^9EGmJ{%^jYbKddEI;*kt(tJ$aX*p_((+0OAf;M_5}H+2jkpSkE64aiq)~wgCc^64)3>8oZM?<9-z9NZADiqjPg4=>Xz+Trqa)dIhQDn9x(JJp|0_S%59zE9e%l z>*G4_00%)|0}cew(|GHFT6=}}u1}-x`YjGv-F<2QA+KHxzPELz`It$RP=7C*m_+3W zzo2S_No4W1iBZ%a;U+3ac!{bJTFByK6P>9)!e^-*;U=m^c!4awHW5Vq5w@jrUz>TZ zNs>}gy-eprlf*%?_}OH+CT00q#b7G;vk8T&5&lRPf1605{{A+T$z77Hbk;i+MO6FS z%+sOwLJ@+T-btp

?9Op{b%il?T{RN_BwET!EDotJ<9ROA?<@|3FmZK^1{k(SfQ1 zZDJZ(f^6br>W?sk%7bj?b+si4Q&w7o&U+_`8)ON#nR;Sncc4mCy@bkxZQ=w~BX$Pn zp(C9QNHraSltyP0(nMXVuvpFgFgsn<-c7yM^-z2e!szYt&gNVc3U0Rc>0+VFPhqA(~ z<`gU!y)sLZc{(&MS*8a5NuGP4VZoGQw52xW3~E8gEap16|2pcCX>>lk1@-iDH_t#U z?rm;TK$5)Qm$JgGriX}3!+GBur|BW*@kIunt-TkRjO=Y z6G(twh-KVGm3BhH93!pF^`T4>xr?)z0xqTJ}i#>XFn4$BSk+0a5~;ZIb2|AxY2B*+`5QcIy7B^gN`# zs&ovJmf8XbVQ)2V3Z#LmbOur`g*Q%f!=~d@qt-&w5@npMBhyQSj8M?(7X0Jig>Z*->LQ5S9Nh|mOB(*qm!#Hgf*W~@m+z%R#jZ$}V zCMCN=(fZ6uC!q0I)#9--$yoWVDcmf+RV|XtyP)B?;$0Bi(*vrG zv&qjTP)Iy(f86^yND_Rjo8E<%OyMD^@;{U4biCEn4>b;=v+=3&+sTxbU=??%Ji%s~ zjWfLu4YZ`1FGJ#1)!>Tch}M*qXqB^DQw8Yl)^s}2YQEQ6+bT@t#MC9EKH6`fO@zjG zEp{5eB-2J{L%4cVmo!Nl&h?r$L&{Pmk2aE&u1Z}XwWEOvsb&QdipR3RpqP$BdkXPs zZg@I~rAlm>-63IQP~>VzPpjFzZM@qcyQwQAwMco6jZU|=n)f3@+vHH5?43>_Ay&D2 zI#r}v<;CfAI@M}EnXXldRT`co*Ug};G^@Eyh9vbwJ7gY4^IT}Wr<&ARtcHfVwKkfA zFcGY2Gu#&%51(c^7aHfoV4{>Gx+UfiQ&R`e6VX)ZlWOh+32ngK;^dHLwx!cntNck@ z3b9#Do|yC@YA0tv>c^6NwjG^DQpXOGG=R?9FcOe3q>z4tgfW5C7d!P(RoV_ov-87Y zq1lar)JIL-3kk&{M^I;US(QdWQcE%Kfz%I8Q>Vi`66YIFuHZ95KG20i+FH$b5IIWg zqa{h6Z>Ng3RynvUokrRK3_bT>?U{KYG)z9PVf6n9v}itf&4Jw>Ejg^9?$Edr^@NwF zb)&5IR(Vf1s%URDnY;7;Um2Kcc0kf*gxBC)Xq*T2geRHzLc_w-wfme08qQ^$PrZ9k zNJp!w7v{DILQ^wFs^N9apc% znG3+cOP(|^vwjIDW6mUw#Tl<&%$yrzuU>z|Y>$Cd?J#I6V<^;%nY-0jQ-8;G5a-n6 z!M>{aScD`fyq8UF)-c`dapr2Vp{W-$H*9zPn)_IWyw0rSPo@%aEZ=Q)5c zW^VQilBCwpf_gFISwmW+ss9gHtN$;p$RCY=P4B?}mi7Aoe1<<;@Sm{b1zqwc0-mGI zdIo0Jx9I$q9?u*K9M<)}h)e$J0)JN?cjSoPU}n~j>bk}l|KCSwI&N)vwb~1o|(n^%rv)OlM>dR;6P`# zZmjFf9?+w8{jX$ql$$K@p^D2+(JNr)@oWR;3G51%$+Krr36DmmZuNh{TtqJfTz!^a z-k)IY=KoJal%bw$|M$4vKhw>o8u#qr~9H}f+mcjrwGFDO{Y zN34(@cs&5~;bdHHZ_i(IY~!@mnWD+^R{J*%%g(QzW!-u1@~4N6l`o62G_AGy>(k|j z6Bk?3%c4e(8P&YaoKGkDhn;J^>7c#+SM)*Fp2Ku_bTB21wu@AnI@&=q^E~MSv^Erz z=b+>`a+s9ij`ZM`$Ne=)gDA{s_C#7KGi&JkB9{kP~4~dKY0P`4l-sFUm#O zoAx5?LzeLl(U%Gl_M<}x9n_%MA)cm52>a7wR=2?drL@y&8 zOy>~}p_GXZ;iNKzL+J{_Y|5DA5W}b(VGi9uIGj2^=MW>P3gJk)gD{sepLgJgg!KqV zlbGxfdDI`_7}|m`pUf{fL;*QpaL~vpp7g;Bc2P(^Qydgr;z`9*?4pSFLOTd8vcxWm zsj$RB6H7hmGic9JgHnf>NRtpwqT>jkqh?bb;(3~ia57aRe1T%7Im8rt8DR;XM_5WJ zFFM3jDnmGpt{{AoGG20sm#7@!bh?4?AJloeL(HHmgfr<5!j~!Y9}Y2#)+3xvVunM^ zq5cTx(v}$xdS|951Y)>|!w$&O%RS zqbJZ5YB1YDP3L&h^x1Y%PRF5r0WD#UT`Z%ibFjYVVtqlYq?ox_U-PiO=Gw&yIuGqK zwD$AtqKeAqVSUZV`hvEaGUhv|(*jRgJKrwW(hX?0q4iy07wf2MfrDNv^CVN5U96|f zG6y}q(37@7+dyKWgWSoJau(Y0^UfA%??4M6yLgkFg#Il;|DbIlpGD~3V)Sp3U2LVj z&<;Y2Tx=KHsBkg*w*>uzww)R*LH`u=Z;4&JOUI#o0WCqXi=8x8LI0Mbf6#VQ%u@8P z9Q|8r7klVDw9C-im)pf&Dl13-D$qY@`zWKrA@)-_!Vl;M!VjtQGKV-oRR|B#9fXG{ z^A(5qh}I+gm_((6e<4D6n6@B1LgwWTag?0P(We#Y({j5wPChHprpbC9jg+5i;MKv9V_64+rRd#WPrmjMtR-;eQ&Qi>3^l1(H zwAwDdqVv!$Lu(^~CMd4+{yftIX9+`%0`VznKxS6wyv|npyk=S^YBD|V%tjC00cHxkuss40s zWA}iy_`wF7Z7Dyg8}192wq|VlN|;8}!wV0J94%_Ck4dD!uXca@o&H-M7Vxdo*=hiDh=W_Uk8`89x9Y zK%6Hk3l&_$*5vI^3Xh5Sz=c=6(rNas`R@b@QLuhq5%!KG^7E4LgKTc zH_!*@3-kjVz|%l~x^St9r30jnKqr9TL1TbeAb}z;*Y|7*DGF!>9Hq?5**PDf)Q^Er z0Dkpp16TnYkPc)3PXXMHM;m(r{9@Y;z}Tr@FHV3z15N>-1785AfinO< znsx{Hlj0U&37`N=C5bj%i7~H*{3@`HE?nsySq5n#K)`drWWWjVDcl-p1~jIDR~waF zf^-?+dHD|D3F9vT4SWJR)A|er{NV5mg~V386!K}(4{b9VLYe>+18mQCC^v{3G9KW&;aTt^fG2_{gePVJ zFb|kZzx~j=WIiNrK2K;mfC-iM0Wko#ZV&J-@D9M=E7E~~0zCOm0Ji7PUfX~*z}vtk zfEU_UU^Bq4e7uy`18)HhfVDt5f6(PjtAJO4Wk3Z`1*`;C0F}UUfV;>xs{t->9l$G& z8^9HE95-Z(u5$ypa-(9l<$H?D;WWLd5lR04=%ReCz(}o5T}hP<&K$R4n#wp?Q}W4kfaz8RK@N=Wkj2x}2)X#`LT}!*Bn(2j2hx}J*z7TF(Y8cRk4lKbk~2IHXZ}Nx3%{$g9VuLA z9M&lPhLR1B#n(rU4zj#iD-!9^QSqGf6vg~x!C7kmshhY?GFbLH??CvQKt>p}%`$M6`%NjoUxR}1QV=GSfs zhR^1qtGB+oIj8C*tm3rUHM}|pj|h9=(zDCo)KgIVH6_DG1ck@M7!IL3=S`}4eM zJo2W}J%p;QR*qY=)iX%J`^QZbC9Wykki)TtUCh z_7JN+7yXeQtM$)t7EMmAx%&9_{DW%a)zQsSjtgN4HM~p54p{qHN?BfnZjgw5il*MR zh-b^PIsl$4x&NG zYB9nIjhZ(-O2XB?upS-3oxeN+|=xda1 zIPdnd9%~U6?z7HiV7T{s2DQ7g{EZ0*Tq&D_DC%Kwg5eLGH)PerQ)TaFxC{)B;p0`_ z;rp9j>ETMLq~{;T$?${S{4hAtaEsmc@cWw{As-VY7O+02S-*V0!Wf8a{N z4e|h44Nu#e<4+9BJMt4|%E)T?;%<#}8yJ0gx}Pg0tN!AyA~?)&-km-Fw^z0|^113V zSXO^=sR&LmynQcbM7sadw%vZ0f#DCF)MQg~?7d?hTq*Y#9~PFxhzQNyvd_6aRWp8` z8sbW~BE^FH#a1hG__&#ehPhH45lWaqv&O@MH{oga6{Ejf@6pv|F)u>t35(FzVS&T2 zbmq8aP0r5j?CG-Log_%95F$~icX@j`w5bv-i`MdcO_e^fh)py+b0fZP(%WZ6cr$&& zz>Z}2?%r&-$?w4{HNHd&ZYbWXHa1gs$s$<(XEWs#%8>UoQ#@*b4>wb+HAHaYMLZ+m z!L2m$@;l-83nOCOL`+mN_5eJyHrL%qdv<$z^RdcMS4wDeWe)O&>8{A7hZ;xTT{t)`xZl?rJ${pVMVvX`w7Y;faP<_S(YlYe!x# zKIO77{I)-RI5pm{#f~sn%J>$_InHZ%dVd=Be$5TTs#m!z3}5i;Q}-)*4a$>UDSKNe zPntwmxqE{0oJlnI7=^74yEB}rl{ZY7p3f4LgC@~V{H%D^6sfXzqSB?N=$c@>ioQSb z>zyBW{jFHt=hb;Nys>9lzj-Mx{g-}fin_O}4=}P`u=1d$7-GJG>GVWx50tXn7#_nl z+N*7cGhS_eNJieIsMtg-m!Kr&m0D;{WRkME4mdtZIR-t{2o+Z@xl$ljZcV5k&=^@Yh1nIS01-8 z`?!}I*RRHyS$YUiLO*SzJW(zox_JH4QE`8(d+T=ghdCnKOH zw_G1)Wt@kI7g~G-$N%v}af&`c|7Bv>LYtUi*=UI2H-GuHSzf13)f}si=;O~6e_R_H^oriP6NXcujEa$w2>wfPs{Y#5(E?DHUFr51jZ!}q+JX`x` zSIU9*%JHqY4G$z@^uEkNh8 zZD-CMfAI%d1a#3}7w~K!e>bXu z$B3Ay6m=quzcJW&Ixu1Ht?tKNDLZ;7_kD4D8h@2wYq{Qi)aiOZx-70Jt^BYN8GpvG zdt)bCm?L?G%fR?UhaD9;!5tTk+UH71=&4Nc6Tu$ofq09=RT`+Q^b_fLF;l+w6VV}= z_$q;y<ps}5+fB>e-rOI@zh8dQcxU$LR@!j3EG*6$H);F80P&7@_wmj@ zNNd&dccv}z6dw~67d3vwbLo%l)k0e0Pw#T@4v>I1)`-cIBb2$RA~y1mj8LR22N$S_ khN7V|r?GI~9@bbSr+d7o|MlM|xyqp7NR*V4;iB??01HV8D*ylh delta 13757 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 diff --git a/core/Cargo.toml b/core/Cargo.toml index 21e2028..d240b88 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -4,17 +4,10 @@ version = "0.1.0" edition = "2021" [dependencies] -entity = { path = "entity" } -migration = { path = "migration" } - +anyhow = "1.0.93" prost = "0.13.3" +sqlx = { version = "0.8.2", features = ["runtime-tokio", "sqlite"] } tonic = "0.12.3" -sea-orm = { version = "1.1.1", features = [ - "sqlx-sqlite", - "runtime-tokio-rustls", - "macros", -] } - [build-dependencies] tonic-build = "0.12.3" diff --git a/core/entity/Cargo.toml b/core/entity/Cargo.toml deleted file mode 100644 index 0955fbe..0000000 --- a/core/entity/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "entity" -version = "0.1.0" -edition = "2021" - -[dependencies] -sea-orm = { version = "1.1.1", features = [ - "sqlx-sqlite", - "runtime-tokio-rustls", - "macros", -] } diff --git a/core/entity/src/generated/mod.rs b/core/entity/src/generated/mod.rs deleted file mode 100644 index b21764a..0000000 --- a/core/entity/src/generated/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.1 - -pub mod prelude; - -pub mod node; diff --git a/core/entity/src/generated/node.rs b/core/entity/src/generated/node.rs deleted file mode 100644 index d994275..0000000 --- a/core/entity/src/generated/node.rs +++ /dev/null @@ -1,19 +0,0 @@ -//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.1 - -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] -#[sea_orm(table_name = "node")] -pub struct Model { - #[sea_orm(primary_key, auto_increment = false, column_type = "Text")] - pub id: String, - #[sea_orm(column_type = "custom(\"datetime\")")] - pub created_at: String, - #[sea_orm(column_type = "custom(\"datetime\")")] - pub updated_at: String, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/core/entity/src/generated/prelude.rs b/core/entity/src/generated/prelude.rs deleted file mode 100644 index 9e933c6..0000000 --- a/core/entity/src/generated/prelude.rs +++ /dev/null @@ -1,3 +0,0 @@ -//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.1 - -pub use super::node::Entity as Node; diff --git a/core/entity/src/lib.rs b/core/entity/src/lib.rs deleted file mode 100644 index 9829951..0000000 --- a/core/entity/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ -mod generated; diff --git a/core/migration/Cargo.toml b/core/migration/Cargo.toml deleted file mode 100644 index 08941dd..0000000 --- a/core/migration/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "migration" -version = "0.1.0" -edition = "2021" -publish = false - -[lib] -name = "migration" -path = "src/lib.rs" - -[dependencies] -async-std = { version = "1", features = ["attributes", "tokio1"] } - -[dependencies.sea-orm-migration] -version = "1.1.0" -features = ["sqlx-sqlite", "runtime-tokio-rustls"] diff --git a/core/migration/src/lib.rs b/core/migration/src/lib.rs deleted file mode 100644 index 3ae60b4..0000000 --- a/core/migration/src/lib.rs +++ /dev/null @@ -1,10 +0,0 @@ -pub use sea_orm_migration::prelude::*; - -pub struct Migrator; - -#[async_trait::async_trait] -impl MigratorTrait for Migrator { - fn migrations() -> Vec> { - vec![] - } -} diff --git a/core/migration/src/main.rs b/core/migration/src/main.rs deleted file mode 100644 index c6b6e48..0000000 --- a/core/migration/src/main.rs +++ /dev/null @@ -1,6 +0,0 @@ -use sea_orm_migration::prelude::*; - -#[async_std::main] -async fn main() { - cli::run_cli(migration::Migrator).await; -} diff --git a/core/migrations/20241125030145_initial.down.sql b/core/migrations/20241125030145_initial.down.sql new file mode 100644 index 0000000..d4ceac7 --- /dev/null +++ b/core/migrations/20241125030145_initial.down.sql @@ -0,0 +1,4 @@ +DROP TABLE "mail_message"; +DROP TABLE "mail_mailbox"; +DROP TABLE "mail_account"; +DROP TABLE "node"; \ No newline at end of file diff --git a/core/migrations/20241125030145_initial.up.sql b/core/migrations/20241125030145_initial.up.sql new file mode 100644 index 0000000..67ae8d0 --- /dev/null +++ b/core/migrations/20241125030145_initial.up.sql @@ -0,0 +1,41 @@ +CREATE TABLE "node" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT, + + "created_at" DATETIME NOT NULL, + "updated_at" DATETIME NOT NULL +); + +CREATE TABLE "mail_account" ( + "node_id" TEXT NOT NULL PRIMARY KEY, + + "imap_server_host" TEXT, + "imap_server_port" INT, + "imap_server_auth_method" TEXT, + "imap_server_auth_username" TEXT, + "imap_server_auth_password" TEXT, + + "smtp_server_host" TEXT, + "smtp_server_port" INT, + + FOREIGN KEY ("node_id") REFERENCES "node"("id") +); + +CREATE TABLE "mail_mailbox" ( + "node_id" TEXT NOT NULL PRIMARY KEY, + "mail_account_id" TEXT NOT NULL, + "name" TEXT NOT NULL, + + FOREIGN KEY ("node_id") REFERENCES "node"("id"), + FOREIGN KEY ("mail_account_id") REFERENCES "mail_account"("node_id") +); + +CREATE TABLE "maiL_message" ( + "node_id" TEXT NOT NULL PRIMARY KEY, + "mail_account_id" TEXT NOT NULL, + "mail_mailbox_id" TEXT NOT NULL, + + FOREIGN KEY ("node_id") REFERENCES "node"("id"), + FOREIGN KEY ("mail_account_id") REFERENCES "mail_account"("node_id") + FOREIGN KEY ("mail_mailbox_id") REFERENCES "mail_mailbox"("node_id") +); \ No newline at end of file diff --git a/core/src/dal.rs b/core/src/dal.rs index 121636e..764ea75 100644 --- a/core/src/dal.rs +++ b/core/src/dal.rs @@ -1,5 +1,15 @@ -pub struct PanoramaDatabase(); +use anyhow::Result; +use sqlx::SqlitePool; + +pub struct PanoramaDatabase(SqlitePool); + +pub struct EnsureMailAccount { + imap_server_host: String, + imap_server_port: u16, +} impl PanoramaDatabase { - async fn ensure_mail_account() {} + pub async fn ensure_mail_account(&self) -> Result<()> { + Ok(()) + } } diff --git a/package.json b/package.json index cb6d8aa..4f6ac16 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@iconify-json/mdi": "^1.2.1", "@iconify/json": "^2.2.267", "@iconify/svelte": "^4.0.2", + "@tanstack/svelte-query": "^5.61.3", "@tauri-apps/api": "^2", "@tauri-apps/plugin-shell": "^2", "@vanilla-extract/css": "^1.16.0", diff --git a/src/components/composite/sidebar/Sidebar.svelte b/src/components/composite/sidebar/Sidebar.svelte index 2de80dc..ebfcbb7 100644 --- a/src/components/composite/sidebar/Sidebar.svelte +++ b/src/components/composite/sidebar/Sidebar.svelte @@ -1,7 +1,4 @@

diff --git a/svelte.config.js b/svelte.config.js index 2d45f91..0e484bc 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -6,10 +6,11 @@ import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; /** @type {import('@sveltejs/kit').Config} */ const config = { - preprocess: vitePreprocess(), - kit: { - adapter: adapter(), - }, + preprocess: vitePreprocess(), + compilerOptions: { runes: true }, + kit: { + adapter: adapter(), + }, }; export default config;