feat(db): update db.rs to save url specific items and properties
This commit is contained in:
parent
ce1e93fc49
commit
bfded464c9
1 changed files with 68 additions and 3 deletions
71
src/db.rs
71
src/db.rs
|
@ -48,13 +48,22 @@ mod db_impl {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Insert a new URL into the database
|
||||||
|
pub async fn insert_url(&self, url: &str) -> Result<i64, Error> {
|
||||||
|
let conn = self.conn.lock().await;
|
||||||
|
let mut stmt = conn.prepare("INSERT INTO urls (url) VALUES (?)")?;
|
||||||
|
let url_id = stmt.insert(&[url])?;
|
||||||
|
logging::log!("URL inserted: {}", url);
|
||||||
|
Ok(url_id)
|
||||||
|
}
|
||||||
|
|
||||||
// Insert a new item into the database
|
// Insert a new item into the database
|
||||||
pub async fn insert_item(&self, item: &DbItem) -> Result<(), Error> {
|
pub async fn insert_item(&self, url_id: i64, item: &DbItem) -> Result<(), Error> {
|
||||||
let conn = self.conn.lock().await;
|
let conn = self.conn.lock().await;
|
||||||
let wikidata_id = item.wikidata_id.as_ref().map(|s| s.as_str()).unwrap_or("");
|
let wikidata_id = item.wikidata_id.as_ref().map(|s| s.as_str()).unwrap_or("");
|
||||||
conn.execute(
|
conn.execute(
|
||||||
"INSERT INTO items (id, name, description, wikidata_id, custom_properties)
|
"INSERT INTO items (id, name, description, wikidata_id, custom_properties, url_id)
|
||||||
VALUES (?, ?, ?, ?, ?)
|
VALUES (?, ?, ?, ?, ?, ?)
|
||||||
ON CONFLICT(id) DO UPDATE SET
|
ON CONFLICT(id) DO UPDATE SET
|
||||||
name = excluded.name,
|
name = excluded.name,
|
||||||
description = excluded.description,
|
description = excluded.description,
|
||||||
|
@ -66,6 +75,7 @@ mod db_impl {
|
||||||
&item.description,
|
&item.description,
|
||||||
&wikidata_id.to_string(),
|
&wikidata_id.to_string(),
|
||||||
&item.custom_properties,
|
&item.custom_properties,
|
||||||
|
&url_id.to_string(),
|
||||||
],
|
],
|
||||||
)?;
|
)?;
|
||||||
logging::log!("Item inserted: {}", item.id);
|
logging::log!("Item inserted: {}", item.id);
|
||||||
|
@ -107,6 +117,61 @@ mod db_impl {
|
||||||
logging::log!("Fetched {} items from the database", result.len()); // Log with Leptos
|
logging::log!("Fetched {} items from the database", result.len()); // Log with Leptos
|
||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retrieve all items from the database for a specific URL
|
||||||
|
pub async fn get_items_by_url(&self, url: &str) -> Result<Vec<DbItem>, Error> {
|
||||||
|
let conn = self.conn.lock().await;
|
||||||
|
let url_id: i64 = conn.query_row("SELECT id FROM urls WHERE url = ?", &[url], |row| row.get(0))?;
|
||||||
|
let mut stmt = conn.prepare("SELECT * FROM items WHERE url_id = ?")?;
|
||||||
|
let items = stmt.query_map(&[&url_id], |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?);
|
||||||
|
}
|
||||||
|
logging::log!("Fetched {} items from the database for URL: {}", result.len(), url);
|
||||||
|
Ok(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert a new item into the database for a specific URL
|
||||||
|
pub async fn insert_item_by_url(&self, url: &str, item: &DbItem) -> Result<(), Error> {
|
||||||
|
let conn = self.conn.lock().await;
|
||||||
|
let url_id: i64 = conn.query_row("SELECT id FROM urls WHERE url = ?", &[url], |row| row.get(0))?;
|
||||||
|
if url_id == 0 {
|
||||||
|
let url_id = self.insert_url(url).await?;
|
||||||
|
self.insert_item(url_id, item).await?;
|
||||||
|
} else {
|
||||||
|
self.insert_item(url_id, item).await?;
|
||||||
|
}
|
||||||
|
logging::log!("Item inserted into the database for URL: {}", url);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete an item from the database for a specific URL
|
||||||
|
pub async fn delete_item_by_url(&self, url: &str, item_id: &str) -> Result<(), Error> {
|
||||||
|
let conn = self.conn.lock().await;
|
||||||
|
let url_id: i64 = conn.query_row("SELECT id FROM urls WHERE url = ?", &[url], |row| row.get(0))?;
|
||||||
|
conn.execute("DELETE FROM items WHERE id = ? AND url_id = ?", &[item_id, &url_id.to_string()])?;
|
||||||
|
logging::log!("Item deleted from the database for URL: {}", url);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete a property from the database for a specific URL
|
||||||
|
pub async fn delete_property_by_url(&self, url: &str, property: &str) -> Result<(), Error> {
|
||||||
|
let conn = self.conn.lock().await;
|
||||||
|
let url_id: i64 = conn.query_row("SELECT id FROM urls WHERE url = ?", &[url], |row| row.get(0))?;
|
||||||
|
let query = format!("UPDATE items SET custom_properties = json_remove(custom_properties, '$.{}') WHERE url_id = ?", property);
|
||||||
|
conn.execute(&query, &[&url_id.to_string()])?;
|
||||||
|
logging::log!("Property deleted from the database for URL: {}", url);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define a struct to represent an item in the database
|
// Define a struct to represent an item in the database
|
||||||
|
|
Loading…
Add table
Reference in a new issue