diff --git a/crates/app/src/public/html/economy/edit.lisp b/crates/app/src/public/html/economy/edit.lisp index ec94f12..356eeb3 100644 --- a/crates/app/src/public/html/economy/edit.lisp +++ b/crates/app/src/public/html/economy/edit.lisp @@ -180,11 +180,19 @@ (text "{% if product.method != \"ManualMail\" -%} {{ product.method.AutoMail }} {%- endif %}"))) (button (str (text "general:action.save"))))) - (a - ("class" "button secondary") - ("href" "/product/{{ product.id }}") - (icon (text "arrow-left")) - (str (text "general:action.back")))) + (div + ("class" "flex gap_2") + (a + ("class" "button secondary") + ("href" "/product/{{ product.id }}") + (icon (text "arrow-left")) + (str (text "general:action.back"))) + + (button + ("class" "lowered red") + ("onclick" "delete_product()") + (icon (text "trash")) + (str (text "general:action.delete"))))) (script (text "async function update_title_from_form(e) { @@ -339,6 +347,27 @@ }); } + async function delete_product() { + if ( + !(await trigger(\"atto::confirm\", [ + \"Are you sure you would like to do this?\", + ])) + ) { + return; + } + + fetch(\"/api/v1/products/{{ product.id }}\", { + method: \"DELETE\", + }) + .then((res) => res.json()) + .then((res) => { + trigger(\"atto::toast\", [ + res.ok ? \"success\" : \"error\", + res.message, + ]); + }); + }; + globalThis.mirror_use_automail = () => { const use_automail = document.getElementById(\"use_automail\").checked; diff --git a/crates/app/src/routes/api/v1/products.rs b/crates/app/src/routes/api/v1/products.rs index 71bc962..424ae6d 100644 --- a/crates/app/src/routes/api/v1/products.rs +++ b/crates/app/src/routes/api/v1/products.rs @@ -174,7 +174,7 @@ pub async fn update_price_request( None => return Json(Error::NotAllowed.into()), }; - if req.price < 25 { + if req.price < 25 && req.price != 0 { return Json( Error::MiscError( "Price is too low, please use a price of 25 coins or more".to_string(), diff --git a/crates/core/src/database/products.rs b/crates/core/src/database/products.rs index f888e07..9137bc3 100644 --- a/crates/core/src/database/products.rs +++ b/crates/core/src/database/products.rs @@ -58,7 +58,7 @@ impl DataManager { Ok(res.unwrap()) } - const MAXIMUM_FREE_PRODUCTS: usize = 5; + const MAXIMUM_FREE_PRODUCTS: usize = 10; /// Create a new product in the database. /// diff --git a/crates/core/src/database/transfers.rs b/crates/core/src/database/transfers.rs index 3668695..0226c6b 100644 --- a/crates/core/src/database/transfers.rs +++ b/crates/core/src/database/transfers.rs @@ -54,13 +54,17 @@ impl DataManager { match transfer.method { CoinTransferMethod::Transfer => None, CoinTransferMethod::Purchase(id) => { - Some(if let Some(product) = seen_products.get(&id) { - product.to_owned() + if let Some(product) = seen_products.get(&id) { + Some(product.to_owned()) } else { - let product = self.get_product_by_id(id).await?; - seen_products.insert(product.id, product.clone()); - product - }) + match self.get_product_by_id(id).await { + Ok(product) => { + seen_products.insert(product.id, product.clone()); + Some(product) + } + Err(_) => None, + } + } } }, transfer.is_pending,