diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..8f66ce7 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +DATABASE_URL=./aperture.db diff --git a/.gitignore b/.gitignore index b2ab7dc..a4a44c0 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,6 @@ devenv.local.yaml .pre-commit-config.yaml node_modules/ + +.env* +!.env.example \ No newline at end of file diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index b0c4326..5264d98 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -51,6 +51,8 @@ checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" name = "aperture" version = "0.1.0" dependencies = [ + "diesel", + "dotenvy", "serde", "serde_json", "tauri", @@ -627,14 +629,38 @@ version = "0.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + [[package]] name = "darling" version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.23.0", + "darling_macro 0.23.0", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.118", ] [[package]] @@ -650,13 +676,24 @@ dependencies = [ "syn 2.0.118", ] +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", + "quote", + "syn 2.0.118", +] + [[package]] name = "darling_macro" version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ - "darling_core", + "darling_core 0.23.0", "quote", "syn 2.0.118", ] @@ -702,6 +739,41 @@ dependencies = [ "syn 2.0.118", ] +[[package]] +name = "diesel" +version = "2.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29fe29a87fb84c631ffb3ba21798c4b1f3a964701ba78f0dce4bf8668562ec88" +dependencies = [ + "diesel_derives", + "downcast-rs", + "libsqlite3-sys", + "sqlite-wasm-rs", + "time", +] + +[[package]] +name = "diesel_derives" +version = "2.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1817b7f4279b947fc4cafddec12b0e5f8727141706561ce3ac94a60bddd1cf5" +dependencies = [ + "diesel_table_macro_syntax", + "dsl_auto_type", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "diesel_table_macro_syntax" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe2444076b48641147115697648dc743c2c00b61adade0f01ce67133c7babe8c" +dependencies = [ + "syn 2.0.118", +] + [[package]] name = "digest" version = "0.10.7" @@ -794,6 +866,18 @@ dependencies = [ "tendril", ] +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "downcast-rs" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" + [[package]] name = "dpi" version = "0.1.2" @@ -803,6 +887,20 @@ dependencies = [ "serde", ] +[[package]] +name = "dsl_auto_type" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd122633e4bef06db27737f21d3738fb89c8f6d5360d6d9d7635dda142a7757e" +dependencies = [ + "darling 0.21.3", + "either", + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.118", +] + [[package]] name = "dtoa" version = "1.0.11" @@ -845,6 +943,12 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + [[package]] name = "embed-resource" version = "3.0.9" @@ -1410,6 +1514,15 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash", +] + [[package]] name = "hashbrown" version = "0.17.1" @@ -1907,6 +2020,16 @@ dependencies = [ "libc", ] +[[package]] +name = "libsqlite3-sys" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f111c8c41e7c61a49cd34e44c7619462967221a6443b0ec299e0ac30cfb9b1" +dependencies = [ + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -2721,6 +2844,16 @@ dependencies = [ "web-sys", ] +[[package]] +name = "rsqlite-vfs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51c9ae4df8a7fba42103df5c621fa3c37eccf3a3c650879e90fc48b11cc192c" +dependencies = [ + "hashbrown 0.16.1", + "thiserror 2.0.18", +] + [[package]] name = "rustc-hash" version = "2.1.2" @@ -2971,7 +3104,7 @@ version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" dependencies = [ - "darling", + "darling 0.23.0", "proc-macro2", "quote", "syn 2.0.118", @@ -3117,6 +3250,18 @@ dependencies = [ "system-deps", ] +[[package]] +name = "sqlite-wasm-rs" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc3efc0da82635d7e1ced0053bbbfa8c7ab9645d0bf36ceb4f7127bb85315d75" +dependencies = [ + "cc", + "js-sys", + "rsqlite-vfs", + "wasm-bindgen", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -4020,6 +4165,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version-compare" version = "0.2.1" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 16d5365..1cdd826 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -22,4 +22,8 @@ tauri = { version = "2", features = [] } tauri-plugin-opener = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" - +diesel = { version = "2.3.10", features = [ + "sqlite", + "returning_clauses_for_sqlite_3_35", +] } +dotenvy = "0.15.7" diff --git a/src-tauri/aperture.db b/src-tauri/aperture.db new file mode 100644 index 0000000..ef3acb9 Binary files /dev/null and b/src-tauri/aperture.db differ diff --git a/src-tauri/diesel.toml b/src-tauri/diesel.toml new file mode 100644 index 0000000..bb1d1f7 --- /dev/null +++ b/src-tauri/diesel.toml @@ -0,0 +1,9 @@ +# For documentation on how to configure this file, +# see https://diesel.rs/guides/configuring-diesel-cli + +[print_schema] +file = "src/db/schema.rs" +custom_type_derives = ["diesel::query_builder::QueryId", "Clone"] + +[migrations_directory] +dir = "migrations" diff --git a/src-tauri/migrations/.diesel_lock b/src-tauri/migrations/.diesel_lock new file mode 100644 index 0000000..e69de29 diff --git a/src-tauri/migrations/.keep b/src-tauri/migrations/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src-tauri/migrations/2026-06-26-175401-0000_create_databases/down.sql b/src-tauri/migrations/2026-06-26-175401-0000_create_databases/down.sql new file mode 100644 index 0000000..04f2b90 --- /dev/null +++ b/src-tauri/migrations/2026-06-26-175401-0000_create_databases/down.sql @@ -0,0 +1,5 @@ +DROP INDEX IF EXISTS idx_blogs_reference; + +DROP TABLE IF EXISTS blog; +DROP TABLE IF EXISTS identities; +DROP TABLE IF EXISTS app; \ No newline at end of file diff --git a/src-tauri/migrations/2026-06-26-175401-0000_create_databases/up.sql b/src-tauri/migrations/2026-06-26-175401-0000_create_databases/up.sql new file mode 100644 index 0000000..b3c8bd2 --- /dev/null +++ b/src-tauri/migrations/2026-06-26-175401-0000_create_databases/up.sql @@ -0,0 +1,28 @@ +CREATE TABLE app ( + id TEXT PRIMARY KEY NOT NULL, + name TEXT NOT NULL, + description TEXT, + address TEXT NOT NULL, + ssh_address TEXT +); + +-- Create blogs table +CREATE TABLE blog ( + id TEXT PRIMARY KEY NOT NULL, + title TEXT NOT NULL, + content TEXT NOT NULL, + reference TEXT, + FOREIGN KEY (reference) REFERENCES app(id) +); + +-- Create identites table +CREATE TABLE identities ( + id TEXT PRIMARY KEY NOT NULL, + common_name TEXT NOT NULL, + username TEXT NOT NULL, + public_key TEXT NOT NULL, + private_key TEXT NOT NULL +); + +-- Create index for foreign key relationship +CREATE INDEX idx_blogs_reference ON blog(reference); \ No newline at end of file diff --git a/src-tauri/src/db/mod.rs b/src-tauri/src/db/mod.rs new file mode 100644 index 0000000..07465e5 --- /dev/null +++ b/src-tauri/src/db/mod.rs @@ -0,0 +1,14 @@ +use diesel::prelude::*; +use dotenvy::dotenv; +use std::env; + +pub mod models; +pub mod schema; + +pub fn establish_connection() -> SqliteConnection { + dotenv().ok(); + + let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); + SqliteConnection::establish(&database_url) + .unwrap_or_else(|_| panic!("Error connecting to {}", database_url)) +} diff --git a/src-tauri/src/db/models.rs b/src-tauri/src/db/models.rs new file mode 100644 index 0000000..204f4a9 --- /dev/null +++ b/src-tauri/src/db/models.rs @@ -0,0 +1,33 @@ +use diesel::prelude::*; + +#[derive(Queryable, Selectable)] +#[diesel(table_name = crate::db::schema::app)] +#[diesel(check_for_backend(diesel::sqlite::Sqlite))] +pub struct App { + pub id: String, // uuid + pub name: String, + pub description: Option, + pub address: String, + pub ssh_address: Option, // default to normal address +} + +#[derive(Queryable, Selectable)] +#[diesel(table_name = crate::db::schema::blog)] +#[diesel(check_for_backend(diesel::sqlite::Sqlite))] +pub struct Blog { + pub id: String, // uuid + pub title: String, + pub content: String, + pub reference: Option, // uuid +} + +#[derive(Queryable, Selectable)] +#[diesel(table_name = crate::db::schema::identities)] +#[diesel(check_for_backend(diesel::sqlite::Sqlite))] +pub struct Identity { + pub id: String, // uuid + pub common_name: String, + pub username: String, + pub public_key: String, + pub private_key: String, +} diff --git a/src-tauri/src/db/schema.rs b/src-tauri/src/db/schema.rs new file mode 100644 index 0000000..ce6ba86 --- /dev/null +++ b/src-tauri/src/db/schema.rs @@ -0,0 +1,34 @@ +// @generated automatically by Diesel CLI. + +diesel::table! { + app (id) { + id -> Text, + name -> Text, + description -> Nullable, + address -> Text, + ssh_address -> Nullable, + } +} + +diesel::table! { + blog (id) { + id -> Text, + title -> Text, + content -> Text, + reference -> Nullable, + } +} + +diesel::table! { + identities (id) { + id -> Text, + common_name -> Text, + username -> Text, + public_key -> Text, + private_key -> Text, + } +} + +diesel::joinable!(blog -> app (reference)); + +diesel::allow_tables_to_appear_in_same_query!(app, blog, identities,); diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 4a277ef..c2f1a51 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,3 +1,5 @@ +mod db; + // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ #[tauri::command] fn greet(name: &str) -> String { diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index ba9cf59..c9967c5 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,6 +1,6 @@ { "$schema": "https://schema.tauri.app/config/2", - "productName": "aperture", + "productName": "Aperture", "version": "0.1.0", "identifier": "org.maariz.aperture", "build": { @@ -12,7 +12,7 @@ "app": { "windows": [ { - "title": "aperture", + "title": "Aperture", "width": 800, "height": 600 }