From 68b458df5ea40226c7f9993c063dbdcdcb6d457d Mon Sep 17 00:00:00 2001 From: ryan Date: Tue, 28 Jan 2025 14:36:17 +0300 Subject: [PATCH] feat(db): enable user to delete items and properties from the database. --- src/api.rs | 30 ++++++++++++++++++ src/components/items_list.rs | 61 +++++++++++++++++++++++++++++++----- src/db.rs | 15 +++++++++ src/main.rs | 8 +++-- 4 files changed, 103 insertions(+), 11 deletions(-) diff --git a/src/api.rs b/src/api.rs index 4ef7ea3..de3d6b7 100644 --- a/src/api.rs +++ b/src/api.rs @@ -32,4 +32,34 @@ pub async fn create_item( HttpResponse::InternalServerError().body("Failed to insert item") } } +} + +#[cfg(feature = "ssr")] +pub async fn delete_item( + db: web::Data>>, + item_id: web::Path, +) -> HttpResponse { + let db = db.lock().await; + match db.delete_item(&item_id).await { + Ok(_) => HttpResponse::Ok().body("Item deleted"), + Err(err) => { + leptos::logging::error!("Failed to delete item: {:?}", err); + HttpResponse::InternalServerError().body("Failed to delete item") + } + } +} + +#[cfg(feature = "ssr")] +pub async fn delete_property( + db: web::Data>>, + property: web::Path, +) -> HttpResponse { + let db = db.lock().await; + match db.delete_property(&property).await { + Ok(_) => HttpResponse::Ok().body("Property deleted"), + Err(err) => { + leptos::logging::error!("Failed to delete property: {:?}", err); + HttpResponse::InternalServerError().body("Failed to delete property") + } + } } \ No newline at end of file diff --git a/src/components/items_list.rs b/src/components/items_list.rs index ed1bf86..51dcc6c 100644 --- a/src/components/items_list.rs +++ b/src/components/items_list.rs @@ -203,6 +203,58 @@ pub fn ItemsList( } } + // remove an item + let remove_item = move |index: usize| { + let item_id = items.get()[index].id.clone(); + spawn_local(async move { + let response = gloo_net::http::Request::delete(&format!("/api/items/{}", item_id)) + .send() + .await; + match response { + Ok(resp) => { + if resp.status() == 200 { + set_items.update(|items| { + items.remove(index); + }); + log!("Item deleted: {}", item_id); + } else { + log!("Failed to delete item: {}", resp.status_text()); + } + } + Err(err) => log!("Failed to delete item: {:?}", err), + } + }); + }; + + let remove_property = move |property: String| { + spawn_local(async move { + let response = gloo_net::http::Request::delete(&format!("/api/properties/{}", property)) + .send() + .await; + match response { + Ok(resp) => { + if resp.status() == 200 { + set_custom_properties.update(|props| { + props.retain(|p| p != &property); + }); + set_selected_properties.update(|selected| { + selected.remove(&property); + }); + set_items.update(|items| { + for item in items { + item.custom_properties.remove(&property); + } + }); + log!("Property deleted: {}", property); + } else { + log!("Failed to delete property: {}", resp.status_text()); + } + } + Err(err) => log!("Failed to delete property: {:?}", err), + } + }); + }; + let (wikidata_suggestions, set_wikidata_suggestions) = create_signal(HashMap::>::new()); // Fetch Wikidata suggestions @@ -432,14 +484,6 @@ pub fn ItemsList( }); }; - - // Remove an item - let remove_item = move |index: usize| { - set_items.update(|items| { - items.remove(index); - }); - }; - // List of properties to display as rows let properties = vec!["Name", "Description", "Actions"]; @@ -616,6 +660,7 @@ pub fn ItemsList( { property_label }