From a47d6b2e3af0a270576618f02c05593c101fd807 Mon Sep 17 00:00:00 2001 From: ryan Date: Tue, 25 Feb 2025 16:47:58 +0300 Subject: [PATCH] fix(db): fix property and item deletion --- src/api.rs | 26 +++++---- src/components/items_list.rs | 103 +++++++++++++++++++++-------------- src/db.rs | 61 ++++++++++++++------- src/main.rs | 4 +- 4 files changed, 118 insertions(+), 76 deletions(-) diff --git a/src/api.rs b/src/api.rs index 67e60ef..bdb253d 100644 --- a/src/api.rs +++ b/src/api.rs @@ -74,15 +74,16 @@ pub async fn create_item( #[cfg(feature = "ssr")] pub async fn delete_item( db: web::Data>>, - url: web::Query, - item_id: web::Path, + path: web::Path<(String, String)>, // (url, item_id) ) -> HttpResponse { + let (url, item_id) = path.into_inner(); + log!("[API] Deleting item {} from URL {}", item_id, url); let db = db.lock().await; match db.delete_item_by_url(&url, &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") + Ok(_) => HttpResponse::Ok().finish(), + Err(e) => { + log!("[API] Delete error: {:?}", e); + HttpResponse::InternalServerError().body(e.to_string()) } } } @@ -90,15 +91,16 @@ pub async fn delete_item( #[cfg(feature = "ssr")] pub async fn delete_property( db: web::Data>>, - url: web::Query, - property: web::Path, + path: web::Path<(String, String)>, // (url, property) ) -> HttpResponse { + let (url, property) = path.into_inner(); + log!("[API] Deleting property {} from URL {}", property, url); let db = db.lock().await; match db.delete_property_by_url(&url, &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") + Ok(_) => HttpResponse::Ok().finish(), + Err(e) => { + log!("[API] Delete error: {:?}", e); + HttpResponse::InternalServerError().body(e.to_string()) } } } diff --git a/src/components/items_list.rs b/src/components/items_list.rs index 4451c3d..03cb121 100644 --- a/src/components/items_list.rs +++ b/src/components/items_list.rs @@ -223,57 +223,75 @@ pub fn ItemsList( } } + let current_url_for_remove_item = Rc::clone(¤t_url); // Function to 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)) + let remove_item = { + let set_items = set_items.clone(); + move |index: usize| { + let item_id = items.get()[index].id.clone(); + let current_url = Rc::clone(¤t_url_for_remove_item); + spawn_local(async move { + let response = gloo_net::http::Request::delete( + &format!("/api/urls/{}/items/{}", encode(¤t_url), 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()); + + 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), } - Err(err) => log!("Failed to delete item: {:?}", err), - } - }); + }); + } }; + let current_url_for_remove_property = Rc::clone(¤t_url); // Function to remove a property - let remove_property = move |property: String| { - spawn_local(async move { - let response = gloo_net::http::Request::delete(&format!("/api/properties/{}", property)) + let remove_property = { + let set_custom_properties = set_custom_properties.clone(); + let set_selected_properties = set_selected_properties.clone(); + let set_items = set_items.clone(); + move |property: String| { + let current_url = Rc::clone(¤t_url_for_remove_property); + spawn_local(async move { + let response = gloo_net::http::Request::delete( + &format!("/api/urls/{}/properties/{}", encode(¤t_url), 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()); + + 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), } - Err(err) => log!("Failed to delete property: {:?}", err), - } - }); + }); + } }; // State to store Wikidata suggestions @@ -596,9 +614,10 @@ pub fn ItemsList( { "Property" } {move || items.get().iter().enumerate().map(|(index, item)| { + let remove_item = remove_item.clone(); view! { - { item.name.clone() } + {item.name.clone()} } @@ -753,7 +772,9 @@ pub fn ItemsList( move || { let update_item = Arc::clone(&update_item_outer); let custom_props = custom_properties.get().clone(); + let remove_property = remove_property.clone(); custom_props.into_iter().map(move |property| { + let remove_property_clone = remove_property.clone(); let update_item_inner = Arc::clone(&update_item); let normalized_property = property.replace("http://www.wikidata.org/prop/", ""); let property_label = property_labels.get().get(&normalized_property).cloned().unwrap_or_else(|| normalized_property.clone()); @@ -765,7 +786,7 @@ pub fn ItemsList( { property_label }