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,