From b4255ef2d5e32157e885e6e84d82f2bbddf9c82e Mon Sep 17 00:00:00 2001 From: 4aiman Date: Sun, 31 May 2026 00:48:23 +0300 Subject: [PATCH] Block product deletion if used in food log or recipes --- frontend/js/db.js | 10 +++++++--- frontend/js/main.js | 5 +++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/frontend/js/db.js b/frontend/js/db.js index c0b52f8..95140a0 100644 --- a/frontend/js/db.js +++ b/frontend/js/db.js @@ -162,10 +162,13 @@ async function addProduct(p) { return rows[0]?.id; } +async function getProductRefs(id) { + const food = await select("SELECT COUNT(*) as cnt FROM food_log WHERE product_id = ?1", [id]); + const recipes = await select("SELECT COUNT(*) as cnt FROM recipe_ingredients WHERE product_id = ?1", [id]); + return { food: food[0]?.cnt || 0, recipes: recipes[0]?.cnt || 0 }; +} + async function deleteProduct(id) { - // Reassign food_log and recipe_ingredients to avoid orphaned references - await execute("UPDATE food_log SET product_id = NULL WHERE product_id = ?1", [id]); - await execute("UPDATE recipe_ingredients SET product_id = 0 WHERE product_id = ?1", [id]); await execute("DELETE FROM products WHERE id = ?1", [id]); } @@ -906,6 +909,7 @@ window.DB.searchProducts = searchProducts; window.DB.getProduct = getProduct; window.DB.addProduct = addProduct; window.DB.deleteProduct = deleteProduct; +window.DB.getProductRefs = getProductRefs; window.DB.getFoodForDate = getFoodForDate; window.DB.addFoodManual = addFoodManual; window.DB.addFoodEntry = addFoodEntry; diff --git a/frontend/js/main.js b/frontend/js/main.js index 96c8743..47c14d6 100644 --- a/frontend/js/main.js +++ b/frontend/js/main.js @@ -1326,6 +1326,11 @@ async function renderProducts(container) { btn.onclick = async e => { e.stopPropagation(); const pid = parseInt(btn.dataset.pid); + const refs = await DB.getProductRefs(pid); + if (refs.food > 0 || refs.recipes > 0) { + alert(`Нельзя удалить: продукт используется в ${refs.food ? refs.food + " записях еды" : ""}${refs.food && refs.recipes ? " и " : ""}${refs.recipes ? refs.recipes + " рецептах" : ""}`); + return; + } await DB.deleteProduct(pid); doSearch(false); };