diff --git a/Cargo.lock b/Cargo.lock index 9f44832..0603176 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags", + "bitflags 2.6.0", "bytes", "futures-core", "futures-sink", @@ -29,7 +29,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web", - "bitflags", + "bitflags 2.6.0", "bytes", "derive_more", "futures-core", @@ -52,9 +52,9 @@ dependencies = [ "actix-rt", "actix-service", "actix-utils", - "ahash", + "ahash 0.8.11", "base64", - "bitflags", + "bitflags 2.6.0", "brotli", "bytes", "bytestring", @@ -169,7 +169,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web-codegen", - "ahash", + "ahash 0.8.11", "bytes", "bytestring", "cfg-if", @@ -233,6 +233,17 @@ dependencies = [ "generic-array", ] +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.11" @@ -510,6 +521,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.6.0" @@ -730,6 +747,7 @@ dependencies = [ "leptos_meta", "leptos_router", "nostr-sdk", + "rusqlite", "secp256k1 0.30.0", "serde", "serde_json", @@ -982,6 +1000,18 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + [[package]] name = "flate2" version = "1.0.35" @@ -1227,6 +1257,15 @@ dependencies = [ "crunchy", ] +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash 0.7.8", +] + [[package]] name = "hashbrown" version = "0.13.2" @@ -1239,7 +1278,7 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash", + "ahash 0.8.11", "allocator-api2", ] @@ -1254,6 +1293,15 @@ dependencies = [ "foldhash", ] +[[package]] +name = "hashlink" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" +dependencies = [ + "hashbrown 0.11.2", +] + [[package]] name = "hex-conservative" version = "0.1.2" @@ -1810,6 +1858,16 @@ version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" +[[package]] +name = "libsqlite3-sys" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14" +dependencies = [ + "pkg-config", + "vcpkg", +] + [[package]] name = "linear-map" version = "1.2.0" @@ -2380,7 +2438,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags", + "bitflags 2.6.0", ] [[package]] @@ -2447,6 +2505,21 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "rusqlite" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85127183a999f7db96d1a976a309eebbfb6ea3b0b400ddd8340190129de6eb7a" +dependencies = [ + "bitflags 1.3.2", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "memchr", + "smallvec", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -3284,6 +3357,12 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" diff --git a/Cargo.toml b/Cargo.toml index d5a1264..1da56b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,7 @@ leptos_meta = { version = "0.6" } leptos_actix = { version = "0.6", optional = true } leptos_router = { version = "0.6" } wasm-bindgen = "=0.2.99" +rusqlite = "0.27.0" serde = { version = "1.0", features = ["derive"] } uuid = { version = "1.0", features = ["v4"] } web-sys = { version = "0.3", features = ["Event"] } diff --git a/src/db.rs b/src/db.rs new file mode 100644 index 0000000..6e72ec3 --- /dev/null +++ b/src/db.rs @@ -0,0 +1,69 @@ +use rusqlite::{Connection, Error}; +use serde::{Deserialize, Serialize}; + +// Define a struct to represent a database connection +#[derive(Debug)] +pub struct Database { + conn: Connection, +} + +impl Database { + // Create a new database connection + pub fn new(db_path: &str) -> Result { + let conn = Connection::open(db_path)?; + Ok(Database { conn }) + } + + // Create the database schema + pub fn create_schema(&self) -> Result<(), Error> { + self.conn.execute_batch(" + CREATE TABLE IF NOT EXISTS items ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + description TEXT, + wikidata_id TEXT, + custom_properties TEXT + ); + ")?; + Ok(()) + } + + // Insert a new item into the database + pub fn insert_item(&self, item: &DbItem) -> Result<(), Error> { + let wikidata_id = item.wikidata_id.as_ref().map(|s| s.as_str()).unwrap_or(""); + self.conn.execute( + "INSERT INTO items (id, name, description, wikidata_id, custom_properties) VALUES (?, ?, ?, ?, ?);", + &[&item.id, &item.name, &item.description, &wikidata_id.to_string(), &item.custom_properties], + )?; + Ok(()) + } + + // Retrieve all items from the database + pub fn get_items(&self) -> Result, Error> { + let mut stmt = self.conn.prepare("SELECT * FROM items;")?; + let items = stmt.query_map([], |row| { + Ok(DbItem { + id: row.get(0)?, + name: row.get(1)?, + description: row.get(2)?, + wikidata_id: row.get(3)?, + custom_properties: row.get(4)?, + }) + })?; + let mut result = Vec::new(); + for item in items { + result.push(item?); + } + Ok(result) + } +} + +// Define a struct to represent an item in the database +#[derive(Debug, Deserialize, Serialize)] +pub struct DbItem { + pub id: String, + pub name: String, + pub description: String, + pub wikidata_id: Option, + pub custom_properties: String, +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 10f7ef7..9f00436 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,7 @@ pub mod app; pub mod components; pub mod models; pub mod nostr; +pub mod db; #[cfg(feature = "hydrate")] diff --git a/src/models/item.rs b/src/models/item.rs index 9af23ad..11c796b 100644 --- a/src/models/item.rs +++ b/src/models/item.rs @@ -7,7 +7,7 @@ pub struct Item { pub id: String, pub name: String, pub description: String, - pub reviews: Vec, + // pub reviews: Vec, pub wikidata_id: Option, pub custom_properties: HashMap, }